rapid-swiftpass
Version:
SwiftPass module
126 lines (116 loc) • 3.66 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');
/**
* 将上游返回的交易类型转换为平台统一格式
*/
const trade_type_to_pay_type = (trade_type) => {
switch(trade_type) {
case 'pay.alipay.micropay':
return 'alipay';
case 'pay.weixin.micropay':
return 'weixin';
case 'pay.jdpay.micropay':
return 'jdpay';
case 'pay.qq.micropay':
return 'tenpay';
case 'pay.shiming.micropay':
return 'shiming';
case 'pay.unionpay.proxy.micropay':
return 'unionpay';
case 'pay.bestpay.micropay':
return 'bestpay';
default:
return 'unknown';
}
}
/**
* 退款,实时返回交易结果
*
* 参数:
* dest_url: 威富通服务地址
* params: JSON,包含下列的 keys:
* merno: 威富通平台内商户编号
* sign_key: 威富通商户签名密钥
* order_id: 平台内订单号,32 字符内,唯一
* refund_no: 退款单号
* amount: 交易金额
* refund_amt: 退款金额
*
* 返回:
* 成功返回: {
* reqt: 请求报文
* resp: 响应报文
* succ: true
* pay_type: 支付方式
* }
* 失败返回: {
* 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', 'amount',
'refund_no', 'refund_amt'
]
for (let i = 0; i < required.length; i++) {
if (!params[required[i]]) {
throw new Error(`退款请求缺少字段[${required[i]}]`);
}
}
let reqt_json = {
service: 'unified.trade.refund',
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,
out_refund_no: params.refund_no,
total_fee: parseInt(params.amount),
refund_fee: parseInt(params.refund_amt),
op_user_id: params.merno,
}
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,
order_id: resp_json.out_trade_no,
refund_no: resp_json.refund_no,
refund_id: resp_json.refund_id,
channel: resp_json.refund_channel,
refund_amt: resp_json.refund_fee,
};
}
module.exports = {
exchange: exchange,
}