阿里雲簡訊服務 nodejs版本SDK,非阿里大魚
阿新 • • 發佈:2019-02-03
最近發現新註冊的阿里大魚全部轉移到阿里雲的簡訊伺服器,目前還沒有提供nodejs 的sdk,所以我自己寫了一個,有什麼問題大家可以指正。
有小夥伴反饋簡訊模組啟動後只能傳送一次,第二次就儲存,後來查看了一下,是SignatureNonce和Timestamp每次傳送都要更新,所以稍微修改一下。
/**
* 阿里雲簡訊傳送介面 nodejs 版本
* 阿里雲簡訊API官方文件: https://help.aliyun.com/document_detail/44364.html?spm=5176.8195934.507901.11.pLzahV
*/
const http = require ('http');
const querystring=require("querystring");
const crypto = require('crypto');
var AliyunSMS = {
//配置
config:{
AccessKeyId: '***', //阿里簡訊服務所用的金鑰
AccessKeySecret: "***", //阿里簡訊服務所用的金鑰值
Format: 'JSON',
SignatureMethod: 'HMAC-SHA1',
SignatureVersion: '1.0' ,
Action: 'SendSms',
Version: '2017-05-25',
RegionId: 'cn-hangzhou'
},
//傳送POST請求
POST: function (Data,callback){
const postData = querystring.stringify(Data);
const options = {host: 'dysmsapi.aliyuncs.com', port: 80, path: '', method: 'POST', headers: {'Content-Type' : 'application/x-www-form-urlencoded', 'Content-Length': Buffer.byteLength(postData)}};
const req = http.request(options, function(res){
res.setEncoding('utf8');
res.on('data', function(chunk){callback(chunk);});
res.on('end', function() {console.log('end');});
});
req.on('error', function(e){callback({'error':e.message});});
req.write(postData);
req.end();
},
//簽名演算法
sign: function (param) {
var json={},p=Object.keys(param).sort();
for(var i=0;i<p.length;i++){json[p[i]]=param[p[i]];}
return crypto.createHmac('sha1', param.AccessKeySecret + '&').update(new Buffer('POST&' + encodeURIComponent('/') + '&' + encodeURIComponent(querystring.stringify(json, '&', '=')), 'utf-8')).digest('base64');
},
//傳送簡訊
send: function (data,callback) {
data.SignatureNonce= Math.random().toString();
data.Timestamp=new Date().toISOString();
var param = Object.assign(data, this.config);
param.Signature = this.sign(param);
this.POST(param, function (data) {
callback(data);
});
}
};
module.exports = AliyunSMS;
AliyunSMS.config.AccessKeyId= '***'; //阿里簡訊服務所用的金鑰
AliyunSMS.config.AccessKeySecret= "****"; //阿里簡訊服務所用的金鑰值
AliyunSMS.send({
PhoneNumbers: '13411118888', //接收簡訊的手機,逗號隔開,最多20個號碼
SignName: '阿里雲簡訊', //簡訊簽名
TemplateCode: 'SMS_11118888', //簡訊模板
TemplateParam: JSON.stringify({
'code':'1111'
}) //簡訊模板中引數指定
}, function (data) {
console.log('返回data:'+data);
//傳送成功返回 {"Message":"OK","RequestId":"8AB21B6B-A92B-4110-A112-4F10A41511A5","BizId":"10876611111^1111773511111","Code":"OK"}
// 失敗沒有OK,有具體錯誤提示,以此判斷是否傳送成功
});