淘宝API 相关的签名算法 Node.js版本 (阿里大鱼短信)

1

狗是人类的朋友,淘宝文档真心不如他们
前几天别人说阿里大鱼 发短信很快
这几天说充点钱试试 正好有个小项目
结果发现签名工具没有 Node.js的版本
淘宝的文档 谁看谁知道 这里不吐槽了 一点意思都没有
马老板别天天数钱,咱们不能特么好好做做基础设施建设
能不能造福广大程序猿 能不能快乐的玩耍

实在没办法 只能自己写一个

这里使用Hmac方式实现签名

/*
 Node.js的 crypto 库实在搞不懂
 所以下面的两行代码方式的Hmac结果永远都是不对的
 谁知道怎么用 不妨留言给我
*/
var hmac = crypto.createHmac("md5", secret);
var result= hmac.update(message).digest('hex');

使用blueimp-md5 没有的自己装个
npm install blueimp-md5

以下是库

var md5 = require("blueimp-md5").md5;

// 掏包网的App信息
var config = {
    AppKey: '123456',
    AppSecret: '123456'
};

var tbSign = function (obj) {
    // 时间戳
    var time = new Date();
    var 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;
    
    // 参数数组
    var arr = [];
    // 循环添加参数项
    for(var p in obj){
        arr.push(p + obj[p]);
    }
    // 排序
    arr.sort();
    // 参数喘
    var msg =  arr.join('');
    console.log(msg);

    // Hmac 签名
    var sign = md5(msg, config.AppSecret);

    // 返回
    return {
        timestamp:timestamp,
        sign:sign.toUpperCase()
    }
}

module.exports.tbSign = tbSign;

下面 就简单了 使用 算一下 就好了

var helperTb = require('./helper_tbsign');

// 短信发送的参数对象
var obj = {
    format : 'json',
    method : 'alibaba.aliqin.fc.sms.num.send',
    partner_id : 'top-sdk-java-20151020',
    rec_num : '13901234567',
    sign_method : 'hmac',
    sms_type : 'normal',
    sms_param : '{"code":"1234", "product":"Demo"}',
    sms_free_sign_name : '注册验证',
    sms_template_code : 'SMS_123456',
    v : '2.0',
    timestamp : '2015-10-20 20:41:05'
}

var sign = helperTb.tbSign(obj);
// 结果 4F045A8A04A1B0B5A7F196A91C6EF6D1

好了,代码能用了,各位参考,感兴趣按照你的实际情况自己优化
我这里就当弄个笔记了

你可能感兴趣的

19 条评论
lvrecall · 2015-12-04

请问阿里大鱼发短信的SDK下载后怎么在node.js里面用起来?新手,为答辩。自己建网站测试用

回复

freewolf 作者 · 2015-12-04

大鱼没JS sdk,只能自己手工连HTTP服务~~~

回复

fuabc81 · 2015-12-10

能不能帮我改个纯JS的呀,我都搞好几天没有搞好!50235799@qq

回复

freewolf 作者 · 2015-12-10

这不是js吗?

回复

fuabc81 · 2015-12-11

谢谢!我知道这是JS的,我对NODEJS不了解,装了也不会用,所以说有没有方法不用NODEJS
你帮我看看我这个http://segmentfault.com/q/1010000004127267?_ea=500005

回复

freewolf 作者 · 2015-12-11

nodejs没啥区别 你把export改下 就行了~你算算 咱俩结果 有啥不同 过程我写的很详细了
你对比下结果

回复

fuabc81 · 2015-12-12

我做了一个ASP版的才知道我JS错在那几个地方了!编码才是我错误的主要问题!

回复

freewolf 作者 · 2015-12-12

找到问题就好~

回复

lvrecall · 2015-12-17

大神,我只是一个demo,能发给你,你帮我看一下?

回复

freewolf 作者 · 2015-12-19

还没好?

回复

lvrecall · 2015-12-22

完全不会啊!!!愁了好久了,加个QQ微信啥的,请教一下行不

回复

lvrecall · 2015-12-22

你的node.js可以发短信了没?

回复

freewolf 作者 · 2015-12-22

当然~

回复

lvrecall · 2015-12-24

求加好友,QQ:1041168713

回复

ikether · 2015-12-31

就是编码的问题,同意#7,Node.js的crypto中的Hash和Hmac类的update方法,要求如果输入的是String,默认当二进制直接处理,我们需要告诉update方法String的编码,例如:
const md5 = require('crypto').createHash('md5');
md5.update('Some string', 'utf8');
md5.digest('hex').toUpperCase();

回复

freewolf 作者 · 2015-12-31

md5找第三方库 别用nodejs的 计算结果不一样的~

回复

ikether · 2015-12-31

我们公司的应用就是直接用的nodejs的库,好像挺好使!
这些个标准不统一真烦人,urlencode微软非带把空格变+,标准时空格变%20.马丹,坑我好苦!!

回复

freewolf 作者 · 2015-12-31

var md5 = require("blueimp-md5").md5;
我换了这个md5 立刻没问题了

回复

qianzhou001 · 2016-01-14

你好,我需要一个ASP的DEMO,能不能发我一份,可以付价

回复

载入中...