UNPKG

rapid-swiftpass

Version:

SwiftPass module

126 lines (116 loc) 3.66 kB
/** * 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, }