Skip to content

Commit 7675130

Browse files
committed
2.0
1 parent f8af513 commit 7675130

File tree

4 files changed

+45
-93
lines changed

4 files changed

+45
-93
lines changed

lib/ralipay.rb

Lines changed: 42 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ module Ralipay
99
require 'nokogiri'
1010
require 'cgi'
1111
require 'uri'
12-
require 'digest/md5'
12+
require 'open-uri'
1313

1414
include Ralipay::Common
1515

@@ -284,31 +284,63 @@ def generate_pay_url
284284

285285
#同步回调验证,支付后跳转,前端GET方式获得参数,传入hash symbol,该方法只返回bool
286286
def callback_verify? gets
287-
sign_type = gets.delete('sign_type')
288-
sign = gets.delete('sign')
289-
params_kv = gets.sort.map do |kv|
290-
kv.join('=')
291-
end
292-
sign == Digest::MD5.hexdigest(params_kv.join('&') + $global_configs[:key])
287+
sign = gets[:sign]
288+
gets = Ralipay::Common::para_filter(gets)
289+
for_sign = Ralipay::Common::create_link_string(gets)
290+
for_sign = CGI.unescape for_sign
291+
sign == Ralipay::Common::md5_sign(for_sign + $global_configs[:key])
293292
end
294293

295294
#同步回调验证,支付后跳转,前端GET方式获得参数,传入hash symbol,该方法返回支付状态,并安全的返回回调参数hash,失败返回false
296295
def callback_verify gets
297-
296+
origin_params = gets
297+
sign = gets[:sign]
298+
gets = Ralipay::Common::para_filter(gets)
299+
for_sign = Ralipay::Common::create_link_string(gets)
300+
for_sign = CGI.unescape for_sign
301+
if sign == Ralipay::Common::md5_sign(for_sign + $global_configs[:key])
302+
origin_params
303+
else
304+
false
305+
end
298306
end
299307

300308
#异步回调验证,支付宝主动通知,前端POST xml方式获得参数,该方法只返回bool
301309
#成功请自行向支付宝打印纯文本success
302310
#如验签失败或未输出success支付宝会24小时根据策略重发总共7次,需考虑重复通知的情况
303311
def notify_verify? posts
304-
312+
origin_params = posts
313+
sign = posts[:sign]
314+
posts = Ralipay::Common::para_filter(posts)
315+
for_sign = Ralipay::Common::create_link_string(posts)
316+
for_sign = CGI.unescape for_sign
317+
if sign == Ralipay::Common::md5_sign(for_sign + $global_configs[:key])
318+
response = open('http://notify.alipay.com/trade/notify_query.do?' + 'partner=' + $global_configs[:partner] + '&notify_id=' + origin_params[:notify_id]).read
319+
response == 'true'
320+
else
321+
false
322+
end
305323
end
306324

307325
#异步回调验证,支付宝主动通知,前端POST xml方式获得参数,该方法返回支付状态,并安全的返回回调参数hash,失败返回false
308326
#成功请自行向支付宝打印纯文本success
309327
#如验签失败或未输出success支付宝会24小时根据策略重发总共7次,需考虑重复通知的情况
310328
def notify_verify posts
311-
329+
origin_params = posts
330+
sign = posts[:sign]
331+
posts = Ralipay::Common::para_filter(posts)
332+
for_sign = Ralipay::Common::create_link_string(posts)
333+
for_sign = CGI.unescape for_sign
334+
if sign == Ralipay::Common::md5_sign(for_sign + $global_configs[:key])
335+
response = open('http://notify.alipay.com/trade/notify_query.do?' + 'partner=' + $global_configs[:partner] + '&notify_id=' + origin_params[:notify_id]).read
336+
if response == 'true'
337+
origin_params
338+
else
339+
false
340+
end
341+
else
342+
false
343+
end
312344
end
313345

314346
end

lib/ralipay/common.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ module Ralipay::Common
22

33
require 'openssl'
44
require 'base64'
5+
require 'digest/md5'
56

67
#生成签名结果
78
def self.build_sign data_array
@@ -49,7 +50,7 @@ def self.rsa_sign for_sign_string
4950

5051
#MD5签名
5152
def self.md5_sign(for_sign_string)
52-
#@todo md5签名方法
53+
Digest::MD5.hexdigest for_sign_string
5354
end
5455

5556
#验签

lib/ralipay/version.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module Ralipay
2-
VERSION = "1.0.2"
2+
VERSION = "2.0.0"
33
end

test/test_ralipay.rb

Lines changed: 0 additions & 81 deletions
Original file line numberDiff line numberDiff line change
@@ -4,72 +4,6 @@
44

55
class TestRalipay < Test::Unit::TestCase
66

7-
#def test_generate_wap_pay_url
8-
# configs = {
9-
# :partner => '2088701817081672',
10-
# :seller_email => '[email protected]',
11-
# :rsa_private_key_path => '/Users/ZhouYT/Desktop/rsa_private_key.pem',
12-
# :rsa_public_key_path => '/Users/ZhouYT/Desktop/alipay_public_key.pem',
13-
# :subject => '测试商品',
14-
# :out_trade_no => '1222222233',
15-
# :total_fee => '0.01',
16-
# :notify_url => 'http://180.110.74.118/post.php',
17-
# :merchant_url => 'http://www.iiseeuu.com',
18-
# :call_back_url => 'http://www.iiseeuu.com'
19-
# }
20-
# assert_equal "需要手动访问url进行测试",
21-
# Ralipay::WapPayment.new(configs).generate_pay_url
22-
#end
23-
24-
#def test_callback_verify
25-
# configs = {
26-
# :partner => '2088701817081672',
27-
# :seller_email => '[email protected]',
28-
# :rsa_private_key_path => '/Users/ZhouYT/Desktop/rsa_private_key.pem',
29-
# :rsa_public_key_path => '/Users/ZhouYT/Desktop/alipay_public_key.pem',
30-
# :subject => '测试商品',
31-
# :out_trade_no => '1222222232',
32-
# :total_fee => '1',
33-
# :notify_url => 'http://180.110.74.118/post.php',
34-
# :merchant_url => 'http://www.iiseeuu.com',
35-
# :call_back_url => 'http://www.iiseeuu.com'
36-
# }
37-
# #'out_trade_no=1222222232&request_token=requestToken&result=success&trade_no=2013032325639837&sign=cANAWkI1dgF1WeyRpp%2F0xzfKXXo50JxRyUxcDh6z%2BZbps1YFiWYRTSUmdCx7HT%2BjAG79ebMWEVIf2HmdIYEIzQDJwu2nl0fElqRgcm9%2BT%2B5b75DbtUg9COla1tr34NLpOcM0P0lcq6byNM0wFbdycUIIoH5Z6JKu66B1YuQLNag%3D&sign_type=0001'
38-
# gets = {
39-
# :out_trade_no => '1222222232',
40-
# :request_token => 'requestToken',
41-
# :result => 'success',
42-
# :trade_no => '2013032325639837',
43-
# :sign => 'cANAWkI1dgF1WeyRpp%2F0xzfKXXo50JxRyUxcDh6z%2BZbps1YFiWYRTSUmdCx7HT%2BjAG79ebMWEVIf2HmdIYEIzQDJwu2nl0fElqRgcm9%2BT%2B5b75DbtUg9COla1tr34NLpOcM0P0lcq6byNM0wFbdycUIIoH5Z6JKu66B1YuQLNag%3D',
44-
# :sign_type => '0001'
45-
# }
46-
# assert_equal true,
47-
# Ralipay::WapPayment.new(configs).callback_verify?(gets)
48-
#end
49-
50-
#def test_notify_verify
51-
# configs = {
52-
# :partner => '2088701817081672',
53-
# :seller_email => '[email protected]',
54-
# :rsa_private_key_path => '/Users/ZhouYT/Desktop/rsa_private_key.pem',
55-
# :rsa_public_key_path => '/Users/ZhouYT/Desktop/alipay_public_key.pem',
56-
# :subject => '测试商品',
57-
# :out_trade_no => '1222222233',
58-
# :total_fee => '1',
59-
# :notify_url => 'http://180.110.74.118/post.php',
60-
# :merchant_url => 'http://www.iiseeuu.com',
61-
# :call_back_url => 'http://www.iiseeuu.com'
62-
# }
63-
# posts = {
64-
# :service => 'alipay.wap.trade.create.direct',
65-
# :sign => 'pCEWVfxBWqvpndkXmCPbd70Tqfo7IG3tP68WmH4wWuUDylb6Rv2RzOghs7m+ANtAx+NyCIuE4KpoonS4qZrc16Qh7/bnwZL2C4FHQJ903HrV0c4n/Pdko0owksnb9VYUGMEppVEBvYPap0bP1GZsbCtI1iuXb2cI1h4vlKJjdGw=',
66-
# :sec_id => '0001',
67-
# :v => '1.0',
68-
# :notify_data => 'Ych9Cg/zaLHsqaBePwoFtxAE7vX0ZvslWCLFTP1AdsxQgvrEcwflAFdbhIHgqsy8AZdRGp7rNeP1Bpn9v+feNlHD96RQit4p1/JHTAOfdoNmQsRaDvBNH9xUlCANXC4zTFDxCZEJN79ppSAzhOu1iMAdUOzim+ZAacxpkMfM4c+YSkpXrEK7kt3Lw4FpkJwwkRAUlYNtrlva94Qo6RZDmo4UpDlUyS1GkqIOihnwxzE4rDO84txzVWtdGDD+Il5ev7nVwnbcsaJzbhl7jgkg8+KzcoIibrn8QJy/xsSckwXZ2pq9Q2d+ufOd/zqpeUvTaD9nNbaH0UYZXDzKPnS91au6zk/2Nqe1d+TsNBeU7muQTM719y7btzfq6tRjs2eNdOfinIYK/MC0lypYtakHrIxpxqyKe1UlpyIVwUauKBkzmJP03x4FJOC7jsbVxI7N2Um/7qlAYCIzLog+SvjW3RX7dhjXAG72qJ93yrTySMJE4yvHEhSFfc2EgjepMzVlCNLwlENrvzkTiqs6rdrKmReKLr2D4QETC5qPL+v3S1iEdlPN4z0KKxp1RWzdwNfLtOceas+lx8oNM2AiQ4O0Y8+YDI/NX7xjckPzwPsEfNWYnwfLYb3MkbmIfhRVozQtsVI4VfxLX35bSQLVtKPdAM4foUIZFh0+HGM+qiSNtZQ2BWjmOUFvIdNyrxMzrRF2+BnuoP+lCkOvQdOnWNoBFpD8aUQrD48AJHQTeyf63bSeJ5Vdif/LPpeJjL+FkP/k+h6mcvigIo1ZcOoF9S2Gg20EgXZWggqR7RLnkroCaNbn/86gZsDQvtwn855n3PRQxosw8a/0F5uFIt/oD5zI7TDFv+p3q9SO3+GYaOwd6OHK3hS11kx2EpzYWw9PaFoANsER9r9buKvQDfcJDkxeN79qmP2zuznVq9OM5X9wDFy2WiFfyYl/swuvZN5e9Q2c0MXj9aeA2H464Am+iFOv1lBWGOlxyVsTQuFjRzRg4FIOp8cv0qOtI/UQPWGbGAy4qys7+sJN/wkboLpdWKLhwgPzto9TM0jN5GZMeA35+2wGcuPAe/SNqhvWM9r8xeCniuSDjesHWWN5bkiYzB4cb0n+E72Yh5WmwJw87ySuXAQWgONxnzgjX0LAGiinoBoufBqmpi/f8vAV3sJFEzkGZxFLSO1Us1ldSi16IqnPTdNtaQAe0N+QYnALM10rmsuGp4/jJatFWFMnmi06AMLcC31who0SD/xItGl6riSkX0yDqWQJzCvZUrrZJoqXJ7XBZoCQscL3Ug2RCKrGba/Ekc10EQINiX99XzYUPVK8xKxO4WW/7T00rZ8B1YjnUaBdWKGdmWmv0itnLx6rK8NWBw=='
69-
# }
70-
# assert_equal true,
71-
# Ralipay::WapPayment.new(configs).notify_verify?(posts)
72-
#end
737

748
def test_para_filter
759
input_para = {:a => 'abc', :sign_type => 'abc', :c => '', :d => nil}
@@ -83,20 +17,5 @@ def test_create_link_string
8317
Ralipay::Common::create_link_string(input_para)
8418
end
8519

86-
def test_web_pay_url
87-
configs = {
88-
:partner => '2088701817081672',
89-
:seller_email => '[email protected]',
90-
:subject => '测试商品',
91-
:out_trade_no => 'tt44',
92-
:total_fee => '0.01',
93-
:notify_url => 'http://180.110.74.118/post.php',
94-
:merchant_url => 'http://www.iiseeuu.com',
95-
:call_back_url => 'http://www.iiseeuu.com',
96-
}
97-
gets = 'service=create_direct_pay_by_user&_input_charset=utf-8&payment_type=1&partner=2088701817081672&[email protected]&subject=%E6%B5%8B%E8%AF%95%E5%95%86%E5%93%81&out_trade_no=tt44&total_fee=0.01&show_url=http://www.iiseeuu.com&return_url=http://www.iiseeuu.com&notify_url=http://180.110.74.118/post.php&sign_type=MD5&sign=9b8bf3d329ed38d461d0bb72654c11e4'
98-
assert_equal 'a=abc&d=&s=&x=abcd',
99-
Ralipay::WebPayment.new(configs).callback_verify?(gets)
100-
end
10120

10221
end

0 commit comments

Comments
 (0)