nodejs+阿里云实现发送短信验证码

一、阿里云短信服务

打开阿里云短信服务控制台

1.新增资质

2.新增模板与签名

3.等待审核通过

二、node代码

1.首先需要下载依赖

npm i @alicloud/pop-core --save

2.引入依赖

关键信息建议放环境变量中

 accessKeyId和accessKeySecret在这里↓

 以下是代码

const Core = require('@alicloud/pop-core');
const Captcha = require("../common/Captcha")
const capt = Captcha()

let client = new Core({
    accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
    accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
    endpoint: 'https://dysmsapi.aliyuncs.com',
    apiVersion: '2017-05-25'
});
let requestOption = {
    method: 'POST',
    formatParams: false,
};

3.验证代码的实现

function Captcha() {
    let captchaObj = {}
    let status = {over: 0, success: 1, error: 2}
    let setCode = (phone, code) => {
        let time = Date.now()
        if (captchaObj[phone] && captchaObj[phone].time && !isExceed60Seconds(captchaObj[phone].time, time)) {
            return false
        } else {
            captchaObj[phone] = {code, time}
            return true
        }
    }
    //是否正确且不超时
    let checkCode = (phone, code) => {
        let time = Date.now()
        let before = captchaObj[phone].time
        let isOver = isTimeDifferenceGreaterThanFiveMinutes(before, time)
        if (isOver) {
            return status.over
        } else {
            return checkIfDif(captchaObj[phone], code)
        }
    }
    
    function checkIfDif(before, cur) {
        // console.log(before, cur)
        if (before && before.code === cur) {
            return status.success
        } else {
            return status.error
        }
    }

    const getCode = (phone) => {
        return captchaObj[phone]?.code
    }

    function isTimeDifferenceGreaterThanFiveMinutes(before, cur) {
        // 计算时间差(单位:毫秒)
        let difference = Math.abs(cur - before);  // 使用Math.abs确保时间差始终为正数

        // 将毫秒转换为分钟
        let differenceInMinutes = difference / (1000 * 60);

        // 判断时间差是否大于五分钟
        return differenceInMinutes > 5;
    }

    function isExceed60Seconds(before, cur) {
        // 计算时间差,单位为毫秒
        let diff = cur - before;

        // 将毫秒转换为秒
        let secondsDiff = diff / 1000;

        // 判断是否超过60秒
        return secondsDiff > 60;
    }

    return {setCode, checkCode, getCode}
}

module.exports = Captcha

4.在接口中使用

router.post("/sendCode", (req, res) => {
    const {tel_number} = req.body
    let code = methods.generateFourDigitRandom()
    let setResult = capt.setCode(tel_number, code)
    if (setResult) {
        let params = {
            "SignName": process.env['ALIBABA_CLOUD_SIGN_NAME'],//资质名称
            "TemplateCode": process.env['ALIBABA_CLOUD_TMP_CODE'],//模板CODE
            "PhoneNumbers": tel_number,
            "TemplateParam": JSON.stringify(({code: code}))
        }
        client.request('SendSms', params, requestOption).then((result) => {
            res.send(Result.success({msg: "成功!", data: result}))
        }, (ex) => {
            res.send(Result.fail({errmsg: "请求失败!", error: ex}))
        })
    } else {
        res.send(Result.validateFailed({errmsg: "发送太过频繁,请稍后再试!"}))
    }
})

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值