Node 接入阿里雲實現短信驗證碼

本文介紹在案例雲開通短信服務的流程以及在Node項目中使用的方法。npm

一:開通阿里雲短信服務的方法參考官方文檔。

二:獲取 AccessKey

要調用短信服務,須要經過 AccessKey 鑑權。登錄阿里雲,進入 https://usercenter.console.al... ,建立 AccessKey,獲得 accessKeyId 和 accessKeySecret 。
image.pngapi

3、費用支付

4、Node調用

@alicloud/pop-core 是阿里提供的核心庫,須要在項目中引入:網絡

npm install @alicloud/pop-core -S
下面是 sms.js 示例代碼,其中 SignName / TemplateCode / accessKeyId / accessKeySecret 都要從阿里雲獲取,請替換爲實際值。dom

/**
 * sms.send(手機號) 發送短信驗證碼
 * sms.verify(手機號,驗證碼) 校驗驗證碼是否正確
 **/
 
const Core = require('@alicloud/pop-core');
const _ = require('lodash');
 
// 阿里雲控制檯 - 短信服務 - 國內消息
const SignName = "東方網絡";
const TemplateCode = "SMS_123456";
 
// https://usercenter.console.aliyun.com/
const accessKeyId = "ljksdhfjklJKGKGKJHK";
const accessKeySecret = "HKAJSHDIU90800980jkahsd";
 
var client = new Core({
    accessKeyId,
    accessKeySecret,
    endpoint: 'https://dysmsapi.aliyuncs.com',
    apiVersion: '2017-05-25'
});
 
// 保存手機號和驗證碼的對應關係
// phone_code_list = {'18855551234':['1024']}
var phone_code_list = {};
 
exports.send = function(phone) {
    // 生成驗證碼
    var code = "" + _.random(9) + _.random(9) + _.random(9) + _.random(9);
    return new Promise((resolve, reject) => {
        try {
            client.request('SendSms', {
                RegionId: "cn-hangzhou",
                PhoneNumbers: phone,
                SignName,
                TemplateCode,
                TemplateParam: "{code:" + code + "}"
            }, {
                method: 'POST'
            }).then((result) => {
                if (result.Message && result.Message == "OK" && result.Code && result.Code == "OK") { // 短信發送成功
                    // 保存驗證碼
                    if (phone_code_list[phone]) {
                        phone_code_list[phone].push(code);
                    } else {
                        phone_code_list[phone] = [code];
                    }
                    // 三分鐘後刪除驗證碼
                    setTimeout(() => {
                        _.pull(phone_code_list[phone], code);
                        if (phone_code_list[phone] && phone_code_list[phone].length == 0) {
                            delete phone_code_list[phone];
                        }
                    }, 3 * 60 * 1000)
                    resolve(result)
                } else {
                    reject(result)
                }
            }, (ex) => {
                reject(ex)
            })
        } catch (error) {
            reject(error)
        }
    })
}
 
exports.verify = function(phone, code) {
    return (phone_code_list[phone].indexOf(code) > -1)
}

調用方式參考:

const sms = require("./util/sms.js")
 
// 發送驗證碼
sms.send("18855551234").then((result) => {
    console.log("短信發送成功")
    console.log(result)
}, (ex) => {
    console.log("短信發送失敗")
    console.log(ex)
});
 
// 校驗用戶提交的驗證碼
var isCodeRight = sms.verify("18855551234","0000"); // 返回true/false
相關文章
相關標籤/搜索