node 阿里云 短信验证服务

312 阅读3分钟

node如何发送短信验证码


我这里使用的是阿里云短信服务 dysms.console.aliyun.com/domestic/te…

  1. 首先去阿里云签名管理添加一个签名
  2. 再去模板管理添加一个短信模板,记得一定要跟上面的签名关联才能使用这个模板,这两个申请都有2小时的等待时间

image.png 3. 然后点击右上角的头像点击accessKey管理,有的话等下直接使用,没有创建一个就行

image.png


首先安装 npm i @alicloud/pop-core -S

  • 这里我把我的代码删减了
  • 最后我会放我完整的代码
const Core = require("@alicloud/pop-core");

const accessKeyId = ""; // 你自己在阿里云后台的accessKeyId
const secretAccessKey = ""; // secretAccessKey

const client = new Core({
  accessKeyId: accessKeyId,
  secretAccessKey: secretAccessKey,
  endpoint: "https://dysmsapi.aliyuncs.com", // 写死不用管
  apiVersion: "2017-05-25",
});

// 发送短信
async function sendCode(phone) {
  const code = Math.floor(Math.random() * 9000 + 1000); // 生成 4 位随机验证码
  const params = {
    RegionId: "cn-hangzhou", // 写死
    PhoneNumbers: phone, // 手机号
    SignName: "一片好麦", // 短信签名 这个跟你创建短信签名的名称一致
    TemplateCode: "SMS_0000000", // 短信模板 ID  拿短信模板里的id
    TemplateParam: '{"code":"' + code + '" }', // 写死
  };
  const requestOption = {
    method: "POST",
  };
  // 执行了这一步不出意外是能收到短信了,出意外就看控制台吧
  const result = await client.request("SendSms", params, requestOption);
  // 我这里使用的redis存验证码,你可以自己选择用什么,这个需要安装才能使用哦
  redis.set("smsCode", code);
  redis.expire("smsCode", 60 * 5);
}

// 验证短信
async function verify(phone, code) {
  const params = {
    SendDate: moment().format("YYYYMMDD"), // 查询短信发送的日期 如:20230221
    PhoneNumber: phone, // 查询的手机号
    PageSize: 1, // 分页大小
    CurrentPage: 1, //页码
  };
  const requestOption = {
    method: "POST",
  };

  const result = await client.request(
    "QuerySendDetails",
    params,
    requestOption
  );
  // 确实有发送短信
  if (result.SmsSendDetailDTOs.SmsSendDetailDTO[0].SendStatus === 3) {
    const res = await redis.get("smsCode"); // 这里拿到你之前发送的短信,我是存在redis里的,你存哪里就从哪里取
    if (res === code) {
      // 验证成功
    }
  }
}

下面是我完整的代码

const Core = require("@alicloud/pop-core");
const RetJson = require("../lib/retjson");
const moment = require("moment");
const Redis = require("ioredis");
const redis = new Redis();

const accessKeyId = ""; //你自己在阿里云后台的accessKeyId
const secretAccessKey = ""; //secretAccessKey

const client = new Core({
  accessKeyId: accessKeyId,
  secretAccessKey: secretAccessKey,
  endpoint: "https://dysmsapi.aliyuncs.com",
  apiVersion: "2017-05-25",
});

const sms = {
  getParams(phone, code) {
    return {
      RegionId: "cn-hangzhou",
      PhoneNumbers: phone, // 手机号
      SignName: "一片好麦", // 短信签名
      TemplateCode: "SMS_0000000000", // 短信模板 ID
      TemplateParam: '{"code":"' + code + '" }',
    };
  },
  // 发送验证码
  async send(ctx) {
    const { phone } = ctx.request.body;
    const code = Math.floor(Math.random() * 9000 + 1000); // 生成 4 位随机验证码
    const params = sms.getParams(phone, code);
    const requestOption = {
      method: "POST",
    };
    try {
      const result = await client.request("SendSms", params, requestOption);
      redis.set("smsCode", code);
      redis.expire("smsCode", 60 * 5);
      ctx.body = new RetJson(200, "短信发送成功", true);
    } catch (err) {
      console.error(err);
      ctx.body = new RetJson(500, "短信发送失败", false);
    }
  },
  // 短信验证码验证
  async verify(ctx, next) {
    const { phone, code } = ctx.request.body;
    const params = {
      SendDate: moment().format("YYYYMMDD"),
      PhoneNumber: phone,
      PageSize: 1,
      CurrentPage: 1,
    };
    const requestOption = {
      method: "POST",
    };
    try {
      const result = await client.request(
        "QuerySendDetails",
        params,
        requestOption
      );
      // 确实有发送短信
      if (result.SmsSendDetailDTOs.SmsSendDetailDTO[0].SendStatus === 3) {
        const res = await redis.get("smsCode");
        if (res === code) {
          await next();
        } else {
          ctx.body = new RetJson(500, "验证失败", false);
        }
      } else {
        ctx.body = new RetJson(500, "验证码错误", false);
      }
    } catch (err) {
      console.log(JSON.stringify(err));
      ctx.body = new RetJson(500, "验证出错请重试", false);
    }
  },
};
module.exports = sms;