5-egg-TS-通用后端管理注册系统-短信验证码

1.阿里云短信准备
参考阿里云短信
2.安装@alicloud/pop-core

npm install @alicloud/pop-core

3.util/SmseCode.ts
根据openAPI的代码来修改

// eslint-disable-next-line @typescript-eslint/no-var-requires
const Core = require('@alicloud/pop-core');
let transporter;
export default {
  // 创建发送短信对象
  createTransporterInstance(ctx) {
    if (transporter) {
      return transporter;
    }
    transporter = new Core({
      accessKeyId: ctx.app.config.sms.accessKeyId,
      accessKeySecret: ctx.app.config.sms.secretAccessKey,
      endpoint: 'https://dysmsapi.aliyuncs.com',
      apiVersion: '2017-05-25',
    });
    return transporter;
  },
  // 创建需要发送的内容
  createSmsInfo(ctx, receiver:string) {
    // 1.生成验证码
    const code = Math.random().toString(16).slice(2, 6)
      .toUpperCase();
    const jsonCode = { code };
    // 2.生成发送内容
    const info = {
      SignName: '小灰灰',
      TemplateCode: 'SMS_247900215',
      PhoneNumbers: receiver,
      TemplateParam: JSON.stringify(jsonCode),
    };
    // 3.保存验证码
    ctx.session.sms = {
      code,
      expire: Date.now() + 60 * 1000, // 验证码1分钟之后过期
    };
    return info;
  },
  // 发送短信
  async sendSmsCode(ctx, receiver:string) {
    const transporter = this.createTransporterInstance(ctx);
    const info = this.createSmsInfo(ctx, receiver);
    const requestOption = {
      method: 'POST',
    };
    return new Promise((resolve, reject) => {
      transporter.request('SendSms', info, requestOption).then(result => {
        resolve(result);
      }, ex => {
        reject(ex);
      });
    });
  },
  verifySmsCode(ctx, clientCode) {
    // 1.取出服务端中保存的验证码和过期时间
    const serverCaptcha = ctx.session.sms;
    let serverCode;
    let serverExpire;
    try {
      serverCode = serverCaptcha.code;
      serverExpire = serverCaptcha.expire;
    } catch (e) {
      throw new Error('请重新获取验证码');
    }

    if (Date.now() > serverExpire) {
      throw new Error('验证码已经过期');
    } else if (serverCode !== clientCode) {
      throw new Error('验证码不正确');
    }
    // 注意点: 验证码无论验证成功还是失败, 都只能使用一次
    ctx.session.email = null;
  },
};

4.extend/helper.ts

  // 异步发送短信
  async sendSmsCode(receiver:string) {
    return await SmseCode.sendSmsCode(this.ctx, receiver);
  },
  // 验证手机验证码
  verifySmsCode(clientCode) {
    SmseCode.verifySmsCode(this.ctx, clientCode);
  },

5.controller/util.ts

 public async smsCode() {
    const { ctx } = this;
    try {
      const { phone } = ctx.query;
      const data = await ctx.helper.sendSmsCode(phone);
      ctx.success(data);
    } catch (e:any) {
      ctx.error(400, e.message);
    }
  }

6.controller/user.ts

 case RegisterTypeEnum.Phone:
        // 校验手机数据的格式是否正确
        ctx.validate(PhoneUserRule, data);
        // 校验手机验证码是否正确
        ctx.helper.verifySmsCode(data.captcha);
        break;

7.app/router.ts

router.get('/smscode', controller.util.smsCode);
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值