码支付

node.js版 集成支付接口API演示

1 年前

本文主要是演示node.js使用express创建订单的一个过程

var express = require('express');
var router = express.Router();
router.all('/', function (req, res, next) {
    var arr = {id: 1, pay_id: "admin", type: 1, price: 100}; //构造需要的参数 参考通用文档
    var data = ksort(arr); //重新排序对象 按照首字符开始排序
    var sign = "";
    for (var key in data) {
        sign +=data[key] == ''?'':key + "=" + data[key] + "&";
    }
    sign = sign.substring(0, sign.length - 1); //去掉最后一个&字符
    var key = md5(sign + "替换密钥");//替换为自己的密钥
    var url = "http://codepay.fateqq.com:52888/creat_order/?" + sign + '&sign=' + key; //支付页面
    res.writeHead(302, {
        'Location': url //跳转到支付页面
    });
})
module.exports = router;

ksort = function (inputArr, sort_flags) { //JS版对象排序
    var tmp_arr = {},
        keys = [],
        sorter, i, k, that = this,
        strictForIn = false,
        populateArr = {};

    switch (sort_flags) {
        case 'SORT_STRING':
            // compare items as strings
            sorter = function (a, b) {
                return that.strnatcmp(a, b);
            };
            break;
        case 'SORT_LOCALE_STRING':
            // compare items as strings, original by the current locale (set with  i18n_loc_set_default() as of PHP6)
            var loc = this.i18n_loc_get_default();
            sorter = this.php_js.i18nLocales[loc].sorting;
            break;
        case 'SORT_NUMERIC':
            // compare items numerically
            sorter = function (a, b) {
                return ((a + 0) - (b + 0));
            };
            break;
        // case 'SORT_REGULAR': // compare items normally (don't change types)
        default:
            sorter = function (a, b) {
                var aFloat = parseFloat(a),
                    bFloat = parseFloat(b),
                    aNumeric = aFloat + '' === a,
                    bNumeric = bFloat + '' === b;
                if (aNumeric && bNumeric) {
                    return aFloat > bFloat ? 1 : aFloat < bFloat ? -1 : 0;
                } else if (aNumeric && !bNumeric) {
                    return 1;
                } else if (!aNumeric && bNumeric) {
                    return -1;
                }
                return a > b ? 1 : a < b ? -1 : 0;
            };
            break;
    }

    // Make a list of key names
    for (k in inputArr) {
        if (inputArr.hasOwnProperty(k)) {
            keys.push(k);
        }
    }
    keys.sort(sorter);

    // BEGIN REDUNDANT
    this.php_js = this.php_js || {};
    this.php_js.ini = this.php_js.ini || {};
    // END REDUNDANT
    strictForIn = this.php_js.ini['phpjs.strictForIn'] && this.php_js.ini['phpjs.strictForIn'].local_value && this.php_js
            .ini['phpjs.strictForIn'].local_value !== 'off';
    populateArr = strictForIn ? inputArr : populateArr;

    // Rebuild array with sorted key names
    for (i = 0; i < keys.length; i++) {
        k = keys[i];
        tmp_arr[k] = inputArr[k];
        if (strictForIn) {
            delete inputArr[k];
        }
    }
    for (i in tmp_arr) {
        if (tmp_arr.hasOwnProperty(i)) {
            populateArr[i] = tmp_arr[i];
        }
    }

    return strictForIn || populateArr;
}


var crypto = require("crypto");
var Buffer = require("buffer").Buffer;
md5 = function (data, codeBase) { //MD5加密
    var buf = typeof data == "string" ? codeBase == 'gbk' ? iconv.encode(data, 'gbk') : new Buffer(data) : data;
    var str = buf.toString("binary");
    return crypto.createHash("md5").update(str).digest("hex");
}