node-easywechat 2.6.10 → 2.8.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (66) hide show
  1. package/README.md +26 -3
  2. package/dist/BaseService/ContentSecurity/ContentSecurityClient.d.ts +5 -3
  3. package/dist/BaseService/ContentSecurity/ContentSecurityClient.js +2 -2
  4. package/dist/BaseService/Jssdk/JssdkClient.d.ts +15 -15
  5. package/dist/BaseService/Jssdk/JssdkClient.js +15 -15
  6. package/dist/BaseService/Media/MediaClient.d.ts +22 -20
  7. package/dist/BaseService/Media/MediaClient.js +14 -14
  8. package/dist/BaseService/Url/UrlClient.d.ts +1 -1
  9. package/dist/Core/AES.d.ts +46 -0
  10. package/dist/Core/AES.js +95 -0
  11. package/dist/Core/Encryptor.d.ts +2 -14
  12. package/dist/Core/Encryptor.js +9 -39
  13. package/dist/Core/Http/Request.js +2 -6
  14. package/dist/Core/Messages/Message.js +2 -16
  15. package/dist/Core/PKCS.d.ts +15 -0
  16. package/dist/Core/PKCS.js +44 -0
  17. package/dist/Core/RSA.d.ts +59 -0
  18. package/dist/Core/RSA.js +99 -0
  19. package/dist/Core/ServerGuard.d.ts +1 -1
  20. package/dist/Core/ServerGuard.js +5 -33
  21. package/dist/Core/Types.d.ts +24 -4
  22. package/dist/Core/Utils.d.ts +8 -2
  23. package/dist/Core/Utils.js +61 -20
  24. package/dist/MicroMerchant/Application.d.ts +27 -0
  25. package/dist/MicroMerchant/Application.js +105 -0
  26. package/dist/MicroMerchant/Base/MicroMerchantBase.d.ts +7 -0
  27. package/dist/MicroMerchant/Base/MicroMerchantBase.js +52 -0
  28. package/dist/MicroMerchant/Certficates/CertficatesClient.d.ts +5 -0
  29. package/dist/MicroMerchant/Certficates/CertficatesClient.js +52 -0
  30. package/dist/MicroMerchant/Core/BaseClient.d.ts +9 -0
  31. package/dist/MicroMerchant/Core/BaseClient.js +106 -0
  32. package/dist/MicroMerchant/Media/MediaClient.d.ts +6 -0
  33. package/dist/MicroMerchant/Media/MediaClient.js +33 -0
  34. package/dist/MicroMerchant/MerchantConfig/MerchantConfigClient.d.ts +8 -0
  35. package/dist/MicroMerchant/MerchantConfig/MerchantConfigClient.js +49 -0
  36. package/dist/MicroMerchant/Meterial/MeterialClient.d.ts +5 -0
  37. package/dist/MicroMerchant/Meterial/MeterialClient.js +30 -0
  38. package/dist/MicroMerchant/Withdraw/WithdrawClient.d.ts +5 -0
  39. package/dist/MicroMerchant/Withdraw/WithdrawClient.js +28 -0
  40. package/dist/MiniProgram/Application.d.ts +4 -0
  41. package/dist/MiniProgram/Application.js +10 -0
  42. package/dist/MiniProgram/Encryptor.js +2 -6
  43. package/dist/MiniProgram/PhoneNumber/PhoneNumberClient.d.ts +10 -0
  44. package/dist/MiniProgram/PhoneNumber/PhoneNumberClient.js +20 -0
  45. package/dist/MiniProgram/Union/UnionClient.d.ts +3 -0
  46. package/dist/MiniProgram/Union/UnionClient.js +9 -0
  47. package/dist/MiniProgram/UrlLink/UrlLinkClient.d.ts +4 -0
  48. package/dist/MiniProgram/UrlLink/UrlLinkClient.js +12 -0
  49. package/dist/Payment/Bill/BillClient.js +1 -1
  50. package/dist/Payment/Core/BaseClient.d.ts +0 -1
  51. package/dist/Payment/Core/BaseClient.js +2 -20
  52. package/dist/Payment/Jssdk/JssdkClient.d.ts +12 -0
  53. package/dist/Payment/Jssdk/JssdkClient.js +32 -0
  54. package/dist/Payment/Notify/Handler.js +3 -11
  55. package/dist/Payment/Notify/Refunded.d.ts +0 -1
  56. package/dist/Payment/Notify/Refunded.js +1 -11
  57. package/dist/Payment/Transfer/TransferClient.js +4 -3
  58. package/dist/Work/ExternalContact/Client.d.ts +146 -3
  59. package/dist/Work/ExternalContact/Client.js +156 -6
  60. package/dist/Work/ExternalContact/MessageClient.d.ts +45 -0
  61. package/dist/Work/ExternalContact/MessageClient.js +86 -0
  62. package/dist/index.d.ts +6 -0
  63. package/dist/index.js +2 -0
  64. package/node-easywechat.file_cache.easywechat.kernel.access_token.8a9684b45da7de42a06a70ba01a7005a.cache +1 -1
  65. package/node-easywechat.file_cache.easywechat.kernel.access_token.c3d06edaf326aad75d32f31348df787a.cache +1 -1
  66. package/package.json +4 -5
@@ -15,7 +15,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  const url_1 = __importDefault(require("url"));
16
16
  const Utils_1 = require("../Utils");
17
17
  const raw_body_1 = __importDefault(require("raw-body"));
18
- const xml2js_1 = __importDefault(require("xml2js"));
19
18
  class Request {
20
19
  constructor(req = null, content = null) {
21
20
  this._req = null;
@@ -42,17 +41,14 @@ class Request {
42
41
  this._content = Buffer.from(JSON.stringify(content));
43
42
  this._contentType = 'application/json';
44
43
  }
45
- else if (Utils_1.isString(content)) {
44
+ else if (typeof content === 'string') {
46
45
  try {
47
46
  this._post = JSON.parse(content);
48
47
  this._contentType = 'application/json';
49
48
  }
50
49
  catch (e) {
51
50
  if (content.substr(0, 1) === '<') {
52
- xml2js_1.default.parseString(content, (err, res) => {
53
- res = Utils_1.singleItem(res);
54
- if (res['xml'])
55
- res = res['xml'];
51
+ Utils_1.parseXml(content).then(res => {
56
52
  this._post = res;
57
53
  this._contentType = 'text/xml';
58
54
  });
@@ -1,10 +1,6 @@
1
1
  'use strict';
2
- var __importDefault = (this && this.__importDefault) || function (mod) {
3
- return (mod && mod.__esModule) ? mod : { "default": mod };
4
- };
5
2
  Object.defineProperty(exports, "__esModule", { value: true });
6
3
  exports.Message = void 0;
7
- const xml2js_1 = __importDefault(require("xml2js"));
8
4
  const Utils_1 = require("../Utils");
9
5
  class Message {
10
6
  constructor(attributes = {}) {
@@ -21,21 +17,11 @@ class Message {
21
17
  this.type = type;
22
18
  }
23
19
  transformToXml(appends = {}, returnAsObject = false) {
24
- let data = {
25
- xml: Utils_1.merge(Utils_1.merge({ MsgType: this.getType() }, this.toXmlArray()), appends)
26
- };
20
+ let data = Utils_1.merge(Utils_1.merge({ MsgType: this.getType() }, this.toXmlArray()), appends);
27
21
  if (returnAsObject) {
28
22
  return data;
29
23
  }
30
- let XmlBuilder = new xml2js_1.default.Builder({
31
- cdata: true,
32
- renderOpts: {
33
- pretty: false,
34
- indent: '',
35
- newline: '',
36
- }
37
- });
38
- return XmlBuilder.buildObject(data);
24
+ return Utils_1.buildXml(data);
39
25
  }
40
26
  toXmlArray() {
41
27
  throw new Error(`Class "${this.constructor.name}" cannot support transform to XML message.`);
@@ -0,0 +1,15 @@
1
+ /// <reference types="node" />
2
+ export declare class PKCS7 {
3
+ /**
4
+ * 对需要加密的明文进行填充补位
5
+ * @param text 需要进行填充补位操作的明文
6
+ * @param blockSize 补位大小,默认:32
7
+ */
8
+ static pad(text: string | Buffer, blockSize?: number): Buffer;
9
+ /**
10
+ * 删除解密后明文的补位字符
11
+ * @param text 解密后的明文
12
+ * @param blockSize 补位大小,默认:32
13
+ */
14
+ static unpad(text: string | Buffer, blockSize?: number): Buffer;
15
+ }
@@ -0,0 +1,44 @@
1
+ 'use strict';
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.PKCS7 = void 0;
4
+ class PKCS7 {
5
+ /**
6
+ * 对需要加密的明文进行填充补位
7
+ * @param text 需要进行填充补位操作的明文
8
+ * @param blockSize 补位大小,默认:32
9
+ */
10
+ static pad(text, blockSize = 32) {
11
+ let buf = null;
12
+ if (Buffer.isBuffer(text)) {
13
+ buf = text;
14
+ }
15
+ else {
16
+ buf = Buffer.from(text);
17
+ }
18
+ //计算需要填充的位数
19
+ let amountToPad = blockSize - (buf.length % blockSize);
20
+ let result = Buffer.alloc(amountToPad);
21
+ result.fill(amountToPad);
22
+ return Buffer.concat([buf, result]);
23
+ }
24
+ /**
25
+ * 删除解密后明文的补位字符
26
+ * @param text 解密后的明文
27
+ * @param blockSize 补位大小,默认:32
28
+ */
29
+ static unpad(text, blockSize = 32) {
30
+ let buf = null;
31
+ if (Buffer.isBuffer(text)) {
32
+ buf = text;
33
+ }
34
+ else {
35
+ buf = Buffer.from(text);
36
+ }
37
+ var pad = buf[buf.length - 1];
38
+ if (pad < 1 || pad > blockSize) {
39
+ pad = 0;
40
+ }
41
+ return buf.slice(0, buf.length - pad);
42
+ }
43
+ }
44
+ exports.PKCS7 = PKCS7;
@@ -0,0 +1,59 @@
1
+ /// <reference types="node" />
2
+ import crypto from 'crypto';
3
+ export default class RSA {
4
+ protected publicKey: crypto.KeyObject;
5
+ /**
6
+ * 设置公钥
7
+ * @param key 公钥内容
8
+ */
9
+ setPublicKey(key: string | crypto.KeyObject | Buffer | crypto.PublicKeyInput): void;
10
+ protected privateKey: crypto.KeyObject;
11
+ /**
12
+ * 设置私钥
13
+ * @param key 私钥内容
14
+ */
15
+ setPrivateKey(key: string | Buffer | crypto.PrivateKeyInput): void;
16
+ /**
17
+ * 生成密钥对
18
+ * @param options 密钥选项
19
+ * @returns
20
+ */
21
+ static keyPair(options: crypto.RSAKeyPairKeyObjectOptions): crypto.KeyPairKeyObjectResult;
22
+ /**
23
+ * 加密
24
+ * @param plaintext 待加密文本
25
+ * @param encoding 编码,默认:'base64'
26
+ * @param hashType 哈希方式,默认:'sha1'
27
+ * @param padding 补位方式,默认:crypto.constants.RSA_PKCS1_OAEP_PADDING
28
+ * @returns
29
+ */
30
+ encrypt(plaintext: string, encoding?: BufferEncoding, hashType?: string, padding?: number): string;
31
+ /**
32
+ * 解密
33
+ * @param ciphertext 待解密文本
34
+ * @param encoding 编码,默认:'base64'
35
+ * @param hashType 哈希方式,默认:'sha1'
36
+ * @param padding 补位方式,默认:crypto.constants.RSA_PKCS1_OAEP_PADDING
37
+ * @returns
38
+ */
39
+ decrypt(ciphertext: string, encoding?: BufferEncoding, hashType?: string, padding?: number): string;
40
+ /**
41
+ * 计算签名
42
+ * @param data 待解密文本
43
+ * @param hashType 哈希方式,默认:'sha256'
44
+ * @param encoding 编码,默认:'base64'
45
+ * @param padding 补位方式,默认:crypto.constants.RSA_PKCS1_PSS_PADDING
46
+ * @returns
47
+ */
48
+ sign(data: string, hashType?: string, encoding?: BufferEncoding, padding?: number): string;
49
+ /**
50
+ * 验证签名
51
+ * @param signature 待验证签名字符串
52
+ * @param data 待解密文本
53
+ * @param hashType 哈希方式,默认:'sha256'
54
+ * @param encoding 编码,默认:'base64'
55
+ * @param padding 补位方式,默认:crypto.constants.RSA_PKCS1_PSS_PADDING
56
+ * @returns
57
+ */
58
+ verify(signature: string, data: string, hashType: string, encoding?: BufferEncoding, padding?: number): boolean;
59
+ }
@@ -0,0 +1,99 @@
1
+ 'use strict';
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ const crypto_1 = __importDefault(require("crypto"));
7
+ class RSA {
8
+ constructor() {
9
+ this.publicKey = null;
10
+ this.privateKey = null;
11
+ }
12
+ /**
13
+ * 设置公钥
14
+ * @param key 公钥内容
15
+ */
16
+ setPublicKey(key) {
17
+ this.publicKey = crypto_1.default.createPublicKey(key);
18
+ }
19
+ /**
20
+ * 设置私钥
21
+ * @param key 私钥内容
22
+ */
23
+ setPrivateKey(key) {
24
+ this.privateKey = crypto_1.default.createPrivateKey(key);
25
+ }
26
+ /**
27
+ * 生成密钥对
28
+ * @param options 密钥选项
29
+ * @returns
30
+ */
31
+ static keyPair(options) {
32
+ return crypto_1.default.generateKeyPairSync('rsa', options);
33
+ }
34
+ /**
35
+ * 加密
36
+ * @param plaintext 待加密文本
37
+ * @param encoding 编码,默认:'base64'
38
+ * @param hashType 哈希方式,默认:'sha1'
39
+ * @param padding 补位方式,默认:crypto.constants.RSA_PKCS1_OAEP_PADDING
40
+ * @returns
41
+ */
42
+ encrypt(plaintext, encoding = 'base64', hashType = 'sha1', padding = crypto_1.default.constants.RSA_PKCS1_OAEP_PADDING) {
43
+ let encryptedData = crypto_1.default.publicEncrypt({
44
+ key: this.publicKey,
45
+ padding,
46
+ oaepHash: hashType,
47
+ }, Buffer.from(plaintext));
48
+ return encryptedData.toString(encoding);
49
+ }
50
+ /**
51
+ * 解密
52
+ * @param ciphertext 待解密文本
53
+ * @param encoding 编码,默认:'base64'
54
+ * @param hashType 哈希方式,默认:'sha1'
55
+ * @param padding 补位方式,默认:crypto.constants.RSA_PKCS1_OAEP_PADDING
56
+ * @returns
57
+ */
58
+ decrypt(ciphertext, encoding = 'base64', hashType = 'sha1', padding = crypto_1.default.constants.RSA_PKCS1_OAEP_PADDING) {
59
+ let decryptedData = crypto_1.default.privateDecrypt({
60
+ key: this.privateKey,
61
+ padding,
62
+ oaepHash: hashType,
63
+ }, Buffer.from(ciphertext, encoding));
64
+ return decryptedData.toString();
65
+ }
66
+ /**
67
+ * 计算签名
68
+ * @param data 待解密文本
69
+ * @param hashType 哈希方式,默认:'sha256'
70
+ * @param encoding 编码,默认:'base64'
71
+ * @param padding 补位方式,默认:crypto.constants.RSA_PKCS1_PSS_PADDING
72
+ * @returns
73
+ */
74
+ sign(data, hashType = 'sha256', encoding = 'base64', padding = crypto_1.default.constants.RSA_PKCS1_PSS_PADDING) {
75
+ let signature = crypto_1.default.sign(hashType, Buffer.from(data), {
76
+ key: this.privateKey,
77
+ padding,
78
+ });
79
+ return signature.toString(encoding);
80
+ }
81
+ /**
82
+ * 验证签名
83
+ * @param signature 待验证签名字符串
84
+ * @param data 待解密文本
85
+ * @param hashType 哈希方式,默认:'sha256'
86
+ * @param encoding 编码,默认:'base64'
87
+ * @param padding 补位方式,默认:crypto.constants.RSA_PKCS1_PSS_PADDING
88
+ * @returns
89
+ */
90
+ verify(signature, data, hashType, encoding = 'base64', padding = crypto_1.default.constants.RSA_PKCS1_PSS_PADDING) {
91
+ let isVerified = crypto_1.default.verify(hashType, Buffer.from(data), {
92
+ key: this.publicKey,
93
+ padding,
94
+ }, Buffer.from(signature, encoding));
95
+ return !!isVerified;
96
+ }
97
+ }
98
+ exports.default = RSA;
99
+ ;
@@ -27,6 +27,7 @@ export default class ServerGuard {
27
27
  * @param condition EasyWechat.Messages.Message.xxx,用于处理特定消息类型,默认:* 表示全部
28
28
  */
29
29
  push(handler: ServerHandler, condition?: string): void;
30
+ setHandlers(handlers?: ServerHandlers): void;
30
31
  protected dispatch(event: string, payload: any): Promise<any>;
31
32
  protected notify(event: string, payload: any): Promise<any>;
32
33
  protected _callHandler(handler: ServerHandler, payload: any): Promise<any>;
@@ -49,6 +50,5 @@ export default class ServerGuard {
49
50
  */
50
51
  getMessage(): Promise<object>;
51
52
  protected parseMessage(content: string): Promise<any>;
52
- protected parseXmlMessage(xml: any): Promise<any>;
53
53
  protected decryptMessage(message: object): Promise<string>;
54
54
  }
@@ -15,7 +15,6 @@ Object.defineProperty(exports, "__esModule", { value: true });
15
15
  const Response_1 = __importDefault(require("./Http/Response"));
16
16
  const Messages_1 = require("./Messages");
17
17
  const Utils_1 = require("./Utils");
18
- const xml2js_1 = __importDefault(require("xml2js"));
19
18
  const FinallResult_1 = __importDefault(require("./Decorators/FinallResult"));
20
19
  const TerminateResult_1 = __importDefault(require("./Decorators/TerminateResult"));
21
20
  class ServerGuard {
@@ -52,6 +51,9 @@ class ServerGuard {
52
51
  }
53
52
  this.handlers[condition].push(handler);
54
53
  }
54
+ setHandlers(handlers = {}) {
55
+ this.handlers = handlers;
56
+ }
55
57
  dispatch(event, payload) {
56
58
  return this.notify(event, payload);
57
59
  }
@@ -190,15 +192,7 @@ class ServerGuard {
190
192
  let res = message.transformToXml(prepends);
191
193
  if (yield this.isSafeMode()) {
192
194
  this.app['log']('Messages safe mode is enabled.');
193
- let XmlBuilder = new xml2js_1.default.Builder({
194
- cdata: true,
195
- renderOpts: {
196
- pretty: false,
197
- indent: '',
198
- newline: '',
199
- }
200
- });
201
- return XmlBuilder.buildObject(this.app['encryptor'].encrypt(res));
195
+ return this.app['encryptor'].encrypt(res);
202
196
  }
203
197
  return res;
204
198
  });
@@ -253,7 +247,7 @@ class ServerGuard {
253
247
  return {};
254
248
  }
255
249
  else if (0 === content.indexOf('<')) {
256
- content = yield this.parseXmlMessage(content);
250
+ content = yield Utils_1.parseXml(content);
257
251
  }
258
252
  else {
259
253
  // Handle JSON format.
@@ -269,28 +263,6 @@ class ServerGuard {
269
263
  }
270
264
  });
271
265
  }
272
- parseXmlMessage(xml) {
273
- return new Promise((resolve, reject) => {
274
- xml2js_1.default.parseString(xml, (err, result) => {
275
- if (err) {
276
- reject(err);
277
- }
278
- else {
279
- let message;
280
- if (result && result.xml) {
281
- message = {};
282
- for (let k in result.xml) {
283
- message[k] = result.xml[k][0];
284
- }
285
- }
286
- resolve(message);
287
- }
288
- });
289
- })
290
- .catch((err) => {
291
- this.app['log']('server.parseMessage()', err);
292
- });
293
- }
294
266
  decryptMessage(message) {
295
267
  return __awaiter(this, void 0, void 0, function* () {
296
268
  return this.app['encryptor'].decrypt(message['Encrypt'], yield this.app['request'].get('msg_signature'), yield this.app['request'].get('nonce'), yield this.app['request'].get('timestamp'));
@@ -79,7 +79,7 @@ export declare interface EasyWechatConfig {
79
79
  oauth?: EasyWechatConfigOauth;
80
80
  /**
81
81
  * 微信支付签名密钥
82
- * @scope Payment
82
+ * @scope Payment | MicroMerchant
83
83
  */
84
84
  key?: string;
85
85
  /**
@@ -89,17 +89,17 @@ export declare interface EasyWechatConfig {
89
89
  sub_appid?: string;
90
90
  /**
91
91
  * 商户号
92
- * @scope Payment
92
+ * @scope Payment | MicroMerchant
93
93
  */
94
94
  mch_id?: string;
95
95
  /**
96
96
  * 子商户号
97
- * @scope Payment
97
+ * @scope Payment | MicroMerchant
98
98
  */
99
99
  sub_mch_id?: string;
100
100
  /**
101
101
  * pfx 证书路径(敏感接口(如退款、发送红包等)需要)
102
- * @scope Payment
102
+ * @scope Payment | MicroMerchant
103
103
  */
104
104
  cert_path?: string;
105
105
  /**
@@ -122,6 +122,26 @@ export declare interface EasyWechatConfig {
122
122
  * @scope Payment
123
123
  */
124
124
  sandbox?: boolean;
125
+ /**
126
+ * 获取证书接口获取到的平台证书序列号
127
+ * @scope MicroMerchant
128
+ */
129
+ serial_no?: string;
130
+ /**
131
+ * 获取证书接口获取到的证书内容
132
+ * @scope MicroMerchant
133
+ */
134
+ certificate?: string;
135
+ /**
136
+ * 服务商的公众账号 ID
137
+ * @scope MicroMerchant
138
+ */
139
+ appid?: string;
140
+ /**
141
+ * APIv3 密钥
142
+ * @scope MicroMerchant
143
+ */
144
+ apiv3_key?: string;
125
145
  /**
126
146
  * 刷新token
127
147
  * @scope OpenPlatform
@@ -1,6 +1,12 @@
1
+ import Stream from 'stream';
1
2
  export declare const merge: (target: any, source: any) => any;
2
3
  export declare const createHash: (str: string, type?: string) => any;
3
4
  export declare const createHmac: (str: string, key: string, type?: string) => any;
5
+ /**
6
+ * 计算文件的 md5 值
7
+ * @param path 文件路径或文件可读流
8
+ */
9
+ export declare const md5File: (path: string | Stream.Readable) => Promise<string>;
4
10
  export declare const getTimestamp: (datetime?: string) => number;
5
11
  export declare const buildQueryString: (data: object, options?: object) => string;
6
12
  export declare const parseQueryString: (data: string, options?: object) => object;
@@ -21,5 +27,5 @@ export declare const strLcwords: (str: string) => string;
21
27
  export declare const strStudly: (value: string) => string;
22
28
  export declare const strCamel: (value: string) => string;
23
29
  export declare const singleItem: (obj: any) => any;
24
- export declare const AesDecrypt: (ciphertext: any, key: any, iv?: string, method?: string) => string;
25
- export declare const AesEncrypt: (data: any, key: any, iv?: string, method?: string) => string;
30
+ export declare const parseXml: (xml: string) => Promise<any>;
31
+ export declare const buildXml: (data: object, rootName?: string) => string;
@@ -1,11 +1,23 @@
1
1
  'use strict';
2
+ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
3
+ function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
4
+ return new (P || (P = Promise))(function (resolve, reject) {
5
+ function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
6
+ function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
7
+ function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
8
+ step((generator = generator.apply(thisArg, _arguments || [])).next());
9
+ });
10
+ };
2
11
  var __importDefault = (this && this.__importDefault) || function (mod) {
3
12
  return (mod && mod.__esModule) ? mod : { "default": mod };
4
13
  };
5
14
  Object.defineProperty(exports, "__esModule", { value: true });
6
- exports.AesEncrypt = exports.AesDecrypt = exports.singleItem = exports.strCamel = exports.strStudly = exports.strLcwords = exports.strUcwords = exports.applyMixins = exports.inArray = exports.isIp = exports.isIpv6 = exports.isIpv4 = exports.isFunction = exports.isObject = exports.isNumber = exports.isArray = exports.isString = exports.makeSignature = exports.randomString = exports.parseQueryString = exports.buildQueryString = exports.getTimestamp = exports.createHmac = exports.createHash = exports.merge = void 0;
15
+ exports.buildXml = exports.parseXml = exports.singleItem = exports.strCamel = exports.strStudly = exports.strLcwords = exports.strUcwords = exports.applyMixins = exports.inArray = exports.isIp = exports.isIpv6 = exports.isIpv4 = exports.isFunction = exports.isObject = exports.isNumber = exports.isArray = exports.isString = exports.makeSignature = exports.randomString = exports.parseQueryString = exports.buildQueryString = exports.getTimestamp = exports.md5File = exports.createHmac = exports.createHash = exports.merge = void 0;
7
16
  const crypto_1 = __importDefault(require("crypto"));
8
17
  const qs_1 = __importDefault(require("qs"));
18
+ const xml2js_1 = __importDefault(require("xml2js"));
19
+ const stream_1 = __importDefault(require("stream"));
20
+ const fs_1 = __importDefault(require("fs"));
9
21
  const merge = (target, source) => {
10
22
  if (exports.isObject(source)) {
11
23
  if (source.constructor !== Object) {
@@ -43,6 +55,31 @@ const createHmac = function (str, key, type = 'sha256') {
43
55
  return crypto_1.default.createHmac(type, key).update(str).digest('hex');
44
56
  };
45
57
  exports.createHmac = createHmac;
58
+ /**
59
+ * 计算文件的 md5 值
60
+ * @param path 文件路径或文件可读流
61
+ */
62
+ const md5File = function (path) {
63
+ return new Promise((reslove, reject) => {
64
+ let stream;
65
+ if (exports.isString(path)) {
66
+ stream = fs_1.default.createReadStream(path);
67
+ }
68
+ else {
69
+ stream = new stream_1.default.PassThrough();
70
+ path.pipe(stream);
71
+ }
72
+ let md5sum = crypto_1.default.createHash('md5');
73
+ stream.on('data', function (chunk) {
74
+ md5sum.update(chunk);
75
+ });
76
+ stream.on('end', function () {
77
+ let str = md5sum.digest('hex').toUpperCase();
78
+ reslove(str);
79
+ });
80
+ });
81
+ };
82
+ exports.md5File = md5File;
46
83
  const getTimestamp = function (datetime = null) {
47
84
  let time;
48
85
  try {
@@ -208,22 +245,26 @@ const singleItem = function (obj) {
208
245
  return obj;
209
246
  };
210
247
  exports.singleItem = singleItem;
211
- const AesDecrypt = function (ciphertext, key, iv = '', method = 'AES-256-ECB') {
212
- iv = iv || '';
213
- var decipher = crypto_1.default.createDecipheriv(method, key, iv);
214
- decipher.setAutoPadding(true);
215
- var plaintext = decipher.update(ciphertext, 'base64', 'utf8');
216
- plaintext += decipher.final('utf8');
217
- return plaintext;
218
- };
219
- exports.AesDecrypt = AesDecrypt;
220
- const AesEncrypt = function (data, key, iv = '', method = 'AES-256-ECB') {
221
- iv = iv || '';
222
- var chunks = [];
223
- var cipher = crypto_1.default.createCipheriv(method, key, iv);
224
- cipher.setAutoPadding(true);
225
- chunks.push(cipher.update(data, 'utf8', 'base64'));
226
- chunks.push(cipher.final('base64'));
227
- return chunks.join('');
228
- };
229
- exports.AesEncrypt = AesEncrypt;
248
+ const parseXml = function (xml) {
249
+ return __awaiter(this, void 0, void 0, function* () {
250
+ let res = yield xml2js_1.default.parseStringPromise(xml);
251
+ res = exports.singleItem(res);
252
+ if (res['xml'])
253
+ res = res['xml'];
254
+ return res;
255
+ });
256
+ };
257
+ exports.parseXml = parseXml;
258
+ const buildXml = function (data, rootName = 'xml') {
259
+ let XmlBuilder = new xml2js_1.default.Builder({
260
+ cdata: true,
261
+ rootName,
262
+ renderOpts: {
263
+ pretty: false,
264
+ indent: '',
265
+ newline: '',
266
+ }
267
+ });
268
+ return XmlBuilder.buildObject(data);
269
+ };
270
+ exports.buildXml = buildXml;
@@ -0,0 +1,27 @@
1
+ import BaseApplication from '../Core/BaseApplication';
2
+ import { EasyWechatConfig } from '../Core/Types';
3
+ import MicroMerchantBase from './Base/MicroMerchantBase';
4
+ import CertficatesClient from './Certficates/CertficatesClient';
5
+ import MediaClient from './Media/MediaClient';
6
+ import MerchantConfigClient from './MerchantConfig/MerchantConfigClient';
7
+ import MeterialClient from './Meterial/MeterialClient';
8
+ import WithdrawClient from './Withdraw/WithdrawClient';
9
+ export default class MicroMerchant extends BaseApplication {
10
+ protected defaultConfig: EasyWechatConfig;
11
+ base: MicroMerchantBase;
12
+ certficates: CertficatesClient;
13
+ media: MediaClient;
14
+ merchantConfig: MerchantConfigClient;
15
+ material: MeterialClient;
16
+ withdraw: WithdrawClient;
17
+ constructor(config?: EasyWechatConfig, prepends?: Object, id?: String);
18
+ registerProviders(): void;
19
+ getKey(): string;
20
+ setSubMchId(subMchId: string, appId?: string): this;
21
+ setCertificate(certificate: string, serialNo?: string): this;
22
+ verifySignature(data: object): boolean;
23
+ submitApplication(): Promise<any>;
24
+ getStatus(): Promise<any>;
25
+ upgrade(): Promise<any>;
26
+ getUpgradeStatus(): Promise<any>;
27
+ }