UNPKG

coa-allin-pay

Version:
116 lines (115 loc) 4.74 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.AllinPaySybBin = void 0; const coa_error_1 = require("coa-error"); const coa_helper_1 = require("coa-helper"); const coa_secure_1 = require("coa-secure"); const crypto_1 = require("crypto"); const qs = require("querystring"); class AllinPaySybBin { constructor(config) { // 触发事件过长的阈值 this.thresholdTooLong = 2 * 1000; this.config = config; } // 发送请求 async request(service, method, param) { // 组装参数并请求 const params = await this.getParams(param); // 请求并记录开始、结束时间 const startAt = Date.now(); const res = await coa_helper_1.axios.post(this.config.endpoint + `/${service}/${method}`, qs.stringify(params), { headers: { 'Content-Type': 'application/x-www-form-urlencoded' } }); const endAt = Date.now(); // 触发请求事件 this.onRequest(params, res.data); // 触发请求时间过长事件 if (endAt - startAt > this.thresholdTooLong) { this.onRequestTooLong(params, res.data, { startAt, endAt }); } // 处理结果 try { return this.handleResult(res); } catch (e) { // 触发请求错误事件 this.onRequestError(params, res.data, e); throw e; } } // 推送返回记录 // eslint-disable-next-line @typescript-eslint/no-unused-vars onBackReceive(body) { } // 请求记录 // eslint-disable-next-line @typescript-eslint/no-unused-vars onRequest(param, response) { } // 请求失败 // eslint-disable-next-line @typescript-eslint/no-unused-vars onRequestError(param, response, error) { } // 请求时间过长 onRequestTooLong( // eslint-disable-next-line @typescript-eslint/no-unused-vars _param, // eslint-disable-next-line @typescript-eslint/no-unused-vars _response, // eslint-disable-next-line @typescript-eslint/no-unused-vars time) { } // 结果验签 handleResult(res) { const data = res.data || {}; // 判断结果是否正确 if (data.retcode !== 'SUCCESS' || data.handlestate === '3999') { coa_error_1.die.hint(`支付系统提示:${data.retmsg || data.handlemsg || ''}`); } // 校验签名(有签名才校验) if (data.sign) { const sourceStr = this.getSourceStr(coa_helper_1._.omit(data, ['sign'])); const verify = (0, crypto_1.createVerify)('rsa-sha1').update(sourceStr, 'utf8').verify(this.config.sybPublicKey, data.sign, 'base64'); verify || coa_error_1.die.hint('支付系统:返回结果校验失败'); } // 解析结果 try { const res = coa_helper_1.$.camelCaseKeys(coa_helper_1._.omit(data, ['appid', 'cusid', 'randomstr', 'retcode', 'retmsg', 'sign'])); if (res.records) { if (res.totalCount) { return { data: coa_helper_1.$.camelCaseKeys(JSON.parse(coa_secure_1.secure.base64_decode(res.records))), totalCount: res.totalCount, }; } else { return coa_helper_1.$.camelCaseKeys(JSON.parse(coa_secure_1.secure.base64_decode(res.records))); } } else if (res.imagebase64) { return res.imagebase64; } else { return coa_helper_1.$.camelCaseKeys(res); } } catch (e) { coa_error_1.die.hint('支付系统:返回结果解析失败'); } } getSourceStr(params) { const paramList = coa_helper_1._.map(params, (v, k) => `${k}=${typeof v === 'object' ? JSON.stringify(v) : v}`); paramList.sort(); return coa_helper_1._.join(paramList, '&'); } // 请求参数 getParams(param) { const appid = this.config.appId; const orgid = this.config.orgId; const cusid = param.cusId || orgid; const randomstr = (0, coa_helper_1.dayjs)().valueOf().toString(); const version = '11'; const signtype = 'RSA'; delete param.cusId; const params = { appid, orgid, cusid, randomstr, version, signtype, ...coa_helper_1._.pickBy(param, (v) => v !== '') }; // 计算签名 const sourceStr = this.getSourceStr(params); const sign = (0, crypto_1.createSign)('rsa-sha1').update(sourceStr, 'utf8').sign(this.config.sybPrivateKey, 'base64'); return { ...params, sign }; } } exports.AllinPaySybBin = AllinPaySybBin;