nodejs实现短信业务
1、一定要备案域名,不然短信业务无法使用。
2、申请到下述二个模块
3、选择原版SDK中node
4、申请AccessKey,申请一个管理密钥
5、搭建node环境并且安装pop-core
npm install @alicloud/pop-core -S
6、实现短信登录(我使用koa框架,但是逻辑相同的)
const Core = require("@alicloud/pop-core");
const jwt = require("jsonwebtoken");
const { PRIVATE_KEY } = require("../app/config");
const SmsService = require("../service/sms.service");
const md5password = require("../utils/password-handle");
//存储手机号和获取的验证码
var loginInfo = [];
class smsController {
async sendLoginCroeCode(ctx, next) {
//获取手机号
const { iphone } = ctx.request.body;
//#随机6位验证码
var code = "";
//防止出0开头,阿里短信不允许0开头
while(code[0]=='0'||code==''){
let i=0;
for (i; i < 6; i++) {
let random = parseInt(Math.random() * 10);
code = code + random;
}
}
//# 存储手机号+验证码(方便验证)
var client = new Core({
accessKeyId: "你的ID!!!",
accessKeySecret: "你的密钥!!",
endpoint: "https://dysmsapi.aliyuncs.com",
apiVersion: "2017-05-25",
});
var params = {
PhoneNumbers: iphone,
SignName: "bigbar", //标签名称,可填你网站名称
TemplateCode: "SMS_213302143",
TemplateParam: '{"code":' + `${code}` + "}",
};
var requestOption = {
method: "POST",
};
try {
if (true) {
//进行发送短信
const result = await client.request("SendSms", params, requestOption);
if (result.Code == "OK") {
// if (true) {
loginInfo.push({
iphone: iphone,
code: code,
});
ctx.body = {
status: 200,
msg: "发送成功",
};
}
}
} catch (err) {
ctx.body = {
status: 400,
msg: "发送失败",
};
}
}
//# 验证码登录接口
async lphoneCodeLogin(ctx, next) {
var { iphone, code } = ctx.request.body;
//# 验证手机号是否已经发送个验证码
let validate = (iphone) => {
return loginInfo.some((item) => item.iphone === iphone);
};
//# 验证验证码是否一致
let validateCode = (iphone, code) => {
return loginInfo.some(
(item) => item.iphone === iphone && item.code == code
);
};
if (validate(iphone)) {
//判断手机号是否发送过验证码
if (validateCode(iphone, code)) {
//判断验证码与手机号是否匹配
code = md5password(code);
const result = await SmsService.isRegister(iphone);
if (result) {
//注册过,把密码实时更新为验证码
// await SmsService.UpdatePassword(iphone, code);
//拉取登录信息
let user = await SmsService.LoginMessage(iphone);
const { id, name } = user[0];
const token = jwt.sign({ id, name }, PRIVATE_KEY, {
expiresIn: 60 * 60 * 24 * 30,
algorithm: "RS256",
});
let status = "200";
ctx.body = { id, name, token, status };
} else {
//没注册过,进行注册
const password = md5password(iphone);
await SmsService.RegisterInfo(iphone, password);
//拉取登录信息
let user = await SmsService.LoginMessage(iphone);
const { id, name } = user[0];
const token = jwt.sign({ id, name }, PRIVATE_KEY, {
expiresIn: 60 * 60 * 24 * 30,
algorithm: "RS256",
});
let status = "200";
ctx.body = { id, name, token, status };
}
loginInfo = []; // 登录成功,立马清空数组,以免无法再次发送验证码
} else {
ctx.body = {
status: 400,
msg: "验证码错误",
};
}
} else {
ctx.body = {
status: 400,
msg: "未获取验证码",
};
}
}
//找回密码功能
async findpassword(ctx,next) {
var { iphone, code, password } = ctx.request.body;
//# 验证手机号是否已经发送个验证码
let validate = (iphone) => {
return loginInfo.some((item) => item.iphone === iphone);
};
//# 验证验证码是否一致
let validateCode = (iphone, code) => {
return loginInfo.some(
(item) => item.iphone === iphone && item.code == code
);
};
if (validate(iphone)) {
//判断手机号是否发送过验证码
if (validateCode(iphone, code)) {
//判断验证码与手机号是否匹配
password = md5password(password);
console.log(password);
const result = await SmsService.isRegister(iphone);
if (result) {
//验证通过修改密码
await SmsService.UpdatePassword(iphone, password);
ctx.body = {
status:200,
msg:"修改成功"
}
} else {
//没注册过,进行注册
await SmsService.RegisterInfo(iphone, password);
ctx.body={
status:200,
msg: "由于你未注册,系统将给你自动注册,密码为你刚刚输入的",
}
}
loginInfo = []; // 登录成功,立马清空数组,以免无法再次发送验证码
} else {
ctx.body = {
status: 400,
msg: "验证码错误",
};
}
} else {
ctx.body = {
status: 400,
msg: "未获取验证码",
};
}
}
}
module.exports = new smsController();
7、实现成功!!
如有帮助到各位可以点个赞,欢迎加我qq1804357047进行交流