UNPKG

union-pay-nodejs.cui

Version:
176 lines (164 loc) 5.56 kB
'use strict' const utils = require('./utils'); const gateway = require('./gateway'); const fs = require('fs'); class Unionpay { /** * 初始化 * @param {Object} opts 配置信息 * - merid 商户ID * - frontUrl 通知地址 * - cert 证书文件 * - pfxPath 证书文件路径 * - pfxPassword 证书文件密码 */ constructor(opts) { this.merId = opts.merId; this.frontUrl = opts.frontUrl; this.backUrl = opts.backUrl; this.pfxPath = opts.pfxPath; this.pfxPassword = opts.pfxPassword; this.cert = opts.cert; this.sandbox = opts.sandbox || false; this.bizScene = opts.bizScene; this.payeeAcctNo = opts.payeeAcctNo; this.payeeAcctNm = opts.payeeAcctNm; this.payeeBankName = opts.payeeBankName; this.certId = ''; this.publicKey = ''; this.privateKey = ''; } /** * 初始化key */ async initKey() { if (this.certId && this.publicKey && this.privateKey) return; const pem = await utils.pfx2pem(this.pfxPath, this.pfxPassword); this.privateKey = pem.key; this.certId = utils.h2d(pem.attributes.serial); this.publicKey = fs.readFileSync(this.cert).toString(); } /** * 银联支付-app控件支付-消费类交易,获取参数 * @param {Object} obj * - orderId 订单id * - txnAmt 金额(分) * - orderDesc 商品描述 * @return tn 交易流水号 出错为null */ async getAppTn(obj) { // App支付特定类型设置 obj.bizType = "000201"; obj.txnType = "01"; // 交易类型 obj.txnSubType = "01"; // 交易子类 return new Promise(async (resolve, reject) => { let formData = await utils.buildParams(obj, this); const body = await utils.request(this.sandbox ? gateway.appTransReq.test : gateway.appTransReq.product, formData); var tn = null; var s = body.split('&'); for (var i in s) { var a = s[i]; var k = a.split('='); if (k[0] == 'tn') { tn = k[1] || null; break; } } if(tn){ resolve(tn); }else{ reject(body) } }) }; /** * 银联支付-front控件支付-消费类交易,获取参数 * @param {Object} obj * - orderId 订单id * - txnAmt 金额(分) * - orderDesc 商品描述 * @return tn 交易流水号 出错为null */ async getFrontTn(obj) { // App支付特定类型设置 obj.bizType = "000201"; obj.txnType = "01"; // 交易类型 obj.txnSubType = "01"; // 交易子类 return new Promise(async (resolve, reject) => { let formData = await utils.buildParams(obj, this); let frontTransUrl = this.sandbox ? gateway.frontTransReq.test : gateway.frontTransReq.product; const html = await utils.buildAutoFormHtml(formData, frontTransUrl); if(html){ resolve(html); }else{ reject("error"); } }) }; /** * 银联支付-front控件支付-企业消费类交易,获取参数 * @param {Object} obj * - orderId 订单id * - txnAmt 金额(分) * - orderDesc 商品描述 * @return tn 交易流水号 出错为null */ async getBizFrontTn(obj) { // App支付特定类型设置 obj.bizType = "000202"; obj.txnType = "01"; // 交易类型 obj.txnSubType = "01"; // 交易子类 return new Promise(async (resolve, reject) => { let formData = await utils.buildBizParams(obj, this); let frontTransUrl = this.sandbox ? gateway.frontTransReq.test : gateway.frontTransReq.product; const html = await utils.buildAutoFormHtml(formData, frontTransUrl); if(html){ resolve(html); }else{ reject("error"); } }) }; /** * 交易查询 * @param {Object} obj * - orderId 订单id * @return {Object} */ async queryTrade(obj) { // 支付查询特定类型设置 obj.bizType = "000802"; // 产品类型 obj.txnType = "00"; // 交易类型 obj.txnSubType = "00"; // 交易子类 return new Promise(async (resolve, reject) => { let formData = await utils.buildParams(obj, this); const body = await utils.request(this.sandbox ? gateway.queryTrans.test : gateway.queryTrans.product, formData); if (body) { resolve(body); } else { reject(body); } }) }; /** * 银联验签 * @param {Object} obj 银联的回调参数 * @return {Bool} true则签名成功 */ async verify(obj) { return new Promise(async (resolve, reject) => { let result = await utils.verify(req.body); if (!result) { reject('签名失败') } let transStatus = req.body.respCode; if ("" != transStatus && "00" == transStatus) { resolve(true) } else { reject('返回数据出错') } }) } } module.exports = Unionpay;