wechat-pay 1.0.1

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.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: e659dc3c1801cab85da470df5087895bd4a12e43d428f8fad282d2aba84022d2
4
+ data.tar.gz: f21c6f6ce72180bd0506bce69d2aae1e539dfbfbc1ddd69fc809d83719faa5f1
5
+ SHA512:
6
+ metadata.gz: 7e1ac7d823df910753d26f52df615e82cef3ebaa8109dd299009fca5be48f7062361af7b2698a9b4a00fa4afc08d7ea8417677fb396e189d8efea54f309b5ad0
7
+ data.tar.gz: d6ec25bc79c1d1a96f0a9292b5045b7d52ebe41d0ba5c1cd50bd0cc8b6224460834833437f33d965225cce6190f74a5218ddcdace289b1702552bb79c6965cd5
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ WechatPay.apiclient_key = File.read('./apiclient_key.pem')
4
+ WechatPay.platform_cert = File.read('platform_cert.pem')
5
+ WechatPay.apiclient_cert = File.read('apiclient_cert.pem')
6
+ WechatPay.app_id = 'wxf50e9a05a23a7624'
7
+ WechatPay.mch_id = '1607189890'
8
+ WechatPay.mch_key = 'b76a5cc5fae2d222dba6caf5537204c4'
data/lib/wechat-pay.rb ADDED
@@ -0,0 +1,42 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'restclient'
4
+ require 'wechat-pay/sign'
5
+ require 'wechat-pay/direct' # 直连模式
6
+ require 'wechat-pay/ecommerce' # 电商平台
7
+
8
+ # # 微信支付
9
+ #
10
+ # 设置关键信息
11
+
12
+ module WechatPay
13
+ class<< self
14
+ attr_accessor :app_id, :mch_id, :mch_key
15
+ attr_reader :apiclient_key, :apiclient_cert, :platform_cert
16
+
17
+ # 设置商户私钥,从微信商户平台下载
18
+ def apiclient_key=(key)
19
+ @apiclient_key = OpenSSL::PKey::RSA.new(key)
20
+ end
21
+
22
+ # 设置平台证书,通过接口获取 https://github.com/lanzhiheng/wechat-pay/blob/master/lib/wechat-pay/ecommerce/applyment.rb#L116
23
+ def platform_cert=(cert)
24
+ @platform_cert = OpenSSL::X509::Certificate.new(cert)
25
+ end
26
+
27
+ # 设置商户证书,从微信商户平台下载
28
+ def apiclient_cert=(cert)
29
+ @apiclient_cert = OpenSSL::X509::Certificate.new(cert)
30
+ end
31
+
32
+ # 平台证书序列号
33
+ def platform_serial_no
34
+ @platform_serial_no ||= platform_cert.serial.to_s(16)
35
+ end
36
+
37
+ # 商户证书序列号
38
+ def apiclient_serial_no
39
+ @apiclient_serial_no ||= apiclient_cert.serial.to_s(16)
40
+ end
41
+ end
42
+ end
@@ -0,0 +1,611 @@
1
+ require 'json'
2
+ require 'wechat-pay/helper'
3
+
4
+ module WechatPay
5
+ # # 直连商户相关接口封装(常用的已有,待完善)
6
+ # 文档: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_1.shtml
7
+ module Direct
8
+ include WechatPayHelper
9
+
10
+ class<<self
11
+ INVOKE_COMBINE_TRANSACTIONS_IN_APP_FIELDS = %i[combine_out_trade_no scene_info sub_orders notify_url].freeze # :nodoc:
12
+ #
13
+ # 直连合单app下单
14
+ #
15
+ # TODO: 与电商平台类似,只是参数不同,稍后重构
16
+ #
17
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_1.shtml
18
+ #
19
+ # Example:
20
+ #
21
+ # ``` ruby
22
+ # params = {
23
+ # combine_out_trade_no: 'combine_out_trade_no',
24
+ # combine_payer_info: {
25
+ # openid: 'client open id'
26
+ # },
27
+ # sub_orders: [
28
+ # {
29
+ # mchid: 'mchid',
30
+ # sub_mchid: 'sub mchid',
31
+ # attach: 'attach',
32
+ # amount: {
33
+ # total_amount: 100,
34
+ # currency: 'CNY'
35
+ # },
36
+ # out_trade_no: 'out_trade_no',
37
+ # description: 'description'
38
+ # }
39
+ # ],
40
+ # notify_url: 'the_url'
41
+ # }
42
+ #
43
+ # WechatPay::Direct.invoke_combine_transactions_in_app(params)
44
+ # ```
45
+ def invoke_combine_transactions_in_app(params)
46
+ WechatPay::Ecommerce.invoke_combine_transactions_in_app(params)
47
+ end
48
+
49
+ INVOKE_COMBINE_TRANSACTIONS_IN_JS_FIELDS = %i[combine_out_trade_no scene_info sub_orders notify_url].freeze # :nodoc:
50
+ #
51
+ # 直连合单js下单
52
+ #
53
+ # TODO: 与电商平台类似,只是参数不同,稍后重构
54
+ #
55
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_3.shtml
56
+ #
57
+ # Example:
58
+ #
59
+ # ``` ruby
60
+ # params = {
61
+ # combine_out_trade_no: 'combine_out_trade_no',
62
+ # combine_payer_info: {
63
+ # openid: 'client open id'
64
+ # },
65
+ # sub_orders: [
66
+ # {
67
+ # mchid: 'mchid',
68
+ # sub_mchid: 'sub mchid',
69
+ # attach: 'attach',
70
+ # amount: {
71
+ # total_amount: 100,
72
+ # currency: 'CNY'
73
+ # },
74
+ # out_trade_no: 'out_trade_no',
75
+ # description: 'description'
76
+ # }
77
+ # ],
78
+ # notify_url: 'the_url'
79
+ # }
80
+ #
81
+ # WechatPay::Direct.invoke_combine_transactions_in_js(params)
82
+ # ```
83
+ def invoke_combine_transactions_in_js(params)
84
+ WechatPay::Ecommerce.invoke_combine_transactions_in_js(params)
85
+ end
86
+
87
+ INVOKE_COMBINE_TRANSACTIONS_IN_H5_FIELDS = %i[combine_out_trade_no scene_info sub_orders notify_url].freeze # :nodoc:
88
+ #
89
+ # 直连合单h5下单
90
+ #
91
+ # TODO: 与电商平台类似,只是参数不同,稍后重构
92
+ #
93
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_2.shtml
94
+ #
95
+ # Example:
96
+ #
97
+ # ``` ruby
98
+ # params = {
99
+ # combine_out_trade_no: 'combine_out_trade_no',
100
+ # sub_orders: [
101
+ # {
102
+ # mchid: 'mchid',
103
+ # sub_mchid: 'sub mchid',
104
+ # attach: 'attach',
105
+ # amount: {
106
+ # total_amount: 100,
107
+ # currency: 'CNY'
108
+ # },
109
+ # out_trade_no: 'out_trade_no',
110
+ # description: 'description'
111
+ # }
112
+ # ],
113
+ # notify_url: 'the_url'
114
+ # }
115
+ #
116
+ # WechatPay::Direct.invoke_combine_transactions_in_h5(params)
117
+ # ```
118
+ def invoke_combine_transactions_in_h5(params)
119
+ WechatPay::Ecommerce.invoke_combine_transactions_in_h5(params)
120
+ end
121
+
122
+ INVOKE_COMBINE_TRANSACTIONS_IN_MINIPROGRAM_FIELDS = %i[combine_out_trade_no scene_info sub_orders notify_url].freeze # :nodoc:
123
+ #
124
+ # 直连合单小程序下单
125
+ #
126
+ # TODO: 与电商平台类似,只是参数不同,稍后重构
127
+ #
128
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_4.shtml
129
+ #
130
+ # Example:
131
+ #
132
+ # ``` ruby
133
+ # params = {
134
+ # combine_out_trade_no: 'combine_out_trade_no',
135
+ # combine_payer_info: {
136
+ # openid: 'client open id'
137
+ # },
138
+ # sub_orders: [
139
+ # {
140
+ # mchid: 'mchid',
141
+ # sub_mchid: 'sub mchid',
142
+ # attach: 'attach',
143
+ # amount: {
144
+ # total_amount: 100,
145
+ # currency: 'CNY'
146
+ # },
147
+ # out_trade_no: 'out_trade_no',
148
+ # description: 'description'
149
+ # }
150
+ # ],
151
+ # notify_url: 'the_url'
152
+ # }
153
+ #
154
+ # WechatPay::Direct.invoke_combine_transactions_in_miniprogram(params)
155
+ # ```
156
+ def invoke_combine_transactions_in_miniprogram(params)
157
+ WechatPay::Ecommerce.invoke_combine_transactions_in_miniprogram(params)
158
+ end
159
+
160
+ INVOKE_COMBINE_TRANSACTIONS_IN_NATIVE_FIELDS = %i[combine_out_trade_no scene_info sub_orders notify_url].freeze # :nodoc:
161
+ #
162
+ # 直连合单native下单
163
+ #
164
+ # TODO: 与电商平台类似,只是参数不同,稍后重构
165
+ #
166
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter5_1_5.shtml
167
+ #
168
+ # Example:
169
+ #
170
+ # ``` ruby
171
+ # params = {
172
+ # combine_out_trade_no: 'combine_out_trade_no',
173
+ # sub_orders: [
174
+ # {
175
+ # mchid: 'mchid',
176
+ # sub_mchid: 'sub mchid',
177
+ # attach: 'attach',
178
+ # amount: {
179
+ # total_amount: 100,
180
+ # currency: 'CNY'
181
+ # },
182
+ # out_trade_no: 'out_trade_no',
183
+ # description: 'description'
184
+ # }
185
+ # ],
186
+ # notify_url: 'the_url'
187
+ # }
188
+ #
189
+ # WechatPay::Direct.invoke_combine_transactions_in_native(params)
190
+ # ```
191
+ def invoke_combine_transactions_in_native(params)
192
+ WechatPay::Ecommerce.invoke_combine_transactions_in_native(params)
193
+ end
194
+
195
+ QUERY_COMBINE_ORDER_FIELDS = %i[combine_out_trade_no].freeze # :nodoc:
196
+ #
197
+ # 合单查询
198
+ #
199
+ # TODO: 与电商平台相同,稍后重构
200
+ #
201
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_11.shtml
202
+ #
203
+ # ``` ruby
204
+ # WechatPay::Direct.query_order(combine_out_trade_no: 'C202104302474')
205
+ # ```
206
+ #
207
+ def query_combine_order(params)
208
+ combine_out_trade_no = params.delete(:combine_out_trade_no)
209
+
210
+ url = "/v3/combine-transactions/out-trade-no/#{combine_out_trade_no}"
211
+
212
+ method = 'GET'
213
+
214
+ make_request(
215
+ method: method,
216
+ path: url,
217
+ extra_headers: {
218
+ 'Content-Type' => 'application/x-www-form-urlencoded'
219
+ }
220
+ )
221
+ end
222
+
223
+ CLOSE_COMBINE_ORDER_FIELDS = %i[combine_out_trade_no sub_orders].freeze # :nodoc:
224
+ #
225
+ # 关闭合单
226
+ #
227
+ # TODO: 与电商平台相同,稍后重构
228
+ #
229
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3_partner/apis/chapter7_3_11.shtml
230
+ #
231
+ # ``` ruby
232
+ # WechatPay::Direct.close_combine_order(combine_out_trade_no: 'C202104302474')
233
+ # ```
234
+ def close_combine_order(params)
235
+ combine_out_trade_no = params.delete(:combine_out_trade_no)
236
+
237
+ url = "/v3/combine-transactions/out-trade-no/#{combine_out_trade_no}/close"
238
+
239
+ payload = {
240
+ combine_appid: WechatPay.app_id
241
+ }.merge(params)
242
+
243
+ payload_json = payload.to_json
244
+
245
+ method = 'POST'
246
+
247
+ make_request(
248
+ method: method,
249
+ for_sign: payload_json,
250
+ payload: payload_json,
251
+ path: url
252
+ )
253
+ end
254
+
255
+ INVOKE_TRANSACTIONS_IN_JS_FIELDS = %i[description out_trade out_trade_no payer amount notify_url].freeze # :nodoc:
256
+ #
257
+ # 直连js下单
258
+ #
259
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_1_1.shtml
260
+ #
261
+ # Example:
262
+ #
263
+ # ``` ruby
264
+ # params = {
265
+ # appid: 'Your Open id',
266
+ # mchid: 'Your Mch id'',
267
+ # description: '回流',
268
+ # out_trade_no: 'Checking',
269
+ # payer: {
270
+ # openid: 'oly6s5c'
271
+ # },
272
+ # amount: {
273
+ # total: 1
274
+ # },
275
+ # notify_url: ENV['NOTIFICATION_URL']
276
+ # }
277
+ #
278
+ # WechatPay::Direct.invoke_transactions_in_js(params)
279
+ # ```
280
+ def invoke_transactions_in_js(params)
281
+ direct_transactions_method_by_suffix('jsapi', params)
282
+ end
283
+
284
+ INVOKE_TRANSACTIONS_IN_MINIPROGRAM_FIELDS = %i[description out_trade out_trade_no payer amount notify_url].freeze # :nodoc:
285
+ #
286
+ # 直连小程序下单
287
+ #
288
+ # Document:https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_1.shtml
289
+ #
290
+ # Example:
291
+ #
292
+ # ``` ruby
293
+ # params = {
294
+ # appid: 'Your Open id',
295
+ # mchid: 'Your Mch id'',
296
+ # description: '回流',
297
+ # out_trade_no: 'Checking',
298
+ # payer: {
299
+ # openid: 'oly6s5c'
300
+ # },
301
+ # amount: {
302
+ # total: 1
303
+ # },
304
+ # notify_url: ENV['NOTIFICATION_URL']
305
+ # }
306
+ #
307
+ # WechatPay::Direct.invoke_transactions_in_miniprogram(params)
308
+ # ```
309
+ def invoke_transactions_in_miniprogram(params)
310
+ direct_transactions_method_by_suffix('jsapi', params)
311
+ end
312
+
313
+ INVOKE_TRANSACTIONS_IN_APP_FIELDS = %i[description out_trade out_trade_no payer amount notify_url].freeze # :nodoc:
314
+ #
315
+ # 直连APP下单
316
+ #
317
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_2_1.shtml
318
+ #
319
+ # Example:
320
+ #
321
+ # ``` ruby
322
+ # params = {
323
+ # appid: 'Your Open id',
324
+ # mchid: 'Your Mch id'',
325
+ # description: '回流',
326
+ # out_trade_no: 'Checking',
327
+ # payer: {
328
+ # openid: 'oly6s5c'
329
+ # },
330
+ # amount: {
331
+ # total: 1
332
+ # },
333
+ # notify_url: ENV['NOTIFICATION_URL']
334
+ # }
335
+ #
336
+ # WechatPay::Direct.invoke_transactions_in_app(params)
337
+ # ```
338
+ def invoke_transactions_in_app(params)
339
+ direct_transactions_method_by_suffix('app', params)
340
+ end
341
+
342
+ INVOKE_TRANSACTIONS_IN_H5_FIELDS = %i[description out_trade out_trade_no payer amount notify_url].freeze # :nodoc:
343
+ #
344
+ # 直连h5下单
345
+ #
346
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_3_1.shtml
347
+ #
348
+ # Example:
349
+ #
350
+ # ```
351
+ # params = {
352
+ # appid: 'Your Open id',
353
+ # mchid: 'Your Mch id'',
354
+ # description: '回流',
355
+ # out_trade_no: 'Checking',
356
+ # payer: {
357
+ # openid: 'oly6s5c'
358
+ # },
359
+ # amount: {
360
+ # total: 1
361
+ # },
362
+ # notify_url: ENV['NOTIFICATION_URL']
363
+ # }
364
+ #
365
+ # WechatPay::Direct.invoke_transactions_in_h5(params)
366
+ # ```
367
+ def invoke_transactions_in_h5(params)
368
+ direct_transactions_method_by_suffix('h5', params)
369
+ end
370
+
371
+ INVOKE_TRANSACTIONS_IN_NATIVE_FIELDS = %i[description out_trade out_trade_no payer amount notify_url].freeze # :nodoc:
372
+ #
373
+ # 直连native下单
374
+ #
375
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_4_1.shtml
376
+ #
377
+ # Example:
378
+ #
379
+ # ``` ruby
380
+ # params = {
381
+ # appid: 'Your Open id',
382
+ # mchid: 'Your Mch id'',
383
+ # description: '回流',
384
+ # out_trade_no: 'Checking',
385
+ # payer: {
386
+ # openid: 'oly6s5c'
387
+ # },
388
+ # amount: {
389
+ # total: 1
390
+ # },
391
+ # notify_url: ENV['NOTIFICATION_URL']
392
+ # }
393
+ #
394
+ # WechatPay::Direct.invoke_transactions_in_native(params)
395
+ # ```
396
+ def invoke_transactions_in_native(params)
397
+ direct_transactions_method_by_suffix('native', params)
398
+ end
399
+
400
+ QUERY_ORDER_FIELDS = %i[out_trade_no transaction_id].freeze # :nodoc:
401
+ #
402
+ # 直连订单查询
403
+ #
404
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_2.shtml
405
+ #
406
+ # Example:
407
+ #
408
+ # ``` ruby
409
+ # WechatPay::Direct.query_order(transaction_id: '4323400972202104305133344444') # by transaction_id
410
+ # WechatPay::Direct.query_order(out_trade_no: 'N202104302474') # by out_trade_no
411
+ # ```
412
+ #
413
+ def query_order(params)
414
+ if params[:transaction_id]
415
+ params.delete(:out_trade_no)
416
+ transaction_id = params.delete(:transaction_id)
417
+ path = "/v3/pay/transactions/id/#{transaction_id}"
418
+ else
419
+ params.delete(:transaction_id)
420
+ out_trade_no = params.delete(:out_trade_no)
421
+ path = "/v3/pay/transactions/out-trade-no/#{out_trade_no}"
422
+ end
423
+
424
+ params = params.merge({
425
+ mchid: WechatPay.mch_id
426
+ })
427
+
428
+ method = 'GET'
429
+ query = build_query(params)
430
+ url = "#{path}?#{query}"
431
+
432
+ make_request(
433
+ method: method,
434
+ path: url,
435
+ extra_headers: {
436
+ 'Content-Type' => 'application/x-www-form-urlencoded'
437
+ }
438
+ )
439
+ end
440
+
441
+ CLOSE_ORDER_FIELDS = %i[out_trade_no].freeze # :nodoc:
442
+ #
443
+ # 关闭订单
444
+ #
445
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_3.shtml
446
+ #
447
+ # Example:
448
+ #
449
+ # ``` ruby
450
+ # WechatPay::Direct.close_order(out_trade_no: 'N3344445')
451
+ # ```
452
+ #
453
+ def close_order(params)
454
+ out_trade_no = params.delete(:out_trade_no)
455
+ url = "/v3/pay/transactions/out-trade-no/#{out_trade_no}/close"
456
+ params = params.merge({
457
+ mchid: WechatPay.mch_id
458
+ })
459
+
460
+ method = 'POST'
461
+
462
+ make_request(
463
+ method: method,
464
+ path: url,
465
+ for_sign: params.to_json,
466
+ payload: params.to_json
467
+ )
468
+ end
469
+
470
+ INVOKE_REFUND_FIELDS = %i[transaction_id out_trade_no out_refund_no amount].freeze # :nodoc:
471
+ #
472
+ # 退款申请
473
+ #
474
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_9.shtml
475
+ #
476
+ # Example:
477
+ #
478
+ # ``` ruby
479
+ # WechatPay::Direct.invoke_refund(transaction_id: '4323400972202104305131070170', total: 1, refund: 1, out_refund_no: 'R10000')
480
+ # WechatPay::Direct.invoke_refund(out_trade_no: 'N2021', total: 1, refund: 1, out_refund_no: 'R10000').body
481
+ # ```
482
+ def invoke_refund(params)
483
+ url = '/v3/refund/domestic/refunds'
484
+ method = 'POST'
485
+ amount = {
486
+ refund: params.delete(:refund),
487
+ total: params.delete(:total),
488
+ currency: 'CNY'
489
+ }
490
+
491
+ params = params.merge({
492
+ amount: amount
493
+ })
494
+
495
+ make_request(
496
+ path: url,
497
+ method: method,
498
+ for_sign: params.to_json,
499
+ payload: params.to_json
500
+ )
501
+ end
502
+
503
+ QUERY_REFUND_FIELDS = %i[sub_mchid refund_id out_refund_no].freeze # :nodoc:
504
+ #
505
+ # 直连退款查询
506
+ #
507
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_10.shtml
508
+ #
509
+ # Example:
510
+ #
511
+ # ``` ruby
512
+ # WechatPay::Direct.query_refund(out_refund_no: 'R10000')
513
+ # ```
514
+ #
515
+ def query_refund(params)
516
+ out_refund_no = params.delete(:out_refund_no)
517
+ url = "/v3/refund/domestic/refunds/#{out_refund_no}"
518
+
519
+ method = 'GET'
520
+
521
+ make_request(
522
+ method: method,
523
+ path: url,
524
+ extra_headers: {
525
+ 'Content-Type' => 'application/x-www-form-urlencoded'
526
+ }
527
+ )
528
+ end
529
+
530
+ TRADEBILL_FIELDS = [:bill_date].freeze # :nodoc:
531
+ #
532
+ # 直连申请交易账单
533
+ #
534
+ # Todo: 跟商户平台接口相同
535
+ #
536
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_6.shtml
537
+ #
538
+ # Example:
539
+ #
540
+ # ``` ruby
541
+ # WechatPay::direct.tradebill(bill_date: '2021-04-30')
542
+ # ```
543
+ def tradebill(params)
544
+ path = '/v3/bill/tradebill'
545
+ method = 'GET'
546
+
547
+ query = build_query(params)
548
+ url = "#{path}?#{query}"
549
+
550
+ make_request(
551
+ path: url,
552
+ method: method,
553
+ extra_headers: {
554
+ 'Content-Type' => 'application/x-www-form-urlencoded'
555
+ }
556
+ )
557
+ end
558
+
559
+ FUNDFLOWBILL_FIELDS = [:bill_date].freeze # :nodoc:
560
+ #
561
+ # 申请资金账单
562
+ #
563
+ # Todo: 跟商户平台接口相同
564
+ #
565
+ # Document: https://pay.weixin.qq.com/wiki/doc/apiv3/apis/chapter3_5_7.shtml
566
+ #
567
+ # Example:
568
+ #
569
+ # ``` ruby
570
+ # WechatPay::Direct.fundflowbill(bill_date: '2021-04-30')
571
+ # ```
572
+ #
573
+ def fundflowbill(params)
574
+ path = '/v3/bill/fundflowbill'
575
+ method = 'GET'
576
+
577
+ query = build_query(params)
578
+ url = "#{path}?#{query}"
579
+
580
+ make_request(
581
+ path: url,
582
+ method: method,
583
+ extra_headers: {
584
+ 'Content-Type' => 'application/x-www-form-urlencoded'
585
+ }
586
+ )
587
+ end
588
+
589
+ private
590
+
591
+ def direct_transactions_method_by_suffix(suffix, params)
592
+ url = "/v3/pay/transactions/#{suffix}"
593
+ method = 'POST'
594
+
595
+ params = params.merge({
596
+ mchid: WechatPay.mch_id,
597
+ appid: WechatPay.app_id
598
+ })
599
+
600
+ payload_json = params.to_json
601
+
602
+ make_request(
603
+ method: method,
604
+ path: url,
605
+ for_sign: payload_json,
606
+ payload: payload_json
607
+ )
608
+ end
609
+ end
610
+ end
611
+ end