rapid-swiftpass
Version:
SwiftPass module
88 lines (79 loc) • 2.54 kB
JavaScript
/**
* Copyright (c) 2017 Lucky Byte, Inc.
*/
const debug = require('debug')('swiftpass');
const crypto = require('crypto');
const moment = require('moment');
const winston = require('winston');
const utils = require('../lib/utils');
const post = require('../lib/post');
/**
* 根据商户订单号查询订单信息
*
* 参数:
* dest_url: 威富通服务地址
* params: JSON,包含下列的 keys:
* merno: 威富通平台内商户编号
* sign_key: 威富通商户签名密钥
* order_id: 平台内订单号,32 字符内,唯一
*
* 返回:
* 成功返回: {
* reqt: 请求报文
* resp: 响应报文
* succ: true
* }
* 失败返回: {
* reqt: 请求报文
* resp: 响应报文
* succ: false
* errmsg: 错误信息
* }
*/
const exchange = async (dest_url, params) => {
if (!dest_url || !params) {
throw new Error('交易查询请求参数无效');
}
const required = [
'merno', 'sign_key', 'order_id'
]
for (let i = 0; i < required.length; i++) {
if (!params[required[i]]) {
throw new Error(`交易查询请求缺少字段[${required[i]}]`);
}
}
let reqt_json = {
service: 'unified.trade.query',
version: '2.0',
charset: 'UTF-8',
sign_type: 'MD5',
nonce_str: crypto.randomBytes(16).toString('hex'),
mch_id: params.merno,
out_trade_no: params.order_id,
}
reqt_json.sign = utils.gen_sign(reqt_json, params.sign_key);
winston.info('威富通交易查询请求报文:', JSON.stringify(reqt_json, null, 2));
const resp_data = await post(dest_url, reqt_json);
const resp_json = await utils.parse_resp_xml(resp_data);
winston.info('威富通交易查询响应报文:', JSON.stringify(resp_json, null, 2));
if (!utils.verify_sign(resp_json, params.sign_key)) {
throw new Error('验证威富通交易查询响应报文签名失败');
}
winston.info('验证威富通交易查询响应报文签名通过');
if (parseInt(resp_json.result_code) != 0) {
return {
reqt: reqt_json,
resp: resp_json,
succ: false,
errmsg: resp_json.err_msg || '交易失败'
}
}
return {
reqt: reqt_json,
resp: resp_json,
succ: true,
};
}
module.exports = {
exchange: exchange,
}