NodeJS实现阿里大鱼短信通知发送
1、说明
阿里大鱼提供了验证码,短信通知,语音等服务,在使用后感觉挺方便,不愧是阿里旗下的产品。
最近想搞个NodeJS发送短信通知的功能,这里没有使用alidayu-node(开始做的时候并不知道有这个。如果使用alidayu-node那就简单了。),自己整一个签名sign,实现短信发送。
官方的文档说明了签名sign的生成步骤,不过第三步骤:
3、连接字符串连接参数名与参数值,并在首尾加上secret
有错误(首尾加上secret是错的)
2、代码实现
生成sign
/**
*根据淘宝官网提供的教程
*http://open.taobao.com/doc2/detail.htm?articleId=101617&docType=1&treeId=1
*/
varmd5=require("blueimp-md5");
//淘宝应用App信息(换成自己的)
varconfig={
AppKey:'233002**',
AppSecret:'3403636b338e100399**'
};
exports.config=config;
vardySign=function(obj){
//生成时间戳
vartime=newDate();
vartimestamp=time.getFullYear()+"-"+
("0"+(time.getMonth()+1)).slice(-2)+"-"+
("0"+time.getDate()).slice(-2)+''+
("0"+time.getHours()).slice(-2)+":"+
("0"+time.getMinutes()).slice(-2)+":"+
("0"+time.getSeconds()).slice(-2);
obj.timestamp=timestamp;
//程序key
obj.app_key=config.AppKey;
//参数数组
vararr=[];
//循环添加参数项
for(varpinobj){
arr.push(p+obj[p]);
}
//2、按首字母升序排列
arr.sort();
//3、连接字符串
varmsg=arr.join('');
//console.log(msg);
//生成签名signhmac
varsign=md5(msg,config.AppSecret);
//返回
returnsign.toUpperCase();
}
module.exports.dySign=dySign;
拼接字符串并发送请求
varsignGenerate=require('./create_dysign');
varhttp=require('http');
varqs=require('querystring');
varalidayuUrl='http://gw.api.taobao.com/router/rest';
//短信发送的参数对象
varobj={
format:'json',
method:'alibaba.aliqin.fc.sms.num.send',
v:'2.0',
timestamp:'2016-1-1602:33:30',
partner_id:'top-sdk-nodejs-20160116',
rec_num:'15110****',//手机号多个以逗号间隔
sign_method:'hmac',
sms_type:'normal',
sms_param:'{"code":"giscafer","product":"alidayu短信测试"}',
sms_free_sign_name:'身份验证',
sms_template_code:'SMS_4725038'
}
//生成签名并拼接请求参数链接
varsign=signGenerate.dySign(obj);
console.log('签名:',sign);
obj.sign=sign;
obj.app_key=signGenerate.config.AppKey;
vararr=[];
for(varpinobj){
arr.push(p+'='+obj[p]);
}
varmsg=arr.join('&')
varsendurl=alidayuUrl+'?'+msg;
console.log('完成请求地址:'+sendurl);
/**
*短信发送请求测试
*/
varparams=qs.stringify(obj);
varoptions={
hostname:'gw.api.taobao.com',
port:80,
path:'/router/rest?'+params,
method:'GET'
};
varreq=http.request(options,function(res){
console.log('STATUS:'+res.statusCode);
//console.log('HEADERS:'+JSON.stringify(res.headers));
//console.log(req.path);
res.setEncoding('utf8');
res.on('data',function(chunk){
console.log('RESULT:'+chunk);
});
});
req.on('error',function(e){
console.log('ERROR:'+e.message);
});
//writedatatorequestbody
req.write("执行完毕!");
req.end();
请求结果
{"alibaba_aliqin_fc_sms_num_send_response":{"result":{"err_code":"0","model":"100545278271^1100912293896","success":true},"request_id":"15q8um2g8w8ef"}}