Skip to content

Commit 5197829

Browse files
feat: move the merchant{key,cert} inside transformer.signer, affect per APIv2 request
1 parent f09f4ea commit 5197829

File tree

2 files changed

+13
-12
lines changed

2 files changed

+13
-12
lines changed

lib/decorator.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
const assert = require('assert');
2-
const https = require('https');
32
const debuglog = require('util').debuglog('wechatpay:decorator');
43

54
const { default: axios, mergeConfig, AxiosHeaders } = require('axios');
@@ -78,7 +77,6 @@ class Decorator {
7877
* @returns {AxiosInstance} - The axios instance
7978
*/
8079
static xmlBased(config = {}) {
81-
const httpsAgent = utils.isObject(config.merchant) ? new https.Agent(config.merchant) : undefined;
8280
const { mchid, secret } = config;
8381

8482
let key;
@@ -91,16 +89,15 @@ class Decorator {
9189
const trans = new Transformer(mchid, key);
9290

9391
const cfg = mergeConfig(mergeConfig(this.defaults, config), {
94-
httpsAgent,
9592
headers: {
9693
'Content-Type': 'text/xml; charset=utf-8',
97-
Accept: 'text/xml, text/plain, application/x-gzip',
94+
Accept: 'text/xml, text/plain, application/json, application/x-gzip',
9895
},
9996
responseType: 'text',
10097
transformRequest: [].concat(trans.request),
10198
transformResponse: [].concat(trans.response),
10299
});
103-
['merchant', 'serial', 'privateKey', 'certs'].forEach((prop) => Reflect.deleteProperty(cfg, prop));
100+
['serial', 'privateKey', 'certs'].forEach((prop) => Reflect.deleteProperty(cfg, prop));
104101

105102
const instance = axios.create(cfg);
106103
instance.interceptors.response.use(this.responseDetectorInterceptor());

lib/transformer.js

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
const assert = require('assert');
2+
const https = require('https');
23
const { XMLParser, XMLBuilder } = require('fast-xml-parser');
34
const utils = require('./utils');
45
const Hash = require('./hash');
@@ -117,19 +118,19 @@ class Transformer {
117118
const key = this[SECRET];
118119
const mch = this[MCHID];
119120

120-
/**
121-
* @param {object} data - The API request parameters
122-
* @return {object} - With data signature
123-
*/
124121
return function signer(data) {
122+
if (this.security && utils.isObject(this.merchant) && utils.isString(this.baseURL) && this.baseURL.startsWith('https://')) {
123+
Reflect.set(this, 'httpsAgent', new https.Agent(this.merchant));
124+
}
125+
Reflect.deleteProperty(this, 'merchant');
126+
125127
const methodIsGet = isGetRequest(this);
126128
if (!methodIsGet && data === undefined) { throw new TypeError('The payload(data) must be an object or Buffer or Stream.'); }
127129
if (!methodIsGet && !utils.isObject(data)) { return data; }
128130

129131
const inter = methodIsGet ? new URLSearchParams(this.params) : new Map(Object.entries(data));
130-
const type = inter.get('sign_type') || Hash.ALGO_MD5;
131-
const mchid = inter.get('mch_id') || inter.get('mchid') || inter.get('combine_mch_id');
132132

133+
const mchid = inter.get('mch_id') || inter.get('mchid') || inter.get('combine_mch_id');
133134
if (mch) {
134135
assert.ok(mch === mchid, `The ${methodIsGet ? 'params' : 'data'}'s merchant ID(${mchid}) doesn't matched the init one(${mch})`);
135136
}
@@ -138,7 +139,10 @@ class Transformer {
138139
inter.set('nonce_str', Formatter.nonce());
139140
}
140141

141-
inter.set('sign', Hash.sign(type, Object.fromEntries(inter.entries()), key));
142+
const type = inter.get('sign_type');
143+
inter.set('sign', Hash.sign(
144+
[Hash.ALGO_MD5, Hash.ALGO_HMAC_SHA256].includes(type) ? type : Hash.ALGO_MD5, Object.fromEntries(inter.entries()), key,
145+
));
142146

143147
return methodIsGet ? data : Object.fromEntries(inter.entries());
144148
};

0 commit comments

Comments
 (0)