wx_pay 0.15.0 → 0.16.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.
- checksums.yaml +4 -4
- data/lib/wx_pay.rb +6 -0
- data/lib/wx_pay/service.rb +49 -16
- data/lib/wx_pay/sign.rb +6 -1
- data/lib/wx_pay/version.rb +1 -1
- metadata +5 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: dda7cad282f587b4eb9db5afb01d0f55e9b6ae8f
|
4
|
+
data.tar.gz: a8bf70ef43b11678faf05d70496b962ed9df262a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 9339a3e811c8a4358766f4e79917f92c000718617de351e116f751d92834144f4b9d363b82a72ca0e92b218cb905687dede973254597f8acd5449c5317ef63e0
|
7
|
+
data.tar.gz: 7808f6392ddc96ce95874b1de710121a866e631032ef8bb8b2abade3a0e1c936275eb46d9623c7d8ad404c8e0f9ba875e45171cbb7b7c65976093c76e50fae94
|
data/lib/wx_pay.rb
CHANGED
@@ -6,9 +6,11 @@ require 'openssl'
|
|
6
6
|
module WxPay
|
7
7
|
@extra_rest_client_options = {}
|
8
8
|
@debug_mode = true
|
9
|
+
@sandbox_mode = false
|
9
10
|
|
10
11
|
class<< self
|
11
12
|
attr_accessor :appid, :mch_id, :key, :appsecret, :extra_rest_client_options, :debug_mode
|
13
|
+
attr_accessor :sandbox_mode, :sandbox_key, :sandbox_mch_id
|
12
14
|
attr_reader :apiclient_cert, :apiclient_key
|
13
15
|
|
14
16
|
def set_apiclient_by_pkcs12(str, pass)
|
@@ -30,5 +32,9 @@ module WxPay
|
|
30
32
|
def debug_mode?
|
31
33
|
@debug_mode
|
32
34
|
end
|
35
|
+
|
36
|
+
def sandbox_mode?
|
37
|
+
@sandbox_mode
|
38
|
+
end
|
33
39
|
end
|
34
40
|
end
|
data/lib/wx_pay/service.rb
CHANGED
@@ -6,7 +6,8 @@ require 'active_support/core_ext/hash/conversions'
|
|
6
6
|
|
7
7
|
module WxPay
|
8
8
|
module Service
|
9
|
-
GATEWAY_URL = 'https://api.mch.weixin.qq.com'
|
9
|
+
GATEWAY_URL = 'https://api.mch.weixin.qq.com'.freeze
|
10
|
+
SANDBOX_GATEWAY_URL = 'https://api.mch.weixin.qq.com/sandboxnew'.freeze
|
10
11
|
|
11
12
|
def self.generate_authorize_url(redirect_uri, state = nil)
|
12
13
|
state ||= SecureRandom.hex 16
|
@@ -25,6 +26,16 @@ module WxPay
|
|
25
26
|
), quirks_mode: true)
|
26
27
|
end
|
27
28
|
|
29
|
+
def self.get_sandbox_signkey
|
30
|
+
params = {
|
31
|
+
mch_id: WxPay.mch_id,
|
32
|
+
nonce_str: SecureRandom.uuid.tr('-', '')
|
33
|
+
}
|
34
|
+
r = WxPay::Result.new(Hash.from_xml(invoke_remote("/pay/getsignkey", xmlify_payload(params))))
|
35
|
+
yield r if block_given?
|
36
|
+
r
|
37
|
+
end
|
38
|
+
|
28
39
|
def self.authenticate_from_weapp(js_code, options = {})
|
29
40
|
options = WxPay.extra_rest_client_options.merge(options)
|
30
41
|
url = "https://api.weixin.qq.com/sns/jscode2session?appid=#{WxPay.appid}&secret=#{WxPay.appsecret}&js_code=#{js_code}&grant_type=authorization_code"
|
@@ -36,7 +47,7 @@ module WxPay
|
|
36
47
|
}.merge(options)
|
37
48
|
), quirks_mode: true)
|
38
49
|
end
|
39
|
-
|
50
|
+
|
40
51
|
INVOKE_UNIFIEDORDER_REQUIRED_FIELDS = [:body, :out_trade_no, :total_fee, :spbill_create_ip, :notify_url, :trade_type]
|
41
52
|
def self.invoke_unifiedorder(params, options = {})
|
42
53
|
params = {
|
@@ -48,7 +59,7 @@ module WxPay
|
|
48
59
|
|
49
60
|
check_required_options(params, INVOKE_UNIFIEDORDER_REQUIRED_FIELDS)
|
50
61
|
|
51
|
-
r = WxPay::Result.new(Hash.from_xml(invoke_remote("
|
62
|
+
r = WxPay::Result.new(Hash.from_xml(invoke_remote("/pay/unifiedorder", make_payload(params), options)))
|
52
63
|
|
53
64
|
yield r if block_given?
|
54
65
|
|
@@ -66,7 +77,7 @@ module WxPay
|
|
66
77
|
|
67
78
|
check_required_options(params, INVOKE_CLOSEORDER_REQUIRED_FIELDS)
|
68
79
|
|
69
|
-
r = WxPay::Result.new(Hash.from_xml(invoke_remote("
|
80
|
+
r = WxPay::Result.new(Hash.from_xml(invoke_remote("/pay/closeorder", make_payload(params), options)))
|
70
81
|
|
71
82
|
yield r if block_given?
|
72
83
|
|
@@ -127,7 +138,7 @@ module WxPay
|
|
127
138
|
verify_ssl: OpenSSL::SSL::VERIFY_NONE
|
128
139
|
}.merge(options)
|
129
140
|
|
130
|
-
r = WxPay::Result.new(Hash.from_xml(invoke_remote("
|
141
|
+
r = WxPay::Result.new(Hash.from_xml(invoke_remote("/secapi/pay/refund", make_payload(params), options)))
|
131
142
|
|
132
143
|
yield r if block_given?
|
133
144
|
|
@@ -144,7 +155,7 @@ module WxPay
|
|
144
155
|
|
145
156
|
check_required_options(params, ORDER_QUERY_REQUIRED_FIELDS)
|
146
157
|
|
147
|
-
r = WxPay::Result.new(Hash.from_xml(invoke_remote("
|
158
|
+
r = WxPay::Result.new(Hash.from_xml(invoke_remote("/pay/refundquery", make_payload(params), options)))
|
148
159
|
|
149
160
|
yield r if block_given?
|
150
161
|
|
@@ -167,7 +178,7 @@ module WxPay
|
|
167
178
|
verify_ssl: OpenSSL::SSL::VERIFY_NONE
|
168
179
|
}.merge(options)
|
169
180
|
|
170
|
-
r = WxPay::Result.new(Hash.from_xml(invoke_remote("
|
181
|
+
r = WxPay::Result.new(Hash.from_xml(invoke_remote("/mmpaymkttransfers/promotion/transfers", make_payload(params), options)))
|
171
182
|
|
172
183
|
yield r if block_given?
|
173
184
|
|
@@ -190,7 +201,7 @@ module WxPay
|
|
190
201
|
verify_ssl: OpenSSL::SSL::VERIFY_NONE
|
191
202
|
}.merge(options)
|
192
203
|
|
193
|
-
r = WxPay::Result.new(Hash.from_xml(invoke_remote("
|
204
|
+
r = WxPay::Result.new(Hash.from_xml(invoke_remote("/mmpaymkttransfers/gettransferinfo", make_payload(params), options)))
|
194
205
|
|
195
206
|
yield r if block_given?
|
196
207
|
|
@@ -213,7 +224,7 @@ module WxPay
|
|
213
224
|
verify_ssl: OpenSSL::SSL::VERIFY_NONE
|
214
225
|
}.merge(options)
|
215
226
|
|
216
|
-
r = WxPay::Result.new(Hash.from_xml(invoke_remote("
|
227
|
+
r = WxPay::Result.new(Hash.from_xml(invoke_remote("/secapi/pay/reverse", make_payload(params), options)))
|
217
228
|
|
218
229
|
yield r if block_given?
|
219
230
|
|
@@ -236,7 +247,7 @@ module WxPay
|
|
236
247
|
verify_ssl: OpenSSL::SSL::VERIFY_NONE
|
237
248
|
}.merge(options)
|
238
249
|
|
239
|
-
r = WxPay::Result.new(Hash.from_xml(invoke_remote("
|
250
|
+
r = WxPay::Result.new(Hash.from_xml(invoke_remote("/pay/micropay", make_payload(params), options)))
|
240
251
|
|
241
252
|
yield r if block_given?
|
242
253
|
|
@@ -252,7 +263,7 @@ module WxPay
|
|
252
263
|
}.merge(params)
|
253
264
|
|
254
265
|
|
255
|
-
r = WxPay::Result.new(Hash.from_xml(invoke_remote("
|
266
|
+
r = WxPay::Result.new(Hash.from_xml(invoke_remote("/pay/orderquery", make_payload(params), options)))
|
256
267
|
check_required_options(params, ORDER_QUERY_REQUIRED_FIELDS)
|
257
268
|
|
258
269
|
yield r if block_given?
|
@@ -270,7 +281,7 @@ module WxPay
|
|
270
281
|
|
271
282
|
check_required_options(params, DOWNLOAD_BILL_REQUIRED_FIELDS)
|
272
283
|
|
273
|
-
r = invoke_remote("
|
284
|
+
r = invoke_remote("/pay/downloadbill", make_payload(params), options)
|
274
285
|
|
275
286
|
yield r if block_given?
|
276
287
|
|
@@ -292,7 +303,7 @@ module WxPay
|
|
292
303
|
verify_ssl: OpenSSL::SSL::VERIFY_NONE
|
293
304
|
}.merge(options)
|
294
305
|
|
295
|
-
r = WxPay::Result.new(Hash.from_xml(invoke_remote("
|
306
|
+
r = WxPay::Result.new(Hash.from_xml(invoke_remote("/mmpaymkttransfers/sendgroupredpack", make_payload(params), options)))
|
296
307
|
|
297
308
|
yield r if block_given?
|
298
309
|
|
@@ -314,7 +325,7 @@ module WxPay
|
|
314
325
|
verify_ssl: OpenSSL::SSL::VERIFY_NONE
|
315
326
|
}.merge(options)
|
316
327
|
|
317
|
-
r = WxPay::Result.new(Hash.from_xml(invoke_remote("
|
328
|
+
r = WxPay::Result.new(Hash.from_xml(invoke_remote("/mmpaymkttransfers/sendredpack", make_payload(params), options)))
|
318
329
|
|
319
330
|
yield r if block_given?
|
320
331
|
|
@@ -324,6 +335,11 @@ module WxPay
|
|
324
335
|
class << self
|
325
336
|
private
|
326
337
|
|
338
|
+
def get_gateway_url
|
339
|
+
return SANDBOX_GATEWAY_URL if WxPay.sandbox_mode?
|
340
|
+
GATEWAY_URL
|
341
|
+
end
|
342
|
+
|
327
343
|
def check_required_options(options, names)
|
328
344
|
return unless WxPay.debug_mode?
|
329
345
|
names.each do |name|
|
@@ -331,19 +347,36 @@ module WxPay
|
|
331
347
|
end
|
332
348
|
end
|
333
349
|
|
334
|
-
def
|
350
|
+
def xmlify_payload(params)
|
335
351
|
sign = WxPay::Sign.generate(params)
|
336
352
|
params.delete(:key) if params[:key]
|
337
353
|
"<xml>#{params.map { |k, v| "<#{k}>#{v}</#{k}>" }.join}<sign>#{sign}</sign></xml>"
|
338
354
|
end
|
339
355
|
|
356
|
+
def make_payload(params)
|
357
|
+
if WxPay.sandbox_mode?
|
358
|
+
r = get_sandbox_signkey
|
359
|
+
if r['return_code'] == WxPay::Result::SUCCESS_FLAG
|
360
|
+
params = params.merge({
|
361
|
+
:mch_id => r['mch_id'] || WxPay.mch_id,
|
362
|
+
:key => r['sandbox_signkey']
|
363
|
+
})
|
364
|
+
WxPay.sandbox_key = r['sandbox_signkey']
|
365
|
+
WxPay.sandbox_mch_id = r['mch_id']
|
366
|
+
else
|
367
|
+
warn("WxPay Warn: fetch sandbox sign key failed #{r['return_msg']}")
|
368
|
+
end
|
369
|
+
end
|
370
|
+
xmlify_payload(params)
|
371
|
+
end
|
372
|
+
|
340
373
|
def invoke_remote(url, payload, options = {})
|
341
374
|
options = WxPay.extra_rest_client_options.merge(options)
|
342
375
|
|
343
376
|
RestClient::Request.execute(
|
344
377
|
{
|
345
378
|
method: :post,
|
346
|
-
url: url,
|
379
|
+
url: "#{get_gateway_url}#{url}",
|
347
380
|
payload: payload,
|
348
381
|
headers: { content_type: 'application/xml' }
|
349
382
|
}.merge(options)
|
data/lib/wx_pay/sign.rb
CHANGED
@@ -12,8 +12,13 @@ module WxPay
|
|
12
12
|
Digest::MD5.hexdigest("#{query}&key=#{key || WxPay.key}").upcase
|
13
13
|
end
|
14
14
|
|
15
|
-
def self.verify?(params)
|
15
|
+
def self.verify?(params, options = {})
|
16
16
|
params = params.dup
|
17
|
+
params = params.merge(options)
|
18
|
+
if WxPay.sandbox_mode?
|
19
|
+
params = params.merge({:mch_id => WxPay.sandbox_mch_id, :key => WxPay.sandbox_key})
|
20
|
+
end
|
21
|
+
|
17
22
|
sign = params.delete('sign') || params.delete(:sign)
|
18
23
|
|
19
24
|
generate(params) == sign
|
data/lib/wx_pay/version.rb
CHANGED
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: wx_pay
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.
|
4
|
+
version: 0.16.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Jasl
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2017-
|
11
|
+
date: 2017-09-07 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: rest-client
|
@@ -16,14 +16,14 @@ dependencies:
|
|
16
16
|
requirements:
|
17
17
|
- - ">="
|
18
18
|
- !ruby/object:Gem::Version
|
19
|
-
version:
|
19
|
+
version: 2.0.0
|
20
20
|
type: :runtime
|
21
21
|
prerelease: false
|
22
22
|
version_requirements: !ruby/object:Gem::Requirement
|
23
23
|
requirements:
|
24
24
|
- - ">="
|
25
25
|
- !ruby/object:Gem::Version
|
26
|
-
version:
|
26
|
+
version: 2.0.0
|
27
27
|
- !ruby/object:Gem::Dependency
|
28
28
|
name: activesupport
|
29
29
|
requirement: !ruby/object:Gem::Requirement
|
@@ -132,7 +132,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
132
132
|
version: '0'
|
133
133
|
requirements: []
|
134
134
|
rubyforge_project:
|
135
|
-
rubygems_version: 2.6.
|
135
|
+
rubygems_version: 2.6.13
|
136
136
|
signing_key:
|
137
137
|
specification_version: 4
|
138
138
|
summary: An unofficial simple wechat pay gem
|