coa-allin-pay
Version:
通联支付SDK for Node.js
116 lines (115 loc) • 4.74 kB
JavaScript
;
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;