UNPKG

coa-dg-pay

Version:

这是一个轻量的汇付支付SDK服务商版 for Node.js

162 lines (161 loc) 6.52 kB
"use strict"; 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;