阿里大鱼
官网:http://www.alidayu.com
阿里大鱼
提供包括短信、语音、流量直充、私密专线、店铺手机号等个性化服务。通过阿里大鱼, 用淘宝帐户打通三大运营商通信能力,全面融合阿里巴巴生态,以开放API
及SDK
的方式向开发者提供通信和数据服务, 更好地支撑企业业务发展和创新服务。
阿里大鱼
提供了Restful API,同时也提供了C++、C#、JAVA、PHP、Python、Node.js、cURL等 语言和工具的SDK
和代码示例。
参考:http://segmentfault.com/a/1190000003884148
参考这个也会出错,好在问题不大,需要修改一个地方,下面给出我的方法:
1、使用npm安装blueimp-md5
npm install blueimp-md5 --save
2、编写一个淘宝开放平台API签名
的模块,内容如下:
/**
* 淘宝开放平台API签名的帮助工具
*
* @author 792793182@qq.com 2016-01-15.
*/
const md5 = require("blueimp-md5");
// 阿里大鱼的App信息
const config = {
AppKey: 'yourAppKey',
AppSecret: 'yourAppSecret'
};
function sign(obj) {
// 时间戳
const time = new Date();
const timestamp = 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;
// 参数数组
const arr = [];
// 循环添加参数项
for (var p in obj) {
arr.push(p + obj[p]);
}
// 排序
arr.sort();
// 参数串
const msg = arr.join('');
console.log(msg);
// Hmac 签名
const sign = md5(msg, config.AppSecret);
console.log(sign);
// 返回
return {
timestamp: timestamp,
sign: sign.toUpperCase()
}
}
module.exports.sign = sign;
这个算法是根据淘宝开放平台
的API调用方法解析
说明文档得出的:地址:https://open.taobao.com/doc.htm?docId=101617&docType=1
2、编写获取短信验证码功能:
const http = require('http');
const tbSignUtil = require('./taobaoSignUtil.js');
/**
* 获取短信验证码
*/
router.get('/verifyCode', function (request, response, next) {
// 需要签名的参数
const obj = {
format: 'json',
method: 'alibaba.aliqin.fc.sms.num.send',
partner_id: 'xxxxx',
rec_num: '13900000000',
sign_method: 'hmac',
sms_type: 'normal',
sms_param: '{"code":"1234","product":"乐餐吧"}',
sms_free_sign_name: '乐餐吧',
sms_template_code: 'SMS_1234567',
v: '2.0'
};
const result = tbSignUtil.sign(obj);
obj.sign = result.sign;
obj.timestamp = result.timestamp;
console.log(obj);
const requestEntity = xx(obj);
const options = {
host: 'gw.api.taobao.com',
path: '/router/rest',
method: 'POST',
headers: {
'Content-Type': 'application/x-www-form-urlencoded;charset=utf-8',
'Content-Length': requestEntity.length
}
};
const req = http.request(options, function (res) {
console.log('STATUS: ' + res.statusCode);
res.setEncoding('utf8');
res.on('data', function (chunk) {
console.log('BODY: ' + chunk);
chunk = JSON.parse(chunk);
if (chunk.alibaba_aliqin_fc_sms_num_send_response
&& chunk.alibaba_aliqin_fc_sms_num_send_response.result
&& chunk.alibaba_aliqin_fc_sms_num_send_response.result.err_code == '0'
&& chunk.alibaba_aliqin_fc_sms_num_send_response.result.success) {
var result = {
code: 0,
message: '成功'
};
response.send(result);
} else {
var result = {};
result.code = chunk.error_response.code;
result.message = chunk.error_response.sub_msg;
}
});
res.on('error', function (err) {
console.log('RESPONSE ERROR: ' + err);
var result = {
code: 1,
message: '失败'
};
response.send(result);
});
});
req.on('error', function (err) {
console.log('REQUEST ERROR: ' + err);
var result = {
code: 1,
message: '失败'
};
response.send(result);
});
req.write(requestEntity);
req.end();
});
function xx(obj) {
// 参数数组
var arr = [];
// 循环添加参数项
for (var p in obj) {
arr.push(p + "=" + urlEncode(obj[p]));
}
// 排序
arr.sort();
// 参数串
var msg = arr.join('&');
console.log(msg);
return msg;
}
function urlEncode(str) {
str = (str + '').toString();
return encodeURIComponent(str).replace(/!/g, '%21').replace(/'/g, '%27').replace(/\(/g, '%28').replace(/\)/g, '%29').replace(/\*/g, '%2A').replace(/%20/g, '+');
}
注意:rec_num
是要接收短信的手机号;sms_free_sign_name
是签名的名称;sms_template_code
是短信模板的号,以SMS_
开头;sms_param
是根据模板中的参数,是JSON
格式的字符串