wechat-pay 1.0.1

Sign up to get free protection for your applications and to get access to all the features.
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