最近公司使用nodejs調用阿里雲短信接口發送短信,網上找了很多示例都不行,給的那些都不能正常使用。下面給出我調用成功的示例。
阿里雲短信調用實質上就是構建一個http請求可以是post也可以是get,關鍵幾個位置是域名、調用的方法,參數等幾個東西,這幾個東西對了以后調用就成功。
首先是域名,阿里雲短信域名為http://dysmsapi.aliyuncs.com/,
之后是對應的參數,其它的參數都是比較簡單的,關鍵的參數是Signature,Signature是簽名參數,這個參數是根據構建的參數列表生成的,並且是唯一,每次調用都要重新生成。
第一步需要將對應的參數按着規則轉為URI,第二步將URI使用hmac-sha1加密,然后轉為base64第三步替換對應的特殊符合(這步有坑)。
第一步中需要注意的是Timestamp必須是東八區時區,不然會報過期的Timestamp參數、參數必須排序。第二步是調用系統內置的Hmac-sha1算法加密,沒有啥注意的,順序不錯就好了。第三步,官網是把 + 替換成 %20,* 替換成 %2A,%7E替換成 ~,我替換+ 后會報簽名算法不對,不知是不是算法規則改了。
下面給出具體示例:
var uuid = require('node-uuid'); var crypto = require('crypto'); var moment = require('moment'); var http = require('http'); var alidayuUrl = 'http://dysmsapi.aliyuncs.com/'; var OPAPI = require('opapi'); var config = { AppKey: 'your keyID', AppSecret: 'your keySecret' }; var obj = { AccessKeyId: config.AppKey, Action: 'SendSms', Format: 'JSON', PhoneNumbers: '', RegionId: 'cn-hangzhou', SignName: '麥傑科技', SignatureMethod: 'HMAC-SHA1', SignatureNonce: uuid.v1(), SignatureVersion: '1.0', TemplateCode: 'SMS_78610022', TemplateParam: '{"code":"123456"}', Timestamp: '', Version: '2017-05-25' } var sms = { NORMAL_TEMPPLATE: 'SMS_78770029', REGISTER_TEMPLATE: 'SMS_75995228', CHANGEPROJECT_TEMPLATE: 'SMS_75995226', FORGETPASSS_TEMPLATE: 'SMS_75995225', sendMessage: function (phone, TemplateCode, TemplateParam, callback) { var sendurl = this.url(phone, TemplateCode, TemplateParam); var req = http.request(sendurl, function (res) { var status = res.statusCode; if (status != 200) { callback(new Error('網絡異常')); } res.setEncoding('utf8'); res.on('data', function (chunk) { var value = JSON.parse(chunk); if (value.Code != 'OK') { console.log(chunk); callback(new Error('短信發送異常')); } else { callback(null); } }).on('error', function (e) { callback(new Error('發送短信異常')); }); }); req.write('執行完畢'); req.end(); }, sign: function (params, accessSecret) { var param = {}, qstring = []; var oa = Object.keys(params); for (var i = 0; i < oa.length; i++) { param[oa[i]] = params[oa[i]]; } for (var key in param) { qstring.push(encodeURIComponent(key) + '=' + encodeURIComponent(param[key])); } qstring = qstring.join('&'); var StringToSign = 'GET' + '&' + encodeURIComponent('/') + '&' + encodeURIComponent(qstring); accessSecret = accessSecret + '&'; var signature = crypto.createHmac('sha1', accessSecret).update(StringToSign).digest().toString('base64'); signature = signature.replace(/\*/, '%2A').replace(/%7E/, '~'); return signature; }, url: function (phone, TemplateCode, TemplateParam) { var timestamp = moment(new Date().getTime() - 3600 * 1000 * 8).format("YYYY-MM-DDTHH:mm:ss") + 'Z'; obj.PhoneNumbers = phone; obj.SignatureNonce = uuid.v1(); obj.TemplateCode = TemplateCode; obj.TemplateParam = TemplateParam; obj.Timestamp = timestamp; var sign = this.sign(obj, config.AppSecret); var arr = []; for (var p in obj) { arr.push(encodeURIComponent(p) + '=' + encodeURIComponent(obj[p])); } arr.push(encodeURIComponent('Signature') + '=' + encodeURIComponent(sign)) var msg = arr.join('&') var sendurl = alidayuUrl + '?' + msg; return sendurl; } } module.exports = sms;
上面的示例是今天剛跑通的示例,使用的時候只需要替換自己的對應的簽名信息,模板編碼等信息就可以。需要注意的地方已經在上面說了,如有不懂的地方可以留言。
https://help.aliyun.com/document_detail/56189.html?spm=5176.doc55288.6.562.D2yUYz
這個是阿里雲官方給的解釋和java生成簽名的過程,其中的坑已經在上面說明了。
特別提示 參數排序,東八區時間,特殊字符替換
---------------------
作者:洪小燈
來源:CSDN
原文:https://blog.csdn.net/u012251421/article/details/75578370
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!