node如何发送短信验证码
我这里使用的是阿里云短信服务 dysms.console.aliyun.com/domestic/te…
- 首先去阿里云签名管理添加一个签名
- 再去模板管理添加一个短信模板,记得一定要跟上面的签名关联才能使用这个模板,这两个申请都有2小时的等待时间
3. 然后点击右上角的头像点击accessKey管理,有的话等下直接使用,没有创建一个就行
首先安装 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;