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 +7 -0
- data/lib/set_base_envrionment.rb +8 -0
- data/lib/wechat-pay.rb +42 -0
- data/lib/wechat-pay/direct.rb +611 -0
- data/lib/wechat-pay/ecommerce.rb +95 -0
- data/lib/wechat-pay/ecommerce/applyment.rb +196 -0
- data/lib/wechat-pay/ecommerce/balance.rb +115 -0
- data/lib/wechat-pay/ecommerce/bill.rb +90 -0
- data/lib/wechat-pay/ecommerce/combine_order.rb +264 -0
- data/lib/wechat-pay/ecommerce/order.rb +206 -0
- data/lib/wechat-pay/ecommerce/profitsharing.rb +229 -0
- data/lib/wechat-pay/ecommerce/refund.rb +136 -0
- data/lib/wechat-pay/ecommerce/subsidies.rb +85 -0
- data/lib/wechat-pay/ecommerce/withdraw.rb +155 -0
- data/lib/wechat-pay/helper.rb +32 -0
- data/lib/wechat-pay/sign.rb +209 -0
- data/lib/wechat-pay/version.rb +5 -0
- metadata +133 -0
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
|