nodejs 調用阿里雲短信


最近公司使用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
版權聲明:本文為博主原創文章,轉載請附上博文鏈接!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM