本文介紹在案例雲開通短信服務的流程以及在Node項目中使用的方法。
一、開通阿里雲短信服務
登陸阿里雲,然后進入 https://dysms.console.aliyun.com/dysms.htm 。
選擇國內消息,在“簽名管理”里添加簽名,獲取 SignName;在“模板管理”里添加模板,獲得 TemplateCode 。

二、獲取 AccessKey
要調用短信服務,需要通過 AccessKey 鑒權。登陸阿里雲,進入 https://usercenter.console.aliyun.com/ ,創建 AccessKey,得到 accessKeyId 和 accessKeySecret 。
三、費用支付
短信服務是收費的,可以按發送次數計費,也可以購買套餐。跟手機用戶向聯通移動付費的方式相似,會在月底出賬單,欠費的話會停掉短信服務。
為避免欠費,可以在阿里雲帳戶內存入一定余額。進入 https://usercenter2.aliyun.com/home 查看:

四、Node調用
@alicloud/pop-core 是阿里提供的核心庫,需要在項目中引入:
npm install @alicloud/pop-core -S
下面是 sms.js 示例代碼,其中 SignName / TemplateCode / accessKeyId / accessKeySecret 都要從阿里雲獲取,請替換為實際值。
/**
* 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
