coa-dg-pay
Version:
这是一个轻量的汇付支付SDK服务商版 for Node.js
162 lines (161 loc) • 6.52 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.DgPayBin = void 0;
const coa_error_1 = require("coa-error");
const coa_helper_1 = require("coa-helper");
const crypto_1 = require("crypto");
const FormData = require("form-data");
const fs_1 = require("fs");
class DgPayBin {
constructor(config) {
this.thresholdTooLong = 2 * 1000;
this.config = config;
}
// 发送图片上传请求
async uploadFile(url, data, imagePath) {
const startAt = Date.now();
const buffer = imagePath && (0, fs_1.createReadStream)(imagePath);
if (imagePath) {
const form = new FormData();
form.append('file', buffer);
const param = {
sys_id: this.config.sys_id,
product_id: this.config.product_id,
data: data,
};
// 请求并记录开始、结束时间
const result = await (0, coa_helper_1.axios)({
url: this.config.endpoint + url,
method: 'POST',
params: param,
data: form,
headers: {
...form.getHeaders(),
},
});
const endAt = Date.now();
// 触发请求事件
this.onRequest(param, data, result.data);
// 触发请求时间过长事件
if (endAt - startAt > this.thresholdTooLong) {
this.onRequestTooLong(url, param, result.data, { startAt, endAt });
}
// 处理结果
try {
return this.handleResult(result);
}
catch (e) {
// 触发请求错误事件
this.onRequestError(url, param, result.data, e);
throw e;
}
}
}
// 发送请求
async request(url, data, unErrorCode) {
// 组装参数并请求
const params = this.buildParams(data);
const startAt = Date.now();
const result = await coa_helper_1.axios.post(this.config.endpoint + url, params, {
headers: {
'Content-type': 'application/json',
},
});
const endAt = Date.now();
// 触发请求事件
this.onRequest(params, data, result.data);
// 触发请求时间过长事件
if (endAt - startAt > this.thresholdTooLong) {
this.onRequestTooLong(url, params, result.data, { startAt, endAt });
}
// 处理结果
try {
return this.handleResult(result, unErrorCode);
}
catch (e) {
// 触发请求错误事件
this.onRequestError(url, params, result.data, e);
throw e;
}
}
// 请求记录
// eslint-disable-next-line @typescript-eslint/no-unused-vars
onRequest(params, content, response) {
// 重写方法
}
// 请求失败
// eslint-disable-next-line @typescript-eslint/no-unused-vars
onRequestError(url, params, response, error) {
// 重写方法
}
// 请求时间过长
onRequestTooLong(
// eslint-disable-next-line @typescript-eslint/no-unused-vars
url,
// 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) {
// 重写方法
}
// 构造请求参数
buildParams(data) {
// 构造
const params = {
sys_id: this.config.sys_id,
product_id: this.config.product_id,
data,
};
const sortData = {};
coa_helper_1._.forEach(Object.keys(data).sort(), (i) => (sortData[i] = data[i]));
const privateKey = `-----BEGIN PRIVATE KEY-----\n${this.config.privateKey}\n-----END PRIVATE KEY-----`;
const sign = (0, crypto_1.createSign)('RSA-SHA256').update(JSON.stringify(sortData), 'utf-8').sign(privateKey, 'base64');
params.sign = sign;
return params;
}
handleResult(res, unErrorCode) {
const data = res.data.data || {};
// 判断结果是否正确
const unErrorCodes = unErrorCode ? { '00000000': true, ...unErrorCode } : { '00000000': true };
if (!unErrorCodes[data.resp_code]) {
coa_error_1.CoaError.message('DgError', `汇付系统提示:[${data.resp_code}]${data.resp_desc}`);
}
// 校验签名(有签名才校验)
if (data.sign) {
const dgpublicKey = `-----BEGIN PUBLIC KEY-----\n${this.config.dgpublicKey}\n-----END PUBLIC KEY-----`;
const verify = (0, crypto_1.createVerify)('RSA-SHA256').update(JSON.stringify(data), 'utf8').verify(dgpublicKey, data.sign, 'base64');
verify || coa_error_1.CoaError.message('DgError', '汇付系统: 返回结果校验失败');
}
return data;
}
// eslint-disable-next-line @typescript-eslint/no-unused-vars
verifyAsyncSign(res, unErrorCode) {
const data = res.resp_data || {};
if (res.resp_code !== '00000000') {
coa_error_1.CoaError.message('DgError', `汇付系统提示:[${data.resp_code}]${data.resp_desc}`);
}
// 校验签名(有签名才校验)
if (res.sign) {
const dgpublicKey = `-----BEGIN PUBLIC KEY-----\n${this.config.dgpublicKey}\n-----END PUBLIC KEY-----`;
const verify = (0, crypto_1.createVerify)('RSA-SHA256').update(res.resp_data, 'utf8').verify(dgpublicKey, res.sign, 'base64');
verify || coa_error_1.CoaError.message('DgError', '汇付系统: 返回结果校验失败');
}
return data;
}
verifyAsyncBusiOpenSign(res) {
const data = res || {};
if (res.resp_code !== '10000') {
coa_error_1.CoaError.message('DgError', `汇付系统提示:[${data.resp_code}]${data.resp_desc}`);
}
// 校验签名(有签名才校验)
if (res.sign) {
const dgpublicKey = `-----BEGIN PUBLIC KEY-----\n${this.config.dgpublicKey}\n-----END PUBLIC KEY-----`;
const verify = (0, crypto_1.createVerify)('RSA-SHA256').update(res.data, 'utf8').verify(dgpublicKey, res.sign, 'base64');
verify || coa_error_1.CoaError.message('DgError', '汇付系统: 返回结果校验失败');
}
return data;
}
}
exports.DgPayBin = DgPayBin;