阿里大鱼

阿里大鱼官网:http://www.alidayu.com

阿里大鱼提供包括短信、语音、流量直充、私密专线、店铺手机号等个性化服务。通过阿里大鱼, 用淘宝帐户打通三大运营商通信能力,全面融合阿里巴巴生态,以开放APISDK的方式向开发者提供通信和数据服务, 更好地支撑企业业务发展和创新服务。

1.1、短信发送

阿里大鱼提供了Restful API,同时也提供了C++C#JAVAPHPPythonNode.jscURL等 语言和工具的SDK和代码示例。

1.1.1、根据Restful API用node.js自己实现

参考: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格式的字符串