node+Express+MySQL+Layui+阿里云短信服务实现账户注册,登录,重置之账户注册篇

效果图

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

开通阿里云短信服务

登录阿里云官网开通阿里云短信服务即可,这里不做详细说明。

node引入阿里云相关服务组件

// 引入Express框架
const express = require('express');
// 引入body-parser中间件,用于解析请求体中的JSON数据
const bodyParser = require('body-parser');
// 引入阿里云短信服务SDK
const Dysmsapi20170525 = require('@alicloud/dysmsapi20170525');
// 引入阿里云OpenAPI客户端基础库
const OpenApi = require('@alicloud/openapi-client');
// 引入阿里云SDK工具库,用于处理请求的签名等
const Util = require('@alicloud/tea-util');

执行npm安装对应的组件

npm install express
npm install body-parser
npm install @alicloud/dysmsapi20170525
npm install @alicloud/openapi-client
npm install @alicloud/tea-util

开始编写短信服务的工具类

图片中对应的改成你自己的相关信息即可

我这里定义的工具类是api.js

// 引入Express框架
const express = require('express');
// 引入body-parser中间件,用于解析请求体中的JSON数据
const bodyParser = require('body-parser');
// 引入阿里云短信服务SDK
const Dysmsapi20170525 = require('@alicloud/dysmsapi20170525');
// 引入阿里云OpenAPI客户端基础库
const OpenApi = require('@alicloud/openapi-client');
// 引入阿里云SDK工具库,用于处理请求的签名等
const Util = require('@alicloud/tea-util');
// 创建Express路由处理器
const router = express.Router();

// 配置阿里云短信服务所需的密钥和区域信息
const accessKeyId = '你自己的keyID';
const accessKeySecret = '你自己的密钥';
const regionId = 'cn-hangzhou';// 设置区域ID
// 定义短信签名,展示在短信前面,用以标识发送方
const signName = '改成你自己的短信签名'; //****
// 定义使用的短信模板ID
const templateCode = '你自己的短信模板code';

// 定义一个SMSClient类来封装发送短信的逻辑
class SMSClient {
   
  // 发送验证码的异步方法
  static async sendCode(phoneNumber, randomCode) {
   
    // 初始化OpenAPI配置,包括访问密钥
    const config = new OpenApi.Config({
   
      accessKeyId,
      accessKeySecret
    });
    // 设置API服务端点
    config.endpoint = 'dysmsapi.aliyuncs.com';
    
    // 创建Dysmsapi20170525客户端实例
    const client = new Dysmsapi20170525.default(config);
    // 打印调试信息
    console.log(phoneNumber, signName, templateCode, randomCode);
    
    // 构建发送短信的请求对象
    const request = new Dysmsapi20170525.SendSmsRequest({
   
      RegionId: regionId, // 指定地区
      phoneNumbers: phoneNumber, // 目标手机号
      signName: signName, // 使用的短信签名
      templateCode: templateCode, // 使用的短信模板ID
      templateParam: `{\"code\":\"${
     randomCode}\"}`, // 模板参数,动态插入验证码
    });

    try {
   
      // 设置运行时选项,发送短信请求
      const runtime = new Util.RuntimeOptions({
   });
      const resp = await client.sendSmsWithOptions(request, runtime);
      console.log('短信发送成功', resp);
      // 返回成功的响应
      return {
    success: true, message: '短信发送成功' };
    } catch (error) {
   
      // 记录错误并返回发送失败的响应
      console.error('短信发送失败', error);
      return {
    success: false, message: '短信发送失败' };
    }
  }
}

// 定义一个POST路由,用于接收发送验证码的请求
router.post('/sendCode', async (req, res) => {
   
  // 从请求体中获取手机号
  const phoneNumber = req.body.phoneNumber;
  // 生成一个六位数的随机验证码
  const randomCode = Math.floor(100000 + Math.random() * 900000).toString();
  // console.log('phoneNumber:', phoneNumber);// 打印调试信息
  // console.log('randomCode:', randomCode);// 打印调试信息
  try {
   
    // 调用SMSClient发送验证码
    const response = await SMSClient.sendCode(phoneNumber, randomCode);
    storeVerificationCode(phoneNumber, randomCode);
    // 将响应结果返回给前端
    res.json(response);
  } catch (error) {
   
    // 如果有异常,返回500状态码和错误信息
    res.status(500).json({
    error: '服务器错误' });
  }
});

//定义一个方法来暂存验证码用于注册验证,验证码有效期为5分钟
const cache = {
   };
// 暂存验证码的方法
function storeVerificationCode(phoneNumber, verificationCode, expirationTime = 5 * 60 * 1000) {
    // 默认有效期5分钟
  //调试打印手机号及验证码
  console.log('phoneNumber:', phoneNumber);
  console.log('verificationCode:', verificationCode);
  // 生成验证码过期时间戳
  const expiresAt = Date.now() + expirationTime;
  // 将验证码及其过期时间存入内存对象
  cache[phoneNumber] = {
    code: verificationCode, expiresAt };
  // 设置定时器自动删除过期验证码
  setTimeout(() => {
   
    delete cache[phoneNumber];
  }, expirationTime);
}
//校验验证码的方法
function checkVerificationCode(phoneNumber, userProvidedCode) {
   
  const record = cache[phoneNumber];
  if (record && record.code === userProvidedCode && record.expiresAt > Date.now()) {
   
    // 验证码正确且未过期,删除已验证的验证码
    delete cache[phoneNumber];
    return true;
  }
  return false; // 验证码错误或已过期
}
//定义一个路由用来验证手机号和验证码是否正确
router.post('/verifyCode', (req, res) => {
   
  const phoneNumber=req.body.phoneNumber;//从请求体中获取手机号
  const userProvidedCode=req.body.verificationCode;//从请求体中获取验证码
  console.log('phoneNumber:', phoneNumber);// 打印调试信息
  console.log('userProvidedCode:', userProvidedCode);// 打印调试信息
  if (checkVerificationCode(phoneNumber, userProvidedCode)) {
   
    res.json({
    success: true, message: '验证码正确' });
  } else {
   
    res.json({
    success: 
  • 30
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值