var https = require('https'); var crypto = require('crypto'); var querystring = require('querystring'); /** * alipay_gateway 支付宝默认网关 * _input_charset 字符编码格式 * sign_type 签名加密方式 */ var basicConfig = { alipay_gateway: 'https://mapi.alipay.com/gateway.do?', _input_charset: 'UTF-8', sign_type: 'MD5', service: 'alipay.wap.create.direct.pay.by.user' }; /** * https GET 对应的url * @param url @param url 要请求的url * @returns {Promise} */ // function httpsGET(url) { // return new Promise(function (resolve, reject) { // var req = https.get(url, function (res) { // res.on('data', function (data) { // resolve(data); // }); // }); // req.on('error', function (err) { // reject(err); // }); // req.end(); // }); // } /** * 计算签名 * @param json * @returns {string} */ function buildSign(json) { var keys = Object.keys(json); keys = keys.sort(); var map = {}; for (var i = 0; i < keys.length; i++) { var key = keys[i]; if (key !== 'sign' && key !== 'sign_type' && json[key]) { map[key] = json[key]; } } var str = querystring.unescape(querystring.stringify(map)) + basicConfig.key; return crypto.createHash(basicConfig.sign_type).update(str, basicConfig._input_charset).digest('hex'); } /** * 配置 * @param params * { * seller_email:签约支付宝账号或卖家收款支付宝帐户 * partner:合作身份者ID,以2088开头由16位纯数字组成的字符串 * key:交易安全检验码,由数字和字母组成的32位字符串 * notify_url:支付宝服务器通知的页面 * return_url:支付后跳转后的页面 * } */ exports.config = function (params) { Object.assign(basicConfig, params); }; /** * 使用订单参数构造一个支付请求 * @param orderParams 订单参数 * { * body:订单描述、订单详细、订单备注,显示在支付宝收银台里的“商品描述”里 * out_trade_no:你的网站订单系统中的唯一订单号匹配 * subject:订单名称显示在支付宝收银台里的“商品名称”里,显示在支付宝的交易管理的“商品名称”的列表里。 * total_fee:订单总金额,显示在支付宝收银台里的“应付总额”里 * service: 电脑支付create_direct_pay_by_user 手机支付alipay.wap.create.direct.pay.by.user * } * @returns {string} 支付宝支付请求URL 浏览器跳转到该url支付 */ exports.buildDirectPayURL = function (orderParams) { var json = { service: 'create_direct_pay_by_user', payment_type: '1', _input_charset: basicConfig._input_charset, notify_url: basicConfig.notify_url, partner: basicConfig.partner, return_url: basicConfig.return_url, seller_email: basicConfig.seller_email }; Object.assign(json, orderParams); //加入签名结果与签名方式 json.sign = buildSign(json); json.sign_type = basicConfig.sign_type; return basicConfig.alipay_gateway + querystring.stringify(json); }; /** * 验证来自支付宝的通知是否合法 * @param params 来自支付宝的通知参数 * @returns {Promise} 验证通过时resolve,失败时reject */ // exports.verify = function (params) { // return new Promise(function (resolve, reject) { // var paramsSign = params.sign; // var realSign = buildSign(params); // if (paramsSign === realSign) { // var url = basicConfig.alipay_gateway + // querystring.stringify({ // service: 'notify_verify', // partner: basicConfig.partner, // notify_id: params['notify_id'] // }); // httpsGET(url).then(function (data) { // if (data.toString() === 'true') { // resolve(true); // } else { // reject('来自alipay接口的结果为:验证结果不合法'); // } // }).catch(function (err) { // reject('请求alipay接口发生网络错误:' + JSON.stringify(err)) // }); // } else { // reject('sign验证不相等: ' + paramsSign + ' !== ' + realSign); // } // }); // };