jdpay 0.1.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.
@@ -0,0 +1,3 @@
1
+ module JdPay
2
+ VERSION = "0.1.1"
3
+ end
@@ -0,0 +1,16 @@
1
+ require 'test_helper'
2
+
3
+ class JdPay::DesTest < Minitest::Test
4
+ def setup
5
+ @decrypted_str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><jdpay><version>V2.0</version><merchant>22294531</merchant><result><code>000000</code><desc>成功</desc></result><tradeNum>1494236491939_r</tradeNum><oTradeNum>1494236491939</oTradeNum><amount>1</amount><currency>CNY</currency><tradeTime>20170508180239</tradeTime><note></note><status>1</status><sign>W4g4PwHlh7OM60uz72MYH4+5PW1lJyFoHiKGFczOGDHdATqAAqbRy4p+sXU04FlsA29UpEfY3Fsct1IAhL5D7y1/tgZDRB+tGe1Tm0zTeFcKQjV8UU7bfRC+Mi3OdQgQvJ2JIIJcsxpXyQmeG2Vr/77aPhCY8hNEQObDp8fDDFc=</sign></jdpay>"
6
+ @encrypted_str = "ZDg2ZmU3YTk5YmM2MGQxYzhjNjc0YmY1ZWJlY2QyODU0YTc5NmQ3ZWQxMWU1NzE3MWQ0OTUwOGI5NzllYmE4ZjM1YzRiZjlmYWE1M2ZiYjVjYTg5YjA4NTdhMjg3NTBhNzQxM2ZjOWFlN2U3YTNlYzM5ZTI5OTBkZDczNzQ5MjhjM2UxMjhkYWJhMGM0NWY2MWFjYjg2YWFlZDBjOTQ1Y2UyOWNlMDg2MmViOTQ3ZDUyZTczOTMxYjM0NGQwZTNjZGVjZTNkY2EwZmZlYzZlODE1Njc3YWMzODcyNTRhYTcyZDc5MjNhYzc5YWIzZGM0ZGIwYWE4NTc3ZTRhNmE3YmMxMjIwMmEyZmRjMDgxNjhlZjQ5ODVlNGIwNmU2ZTVjZjk3MWRlMmQ5NWYxMmJjNjQ3ZTY3MzhhNzRlOGJlMThmMGU3NDhmMmFiMWIwNDlmMGE5NmRjZWU5YTRiZDdkZGVjMDI2YjE2ZDI0M2MzMzEzNWI5ZDkyYzQ3OTU4OTc2NmQ0NmEyMGU2MTU3YTc4ZTUxY2UyMTYxMWNhMGFlMmIxZGJiOTEwZWM1OGJkMjU0ODA3NTYxYjI1N2EzYjFhNzVmMDI2ZTkxMmQ1ZGZiOGY2ZGQ2NDQwODBmMjM4ZGI2MjNkOTUxY2NhNzRjN2ZhMDg5M2EzM2I0ZmU4MTA0MjAyZmVjNGVkNjIzNjk2ODBkNWYwYzZmYzA1YjIwYmU3MDY2Y2E5NjI0N2I1MGE4MTlhM2U0MThmMDQ1MWU3ZjhkMzQwOGQ5MmZkM2RlN2FjODhiODEyODEwMzY0NjVhYjBmMTk1MjVjNzc5YTQ5Y2Q5ZjliNWViODRjOTEyNjQyYTFkZGQ5MzRiYjc3YjAzMTY5YTdkNGQ4ZDEzYjk3OGY0NmNiZjFmNjM3NzM4NGYwMDExNTIwODM0MWEyYTg1ZGYxNDdjZGRmMTk0ZjlmNDQ0ODM0MzQ2NjgzYmFlNzg4NjE0MWViODUwYTdjNjYyZjdjY2QyNGFlM2Q3ZmQ4NDkwNzZmMWNiMWFmODczNDNhZDcwN2M1NTE2ODFhZDA3NzE3OTU3NDg0Yzk4NTIzNTQ5YTM4YzI1MDIxZTJmNmIxODE1NDA0YTczZjMzMGEzMTgzMGNjYzQ1YjI2ZTUzNzFiODMzMjU1ZjllZjNmYjVhNzIwNDc5Y2UzNTM2OGQ0ZWQ5ZDRlYjllOTE2MTQ0OTdiN2Y3Njc2M2E5ZjRlY2I4ZGNhYWFlNTE3MjJhYTBmM2Y4YjAwZWRkYTFhODI1ZTAxYzBhZTkzM2NiMTYwM2ExZmJmYjc5OTZhYjM5ZjA3YmVkYTgxNDQyODkxNDEyYWZjZjhiODA3YmQyNDc4Mzg1MGZlNGE5ZDc1NzlmOGU4MjIzZDEwYjhkNzI0ZmVmNmU4YzQyZDNkNDUxYTI3MWVmMw=="
7
+ end
8
+
9
+ def test_encrypt_3des
10
+ assert_equal @encrypted_str, Base64.strict_encode64(JdPay::Des.encrypt_3des @decrypted_str)
11
+ end
12
+
13
+ def test_decrypt_3des
14
+ assert_equal @decrypted_str, JdPay::Des.decrypt_3des(Base64.decode64 @encrypted_str)
15
+ end
16
+ end
@@ -0,0 +1,28 @@
1
+ require 'test_helper'
2
+
3
+ class JdPay::QrServiceTest < Minitest::Test
4
+ def test_qrcode_pay
5
+ response_body = <<-EOF
6
+ <?xml version="1.0" encoding="UTF-8"?>
7
+ <jdpay>
8
+ <version>V2.0</version>
9
+ <merchant>22294531</merchant>
10
+ <result>
11
+ <code>000000</code>
12
+ <desc>成功</desc>
13
+ </result>
14
+ <encrypt>N2ZjNmIwMzJiMjA5ZTNhZDhjNjc0YmY1ZWJlY2QyODU0YTc5NmQ3ZWQxMWU1NzE3MWQ0OTUwOGI5NzllYmE4ZjM1YzRiZjlmYWE1M2ZiYjVjYTg5YjA4NTdhMjg3NTBhNzQxM2ZjOWFlN2U3YTNlYzM5ZTI5OTBkZDczNzQ5MjhjM2UxMjhkYWJhMGM0NWY2MWFjYjg2YWFlZDBjOTQ1Y2UyOWNlMDg2MmViOTQ3ZDUyZTczOTMxYjM0NGQwZTNjZGVjZTNkY2EwZmZlYzZlODE1Njc3YWMzODcyNTRhYTcyZDc5MjNhYzc5YWIzZGM0ZGIwYWE4NTc3ZTRhNmE3YmMxMjIwMmEyZmRjMDgxNjhlZjQ5ODVlNGIwNmU2ZTVjZjk3MWRlMmQ5NWYxMmJjNjFiOTY3M2E1ZGY0NWVkNmQ5NzU4OTFmNjFjNTMxMjQ0ZTUyZTdhOWZjNGYwYWRiNTM0ZTQyNGEzMWQyZTYyMWFkMWZkNWY2YTZkZDFmOWNkMTljODg2MzkxNmYwMWViNWMzM2JhNTM5ZWMxYjY1NTA2ZTdmMTYzMjY2YTVjZTk1OTE5M2U0NzNhMGNhMWIwMmVhZjdmYzUyYjc3ZDRiM2Y2NDVlNDFjMDI2YTM0YjU0MGE5MDQzZDEyYmRjNzQzYzM5ODc5NTRhMDcyNGFiOTI4NWQ3MmE0OWUwODNlNGZlNmM3OGMxNGJiNDAzMzI5YTVlMWViNjM2Y2ZkYTg5ZTc1ZDk2ZmJjNTcwMTIyYjU3NWUxZWI2MzZjZmRhODllNzFkYTM0NTE0MDM3YmU5ODQzZTI3Y2Y5OGFjYWM5ZGI3YTg4Yjk5YTQ5NjAxNWYyOWQxZjYwNTJmM2JhOWFlMWI0MzY2Yzc4MmY5YzJlNDY3ODljZjc3ZDMzYjVkN2IyZWRlZjcyOGQ0N2ViZDJkN2Y1YTA5ZTJiYTk5NjUxMGZjNmExMTA3OTFjMjY0NTMyODQ3YjRiYjc3MDlkMmY4YzllY2ZlNzE2MTE1ZjNkMzRlZGRhMmFhOGU4NTA0NThiZTdiOWUzYTM0MDczZTFjNzgxZDFkYzY1ZTRjYzRiYTY3ZGE4NzE4ZjJjNDBmMGU5ZDZlNWU2Y2RiNzAyMzUyNDIyZGVkYmU4NWM4MDdlZTVkNDhkZjg0NGMwNGUwMzA1ZWM5ODJkNmIwMWRmMzg3MjZjZGRkMTVhMWI4YjI1YTdhMWVmNTI2MDUzYmYzYzFlYTBmYmM2MTI3MDMwNTcyNTU1MzQyYjA0ZmZjN2NjOTg4Y2Q2YjQ1M2JhMDQ1NmE3ODUzNDMzMmNmNDFiNWI0M2M5ODhmNmNkMDI2MjFlZDIwYzRhYjliMjU2YmM3ZDU1Yzg2OTBkZWZjNTVhYjA1NzdiYzQxZmY0MzAxNmE3OTRlNWVkMjRjNDc4ZDgzN2JhNDZhMDAwY2ExOGMwMDQ4MWEwMmUyZTcyZjIwYTE0N2MyMTUwMWI3Mjg0NWE0ZDY3YTFiYTEyYzI2MTljYzhkMGM5YzJhOWU1NDljYmY0ZDJlYTM5M2IxYTg5ZWQ4NjMxZWM4NmIwNDI0YzJkYzBjNDU=</encrypt>
15
+ </jdpay>
16
+ EOF
17
+ result = {"jdpay"=>{"version"=>"V2.0", "merchant"=>"22294531", "result"=>{"code"=>"000000", "desc"=>"成功"}, "orderId"=>"1029148637575787617463", "merchantName"=>"京东支付测试商户号", "amount"=>"1", "expireTime"=>"600", "tradeNum"=>"1486346954111", "qrCode"=>"https://h5pay.jd.com/code?c=616zlks7djfb1z", "sign"=>"C5Mn72q+w1ttkqsUSuhFwJjK8rpikxHkPHaJAXNBVvJGOLMYrSRkHTchACkAISiUzJ60ppWC4DnN6nfnbT5xyrK7kKmHuUivfGRGVnfucvZnV7eDS0Jv+7Np64P/ZyHUkesTDxb0+oDNilTaX82pV5Y2O0qmfs5Ft0LhpJ4Le/w="}}
18
+ stub_request(:post, JdPay::Service::QRCODE_PAY_URL).to_return(body: response_body)
19
+ params = {
20
+ tradeNum: '123456780',
21
+ tradeName: '测试商品',
22
+ amount: '1',
23
+ device: '0001',
24
+ token: '2563256985478547856'
25
+ }
26
+ assert_equal result, JdPay::QrService.qrcode_pay(params)
27
+ end
28
+ end
@@ -0,0 +1,12 @@
1
+ require 'test_helper'
2
+
3
+ class JdPay::ResultTest < Minitest::Test
4
+ def setup
5
+ @xml_str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><jdpay><version>V2.0</version><merchant>22294531</merchant><result><code>000000</code><desc>成功</desc></result><encrypt>ZDg2ZmU3YTk5YmM2MGQxYzhjNjc0YmY1ZWJlY2QyODU0YTc5NmQ3ZWQxMWU1NzE3MWQ0OTUwOGI5NzllYmE4ZjM1YzRiZjlmYWE1M2ZiYjVjYTg5YjA4NTdhMjg3NTBhNzQxM2ZjOWFlN2U3YTNlYzM5ZTI5OTBkZDczNzQ5MjhjM2UxMjhkYWJhMGM0NWY2MWFjYjg2YWFlZDBjOTQ1Y2UyOWNlMDg2MmViOTQ3ZDUyZTczOTMxYjM0NGQwZTNjZGVjZTNkY2EwZmZlYzZlODE1Njc3YWMzODcyNTRhYTcyZDc5MjNhYzc5YWIzZGM0ZGIwYWE4NTc3ZTRhNmE3YmMxMjIwMmEyZmRjMDgxNjhlZjQ5ODVlNGIwNmU2ZTVjZjk3MWRlMmQ5NWYxMmJjNjQ3ZTY3MzhhNzRlOGJlMThmMGU3NDhmMmFiMWIwNDlmMGE5NmRjZWU5YTRiZDdkZGVjMDI2YjE2ZDI0M2MzMzEzNWI5ZDkyYzQ3OTU4OTc2NmQ0NmEyMGU2MTU3YTc4ZTUxY2UyMTYxMWNhMGFlMmIxZGJiOTEwZWM1OGJkMjU0ODA3NTYxYjI1N2EzYjFhNzVmMDI2ZTkxMmQ1ZGZiOGY2ZGQ2NDQwODBmMjM4ZGI2MjNkOTUxY2NhNzRjN2ZhMDg5M2EzM2I0ZmU4MTA0MjAyZmVjNGVkNjIzNjk2ODBkNWYwYzZmYzA1YjIwYmU3MDY2Y2E5NjI0N2I1MGE4MTlhM2U0MThmMDQ1MWU3ZjhkMzQwOGQ5MmZkM2RlN2FjODhiODEyODEwMzY0NjVhYjBmMTk1MjVjNzc5YTQ5Y2Q5ZjliNWViODRjOTEyNjQyYTFkZGQ5MzRiYjc3YjAzMTY5YTdkNGQ4ZDEzYjk3OGY0NmNiZjFmNjM3NzM4NGYwMDExNTIwODM0MWEyYTg1ZGYxNDdjZGRmMTk0ZjlmNDQ0ODM0MzQ2NjgzYmFlNzg4NjE0MWViODUwYTdjNjYyZjdjY2QyNGFlM2Q3ZmQ4NDkwNzZmMWNiMWFmODczNDNhZDcwN2M1NTE2ODFhZDA3NzE3OTU3NDg0Yzk4NTIzNTQ5YTM4YzI1MDIxZTJmNmIxODE1NDA0YTczZjMzMGEzMTgzMGNjYzQ1YjI2ZTUzNzFiODMzMjU1ZjllZjNmYjVhNzIwNDc5Y2UzNTM2OGQ0ZWQ5ZDRlYjllOTE2MTQ0OTdiN2Y3Njc2M2E5ZjRlY2I4ZGNhYWFlNTE3MjJhYTBmM2Y4YjAwZWRkYTFhODI1ZTAxYzBhZTkzM2NiMTYwM2ExZmJmYjc5OTZhYjM5ZjA3YmVkYTgxNDQyODkxNDEyYWZjZjhiODA3YmQyNDc4Mzg1MGZlNGE5ZDc1NzlmOGU4MjIzZDEwYjhkNzI0ZmVmNmU4YzQyZDNkNDUxYTI3MWVmMw==</encrypt></jdpay>"
6
+ end
7
+
8
+ def test_initialize
9
+ hash_data = Hash.from_xml "<?xml version=\"1.0\" encoding=\"UTF-8\"?><jdpay><version>V2.0</version><merchant>22294531</merchant><result><code>000000</code><desc>成功</desc></result><tradeNum>1494236491939_r</tradeNum><oTradeNum>1494236491939</oTradeNum><amount>1</amount><currency>CNY</currency><tradeTime>20170508180239</tradeTime><note></note><status>1</status><sign>W4g4PwHlh7OM60uz72MYH4+5PW1lJyFoHiKGFczOGDHdATqAAqbRy4p+sXU04FlsA29UpEfY3Fsct1IAhL5D7y1/tgZDRB+tGe1Tm0zTeFcKQjV8UU7bfRC+Mi3OdQgQvJ2JIIJcsxpXyQmeG2Vr/77aPhCY8hNEQObDp8fDDFc=</sign></jdpay>"
10
+ assert_equal hash_data, JdPay::Result.new(Hash.from_xml @xml_str)
11
+ end
12
+ end
@@ -0,0 +1,131 @@
1
+ require 'test_helper'
2
+
3
+ class JdPay::ServiceTest < Minitest::Test
4
+ def setup
5
+ @response_body = <<-EOF
6
+ <?xml version="1.0" encoding="UTF-8"?>
7
+ <jdpay>
8
+ <version>V2.0</version>
9
+ <merchant>22294531</merchant>
10
+ <result>
11
+ <code>000000</code>
12
+ <desc>成功</desc>
13
+ </result>
14
+ <encrypt>N2ZjNmIwMzJiMjA5ZTNhZDhjNjc0YmY1ZWJlY2QyODU0YTc5NmQ3ZWQxMWU1NzE3MWQ0OTUwOGI5NzllYmE4ZjM1YzRiZjlmYWE1M2ZiYjVjYTg5YjA4NTdhMjg3NTBhNzQxM2ZjOWFlN2U3YTNlYzM5ZTI5OTBkZDczNzQ5MjhjM2UxMjhkYWJhMGM0NWY2MWFjYjg2YWFlZDBjOTQ1Y2UyOWNlMDg2MmViOTQ3ZDUyZTczOTMxYjM0NGQwZTNjZGVjZTNkY2EwZmZlYzZlODE1Njc3YWMzODcyNTRhYTcyZDc5MjNhYzc5YWIzZGM0ZGIwYWE4NTc3ZTRhNmE3YmMxMjIwMmEyZmRjMDgxNjhlZjQ5ODVlNGIwNmU2ZTVjZjk3MWRlMmQ5NWYxMmJjNjFiOTY3M2E1ZGY0NWVkNmQ5NzU4OTFmNjFjNTMxMjQ0ZTUyZTdhOWZjNGYwYWRiNTM0ZTQyNGEzMWQyZTYyMWFkMWZkNWY2YTZkZDFmOWNkMTljODg2MzkxNmYwMWViNWMzM2JhNTM5ZWMxYjY1NTA2ZTdmMTYzMjY2YTVjZTk1OTE5M2U0NzNhMGNhMWIwMmVhZjdmYzUyYjc3ZDRiM2Y2NDVlNDFjMDI2YTM0YjU0MGE5MDQzZDEyYmRjNzQzYzM5ODc5NTRhMDcyNGFiOTI4NWQ3MmE0OWUwODNlNGZlNmM3OGMxNGJiNDAzMzI5YTVlMWViNjM2Y2ZkYTg5ZTc1ZDk2ZmJjNTcwMTIyYjU3NWUxZWI2MzZjZmRhODllNzFkYTM0NTE0MDM3YmU5ODQzZTI3Y2Y5OGFjYWM5ZGI3YTg4Yjk5YTQ5NjAxNWYyOWQxZjYwNTJmM2JhOWFlMWI0MzY2Yzc4MmY5YzJlNDY3ODljZjc3ZDMzYjVkN2IyZWRlZjcyOGQ0N2ViZDJkN2Y1YTA5ZTJiYTk5NjUxMGZjNmExMTA3OTFjMjY0NTMyODQ3YjRiYjc3MDlkMmY4YzllY2ZlNzE2MTE1ZjNkMzRlZGRhMmFhOGU4NTA0NThiZTdiOWUzYTM0MDczZTFjNzgxZDFkYzY1ZTRjYzRiYTY3ZGE4NzE4ZjJjNDBmMGU5ZDZlNWU2Y2RiNzAyMzUyNDIyZGVkYmU4NWM4MDdlZTVkNDhkZjg0NGMwNGUwMzA1ZWM5ODJkNmIwMWRmMzg3MjZjZGRkMTVhMWI4YjI1YTdhMWVmNTI2MDUzYmYzYzFlYTBmYmM2MTI3MDMwNTcyNTU1MzQyYjA0ZmZjN2NjOTg4Y2Q2YjQ1M2JhMDQ1NmE3ODUzNDMzMmNmNDFiNWI0M2M5ODhmNmNkMDI2MjFlZDIwYzRhYjliMjU2YmM3ZDU1Yzg2OTBkZWZjNTVhYjA1NzdiYzQxZmY0MzAxNmE3OTRlNWVkMjRjNDc4ZDgzN2JhNDZhMDAwY2ExOGMwMDQ4MWEwMmUyZTcyZjIwYTE0N2MyMTUwMWI3Mjg0NWE0ZDY3YTFiYTEyYzI2MTljYzhkMGM5YzJhOWU1NDljYmY0ZDJlYTM5M2IxYTg5ZWQ4NjMxZWM4NmIwNDI0YzJkYzBjNDU=</encrypt>
15
+ </jdpay>
16
+ EOF
17
+ @result = {"jdpay"=>{"version"=>"V2.0", "merchant"=>"22294531", "result"=>{"code"=>"000000", "desc"=>"成功"}, "orderId"=>"1029148637575787617463", "merchantName"=>"京东支付测试商户号", "amount"=>"1", "expireTime"=>"600", "tradeNum"=>"1486346954111", "qrCode"=>"https://h5pay.jd.com/code?c=616zlks7djfb1z", "sign"=>"C5Mn72q+w1ttkqsUSuhFwJjK8rpikxHkPHaJAXNBVvJGOLMYrSRkHTchACkAISiUzJ60ppWC4DnN6nfnbT5xyrK7kKmHuUivfGRGVnfucvZnV7eDS0Jv+7Np64P/ZyHUkesTDxb0+oDNilTaX82pV5Y2O0qmfs5Ft0LhpJ4Le/w="}}
18
+ end
19
+
20
+ def test_uniorder
21
+ stub_request(:post, JdPay::Service::UNIORDER_URL).to_return(body: @response_body)
22
+ params = {
23
+ tradeNum: '123456780',
24
+ tradeName: '测试商品',
25
+ amount: '1',
26
+ orderType: '0',
27
+ notifyUrl: 'http://making.dev/notify'
28
+ }
29
+ assert_equal @result, JdPay::Service.uniorder(params)
30
+ end
31
+
32
+ def test_query
33
+ stub_request(:post, JdPay::Service::QUERY_URL).to_return(body: @response_body)
34
+ params = {
35
+ tradeNum: '12345678',
36
+ tradeType: '1',
37
+ oTradeNum: "12345677",
38
+ }
39
+ assert_equal @result, JdPay::Service.query(params)
40
+ end
41
+
42
+ def test_refund
43
+ stub_request(:post, JdPay::Service::REFUND_URL).to_return(body: @response_body)
44
+ params = {
45
+ tradeNum: '12345678',
46
+ oTradeNum: "12345677",
47
+ amount: '1',
48
+ notifyUrl: 'http://making.dev/notify',
49
+ }
50
+ assert_equal @result, JdPay::Service.refund(params)
51
+ end
52
+
53
+ def test_pc_pay
54
+ html_str = "<html><body onload=document.getElementById('payForm').submit(); style='display: none;'><form action=https://wepay.jd.com/jdpay/saveOrder method='post' id='payForm'><input type='text' name=version value=V2.0><input type='text' name=merchant value=22294531><input type='text' name=tradeTime value=d9668085c69c2ecb73421627b78590400135be4ad908a2a7><input type='text' name=currency value=ac7132c57f10d3ce><input type='text' name=tradeNum value=b9a9953b73f9f8eb3612d06b873f74e9><input type='text' name=tradeName value=25fc4ff3e72f364fc1d80691e88fd7df><input type='text' name=amount value=e5a6c3761ab9ddaf><input type='text' name=orderType value=e00c693e6c5b8a60><input type='text' name=notifyUrl value=d54a8a984359284ec3d58d814e65630300d528555ef1e14ebe9ff87c62d78770><input type='text' name=callbackUrl value=b470f968b7165dcf745e8e129f073434ef9ec43bd64dda9ba2fe77001f4c7347><input type='text' name=userId value=29d899fc35dc7aa50640156c06e5ec0f><input type='text' name=sign value=di/QyXcBJGY/Avb8ilTEUsCxto6F5fbjX4mvGt0a0J2XD1dTJ8sPidfTHofagsgz9H/CP3FC6Hqca49woS7o8vkn4oPfA+coHfxBnm4QtBcvdeQjW3fKq2IKbtGG7UGNGXEJc9Gk7BnXNnuvnbEc5FVFcvbqirdNi+7opO9jmaM=></form></body></html>"
55
+ params = {
56
+ tradeNum: '12345678',
57
+ tradeName: '测试商品',
58
+ amount: '1',
59
+ orderType: '0',
60
+ notifyUrl: 'http://making.dev/notify',
61
+ callbackUrl: 'http://frontend.com/return',
62
+ userId: "0000001",
63
+ tradeTime: '20170718101010'
64
+ }
65
+ assert_equal html_str, JdPay::Service.pc_pay(params)
66
+ end
67
+
68
+ def test_h5_pay
69
+ html_str = "<html><body onload=document.getElementById('payForm').submit(); style='display: none;'><form action=https://h5pay.jd.com/jdpay/saveOrder method='post' id='payForm'><input type='text' name=version value=V2.0><input type='text' name=merchant value=22294531><input type='text' name=tradeTime value=d9668085c69c2ecb73421627b78590400135be4ad908a2a7><input type='text' name=currency value=ac7132c57f10d3ce><input type='text' name=tradeNum value=b9a9953b73f9f8eb3612d06b873f74e9><input type='text' name=tradeName value=25fc4ff3e72f364fc1d80691e88fd7df><input type='text' name=amount value=e5a6c3761ab9ddaf><input type='text' name=orderType value=e00c693e6c5b8a60><input type='text' name=notifyUrl value=d54a8a984359284ec3d58d814e65630300d528555ef1e14ebe9ff87c62d78770><input type='text' name=callbackUrl value=b470f968b7165dcf745e8e129f073434ef9ec43bd64dda9ba2fe77001f4c7347><input type='text' name=userId value=29d899fc35dc7aa50640156c06e5ec0f><input type='text' name=sign value=di/QyXcBJGY/Avb8ilTEUsCxto6F5fbjX4mvGt0a0J2XD1dTJ8sPidfTHofagsgz9H/CP3FC6Hqca49woS7o8vkn4oPfA+coHfxBnm4QtBcvdeQjW3fKq2IKbtGG7UGNGXEJc9Gk7BnXNnuvnbEc5FVFcvbqirdNi+7opO9jmaM=></form></body></html>"
70
+ params = {
71
+ tradeNum: '12345678',
72
+ tradeName: '测试商品',
73
+ amount: '1',
74
+ orderType: '0',
75
+ notifyUrl: 'http://making.dev/notify',
76
+ callbackUrl: 'http://frontend.com/return',
77
+ userId: "0000001",
78
+ tradeTime: '20170718101010'
79
+ }
80
+ assert_equal html_str, JdPay::Service.h5_pay(params)
81
+ end
82
+
83
+ def test_revoke
84
+ stub_request(:post, JdPay::Service::REVOKE_URL).to_return(body: @response_body)
85
+ params = {
86
+ tradeNum: '12345678',
87
+ oTradeNum: "12345677",
88
+ amount: '1',
89
+ }
90
+ assert_equal @result, JdPay::Service.revoke(params)
91
+ end
92
+
93
+ def test_notify_verify
94
+ assert_equal @result, JdPay::Service.notify_verify(@response_body)
95
+ end
96
+
97
+ def test_user_relation
98
+ xml_str = <<-EOF
99
+ <jdpay>
100
+ <version>V2.0</version>
101
+ <merchant>22294531</merchant>
102
+ <result>
103
+ <code>000000</code>
104
+ <desc>成功</desc>
105
+ </result> <encrypt>OWQxYWMyN2I1M2M1NmJhNThjNjc0YmY1ZWJlY2QyODU0YTc5NmQ3ZWQxMWU1NzE3MWQ0OTUwOGI5NzllYmE4ZjM1YzRiZjlmYWE1M2ZiYjVjYTg5YjA4NTdhMjg3NTBhNzQxM2ZjOWFlN2U3YTNlYzM5ZTI5OTBkZDczNzQ5MjhjM2UxMjhkYWJhMGM0NWY2MWFjYjg2YWFlZDBjOTQ1Y2UyOWNlMDg2MmViOTQ3ZDUyZTczOTMxYjM0NGQwZTNjZGVjZTNkY2EwZmZlYzZlODE1Njc3YWMzODcyNTRhYTcyZDc5MjNhYzc5YWIzZGM0ZGIwYWE4NTc3ZTRhNmE3YmMxMjIwMmEyZmRjMDgxNjhlZjQ5ODVlNGIwNmU2ZTVjZjk3MWRlMmQ5NWYxMmJjNmUwZTdkNTJlZjBmNDhlYzIwZDYzY2U1NGY4ZGU2YWIxNDE5OTk0ZjAwZDE0MzdkZmE1NGZjMGRhOTFhZGM1ZDg5MGY3NWU5MmQxMDYyYmZjZDZiNDA4NjhkMjdlYzYwNmEzYTk4YzRhYzQ5ZGM0NjhmN2M0MTYzZTQxMjNiYzhkOWQ1ZjcwOTU4ZDk5NmM1MWEyZDY1MDk4NjJhZmMyZTI0Y2M0YmQxYmRiMTYyOWZlYzY4ZTBkNTk3NjFjMWYxNDJhNTdjMzBiZWM4ZDE1ZGQyNDY3MGFlMGM0YzMzYjllZWMzZDYzY2MxNmZmOGNmNDc4YzYzZjJiZDRjOGY2YzYxZTgzMWVlM2E5YzEyZTM5ZmEwMjM0OTdjZTJjMjNlZWEyOGRkMGE5MGMyMTg5OGY3MTUwN2Q1MDI0OWVhNDE1ZDFkOTllYTI0MWZlNmU1NTQ5ZTg5MzhlYTJhNjVmZDk3ZTE0MDQ5ZmJiNjMzMDMzMDA0YTUwN2ZiMmYyYmFkN2E3OTZjNjZmZDgzMDVlZmQ3MjcwMzg0ZmU2ZTMxM2QyZjgxZjcxYWZlYzZmY2EzYg==</encrypt>
106
+ </jdpay>
107
+ EOF
108
+ stub_request(:post, JdPay::Service::USER_RELATION_URL).to_return(body: xml_str)
109
+ expect_xml = <<-EOF
110
+ <?xml version="1.0" encoding="UTF-8"?><jdpay><version>V2.0</version><merchant>22294531</merchant><result><code>000000</code><desc>成功</desc></result><isHas>true</isHas><sign>I1DPdvxF60UYSeTXbv+R3jnjp/Vy21paYo7pxgh6Wb/S1pjf4Cj0gOGYeCfWQullVrpL3UqGD/ZnX7Fz5Y8iuIaCgs0w3xGwe9Ww4MsxKnrzfRQ/sJhfZ9WE/3zJpQfg5yr5bVXrKROoBPjkpbWp78YH0KANZOV2EE0XkivwGJI=</sign></jdpay>
111
+ EOF
112
+ assert_equal Hash.from_xml(expect_xml), JdPay::Service.user_relation({userId: "123"})
113
+ end
114
+ def test_cancel_user
115
+ xml_str = <<-EOF
116
+ <jdpay>
117
+ <version>V2.0</version>
118
+ <merchant>22294531</merchant>
119
+ <result>
120
+ <code>000000</code>
121
+ <desc>成功</desc>
122
+ </result> <encrypt>ZmI3YmM5ZTVlODJhYzkyMjhjNjc0YmY1ZWJlY2QyODU0YTc5NmQ3ZWQxMWU1NzE3MWQ0OTUwOGI5NzllYmE4ZjM1YzRiZjlmYWE1M2ZiYjVjYTg5YjA4NTdhMjg3NTBhNzQxM2ZjOWFlN2U3YTNlYzM5ZTI5OTBkZDczNzQ5MjhjM2UxMjhkYWJhMGM0NWY2MWFjYjg2YWFlZDBjOTQ1Y2UyOWNlMDg2MmViOTQ3ZDUyZTczOTMxYjM0NGQwZTNjZGVjZTNkY2EwZmZlYzZlODE1Njc3YWMzODcyNTRhYTcyZDc5MjNhYzc5YWIzZGM0ZGIwYWE4NTc3ZTRhNmE3YmMxMjIwMmEyZmRjMDgxNjhlZjQ5ODVlNGIwNmU2ZTVjZjk3MWRlMmQ5NWYxMmJjNjJlY2EwNGM0ZDFiYzZmYzQ0NDc4N2IwNWEzZjYwZDZjZDUzNDJlYzFiOWY2NGFkOGU5OGQ3ZThkMzE1ZDQzYWQ0YjJlMmE1ZWZkZjEyZWU0ZTBkZmRhMjdmY2VhMzc3N2ZiYzIwZjdjZmFhNWU3NDU5ZmM2MDRjNzQ5MjA2MmNjNjJjYmZiNzJkOWJiZGMyODQzOTE1NzIxNDMwODc0NmZiNWZjYmYxMGU1MTY4MjVlOTU3YWE1Mzg0ZDU0ODJmOTAwYWFlMjA3M2I3NGQxMDRiZDk5YzM0MDViODY5NjBhZjY3NDM2MWNlNzlmMmFmOGVkNDBhZmRiZWMwODkwM2NiOTZlNzcwNzk2OTYwZDNlZDM1ZGEwM2YxZmEwYTQ1Mzc3ZTQzNWNkZmVlNzE4OTYyYjkyOWFiM2ZmYjdlODc3NjI1ZWFiYzU4NTYxNWJjNGY5ODk3MjdkZTViMjUwNDZmYWJlMWZiZWI1MWUxZWNlMzQzYmE3YzkxNTUzMDI4OTBjYzU0YTJiMGM2Yjg1ZTQ=</encrypt>
123
+ </jdpay>
124
+ EOF
125
+ stub_request(:post, JdPay::Service::CANCEL_USER_URL).to_return(body: xml_str)
126
+ expect_xml = <<-EOF
127
+ <?xml version="1.0" encoding="UTF-8"?><jdpay><version>V2.0</version><merchant>22294531</merchant><result><code>000000</code><desc>成功</desc></result><sign>DUUlg3VLAFgx7vT6nCRBagmyJ8O8xsGC70kb6z9FjSO6vy3Vi7VNJ9rYizT+zP4JXOWxyeOAcgpY4O1I5tT1xrmh0N6k/z8PmRbKYXjUNNY999+teh5Ahwy9aigHw0u1ilWFcKmAMhF1gfyjX66WSKxMQASnDHTCEh8m1VBf76o=</sign></jdpay>
128
+ EOF
129
+ assert_equal Hash.from_xml(expect_xml), JdPay::Service.cancel_user({userId: "123"})
130
+ end
131
+ end
@@ -0,0 +1,21 @@
1
+ require 'test_helper'
2
+
3
+ class JdPay::SignTest < Minitest::Test
4
+ def test_rsa_decrypt
5
+ xml_str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><jdpay><version>V2.0</version><merchant>22294531</merchant><result><code>000000</code><desc>成功</desc></result><tradeNum>1494236491939_r</tradeNum><oTradeNum>1494236491939</oTradeNum><amount>1</amount><currency>CNY</currency><tradeTime>20170508180239</tradeTime><note></note><status>1</status></jdpay>"
6
+ sign = "W4g4PwHlh7OM60uz72MYH4+5PW1lJyFoHiKGFczOGDHdATqAAqbRy4p+sXU04FlsA29UpEfY3Fsct1IAhL5D7y1/tgZDRB+tGe1Tm0zTeFcKQjV8UU7bfRC+Mi3OdQgQvJ2JIIJcsxpXyQmeG2Vr/77aPhCY8hNEQObDp8fDDFc="
7
+ assert_equal Digest::SHA256.hexdigest(xml_str), JdPay::Sign.rsa_decrypt(sign)
8
+ end
9
+
10
+ def test_rsa_encrypt
11
+ xml_str = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><jdpay><amount>1</amount><currency>CNY</currency><merchant>22294531</merchant><note></note><notifyUrl>http://10.13.81.116:63917/AsynNotifyHandler.ashx</notifyUrl><oTradeNum>1494236491939</oTradeNum><tradeNum>1494236491939_r</tradeNum><tradeTime>20170508174906</tradeTime><version>V2.0</version></jdpay>"
12
+ sign = "UlcPzSqTH+E/zCqZFUFsY+zZ7mj7sS1XF9By2HEb9a0v6s0px6cUjTMU8J5YmJ521DkePRDiA3XXISls9XDISsZvRXJBfBe9pOLf09HzJza45x4iMuuSyxeaGEGLHo5b9bAGslcwFPNZ14yxbGcptQ4tcvO30yNDbsWroTMzGZo="
13
+ assert_equal sign, JdPay::Sign.rsa_encrypt(xml_str)
14
+ end
15
+
16
+ def test_md5_sign
17
+ order_id = "12345678"
18
+ md5_str = "merchant=22294531&orderId=12345678&key=pvmkZFhudHnwblIxgWsnvFqDHRrVDmfU"
19
+ assert_equal Digest::MD5.hexdigest(md5_str), JdPay::Sign.md5_sign(order_id)
20
+ end
21
+ end
@@ -0,0 +1,27 @@
1
+ require 'test_helper'
2
+
3
+ class JdPay::UtilTest < Minitest::Test
4
+ def setup
5
+ @params = {he: 'zhi', zhi: 'he', meng: nil}
6
+ end
7
+
8
+ def test_denilize
9
+ assert_equal @params.merge(meng: ""), JdPay::Util.denilize(@params)
10
+ end
11
+
12
+ def test_to_xml
13
+ xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><jdpay><he>zhi</he><zhi>he</zhi><meng></meng></jdpay>"
14
+ assert_equal xml, JdPay::Util.to_xml(@params)
15
+ end
16
+
17
+ def test_to_uri
18
+ uri = "he=zhi&meng=&zhi=he"
19
+ assert_equal uri, JdPay::Util.to_uri(@params)
20
+ end
21
+
22
+ def test_build_pay_form
23
+ url = "https://wepay.jd.com/jdpay/saveOrder"
24
+ str = "<html><body onload=document.getElementById('payForm').submit(); style='display: none;'><form action=https://wepay.jd.com/jdpay/saveOrder method='post' id='payForm'><input type='text' name=he value=zhi><input type='text' name=zhi value=he><input type='text' name=meng value=></form></body></html>"
25
+ assert_equal str, JdPay::Util.build_pay_form(url, @params)
26
+ end
27
+ end
@@ -0,0 +1,11 @@
1
+ require 'test_helper'
2
+
3
+ class JdPayTest < Minitest::Test
4
+ def test_public_key
5
+ assert_equal TEST_RSA_PUBLIC_KEY, JdPay.public_key
6
+ end
7
+
8
+ def test_debug_model_default
9
+ assert JdPay.debug_mode?
10
+ end
11
+ end
@@ -0,0 +1,42 @@
1
+ require 'jd_pay'
2
+ require 'minitest/autorun'
3
+ require 'active_support/core_ext/hash/conversions'
4
+ require 'active_support/builder'
5
+ require 'webmock/minitest'
6
+
7
+ TEST_RSA_PUBLIC_KEY = <<-EOF
8
+ -----BEGIN PUBLIC KEY-----
9
+ MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCKE5N2xm3NIrXON8Zj19GNtLZ8
10
+ xwEQ6uDIyrS3S03UhgBJMkGl4msfq4Xuxv6XUAN7oU1XhV3/xtabr9rXto4Ke3d6
11
+ WwNbxwXnK5LSgsQc1BhT5NcXHXpGBdt7P8NMez5qGieOKqHGvT0qvjyYnYA29a8Z
12
+ 4wzNR7vAVHp36uD5RwIDAQAB
13
+ -----END PUBLIC KEY-----
14
+ EOF
15
+
16
+ TEST_RSA_PRIVATE_KEY = <<-EOF
17
+ -----BEGIN PRIVATE KEY-----
18
+ MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBALXf6twUqul1TATO
19
+ +5nA66p2wjnRd+g96IXpfV6Sf8WXxwizGj+L19LQYRBXpZHmRh82prJ48d0FcHbo
20
+ CiN8pKutnuZrrKYhvORysOc5bVli0hcCn1TfYDoUWJ1UhjUQloqZKWjUz6LV9QY6
21
+ bIZ1W4+Hmw6HK1bfFwUq0WzIGkJNAgMBAAECgYBlIFQeev9tP+M86TnMjBB9f/sO
22
+ 2wGpCIM5slIbO6n/3By3IZ7+pmsitOrDg3h0X22t/V1C7yzMkDGwa+T3Rl7ogwc4
23
+ UNVj0ZQorOTx3OEPx3nP1yT3zmJ9djKaHKAmee4XmhQHdqqIuMT2XQaqatBzcsnP
24
+ +Jnw/WVOsIJIqMeFAQJBAP9yq4hE+UfM/YSXZ5JR33k9RolUUq8S/elmeJIDo/3N
25
+ 2qDmzLjOr9iEZHxioc8JOxubtZ0BxA+NdfKz4v0BSpkCQQC2RIrAPRj9vOk6GfT9
26
+ W1hbJ4GdnzTb+4vp3RDQQ3x9JGXzWFlg8xJT1rNgM8R95Gkxn3KGnYHJQTLlCsIy
27
+ 2FnVAkAWXolM3pVhxz6wHL4SHx9Ns6L4payz7hrUFIgcaTs0H5G0o2FsEZVuhXFz
28
+ PwPiaHGHomQOAriTkBSzEzOeaj2JAkEAtYUFefZfETQ2QbrgFgIGuKFboJKRnhOi
29
+ f8G9oOvU6vx43CS8vqTVN9G2yrRDl+0GJnlZIV9zhe78tMZGKUT2EQJAHQawBKGl
30
+ XlMe49Fo24yOy5DvKeohobjYqzJAtbqaAH7iIQTpOZx91zUcL/yG4dWS6r+wGO7Z
31
+ 1RKpupOJLKG3lA==
32
+ -----END PRIVATE KEY-----
33
+ EOF
34
+
35
+ JdPay.pri_key = TEST_RSA_PRIVATE_KEY
36
+ JdPay.des_key = 'ta4E/aspLA3lgFGKmNDNRYU92RkZ4w2t'
37
+ JdPay.md5_key = 'pvmkZFhudHnwblIxgWsnvFqDHRrVDmfU'
38
+ JdPay.mch_id = '22294531'
39
+ JdPay.debug_mode = true
40
+ JdPay.qr_pri_key = TEST_RSA_PRIVATE_KEY
41
+ JdPay.qr_des_key = 'ta4E/aspLA3lgFGKmNDNRYU92RkZ4w2t'
42
+ JdPay.qr_mch_id = '22294531'
metadata ADDED
@@ -0,0 +1,178 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: jdpay
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.1
5
+ platform: ruby
6
+ authors:
7
+ - Genkin He
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-07-18 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: rest-client
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: 2.0.0
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: 2.0.0
27
+ - !ruby/object:Gem::Dependency
28
+ name: activesupport
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '3.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '3.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: builder
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: 3.2.2
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: 3.2.2
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.3'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.3'
69
+ - !ruby/object:Gem::Dependency
70
+ name: rake
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '11.2'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '11.2'
83
+ - !ruby/object:Gem::Dependency
84
+ name: webmock
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: '2.3'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: '2.3'
97
+ - !ruby/object:Gem::Dependency
98
+ name: minitest
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - "~>"
102
+ - !ruby/object:Gem::Version
103
+ version: '5'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - "~>"
109
+ - !ruby/object:Gem::Version
110
+ version: '5'
111
+ description: An unofficial simple jdpay gem
112
+ email:
113
+ - hemengzhi88@gmail.com
114
+ executables:
115
+ - console
116
+ - setup
117
+ extensions: []
118
+ extra_rdoc_files: []
119
+ files:
120
+ - ".gitignore"
121
+ - ".travis.yml"
122
+ - CODE_OF_CONDUCT.md
123
+ - Gemfile
124
+ - LICENSE.txt
125
+ - README.md
126
+ - Rakefile
127
+ - bin/console
128
+ - bin/setup
129
+ - jd_pay.gemspec
130
+ - lib/jd_pay.rb
131
+ - lib/jd_pay/des.rb
132
+ - lib/jd_pay/qr_service.rb
133
+ - lib/jd_pay/result.rb
134
+ - lib/jd_pay/service.rb
135
+ - lib/jd_pay/sign.rb
136
+ - lib/jd_pay/util.rb
137
+ - lib/jd_pay/version.rb
138
+ - test/jd_pay/des_test.rb
139
+ - test/jd_pay/qr_service_test.rb
140
+ - test/jd_pay/result_test.rb
141
+ - test/jd_pay/service_test.rb
142
+ - test/jd_pay/sign_test.rb
143
+ - test/jd_pay/util_test.rb
144
+ - test/jd_pay_test.rb
145
+ - test/test_helper.rb
146
+ homepage: https://github.com/genkin-he/jd_pay
147
+ licenses:
148
+ - MIT
149
+ metadata: {}
150
+ post_install_message:
151
+ rdoc_options: []
152
+ require_paths:
153
+ - lib
154
+ required_ruby_version: !ruby/object:Gem::Requirement
155
+ requirements:
156
+ - - ">="
157
+ - !ruby/object:Gem::Version
158
+ version: '0'
159
+ required_rubygems_version: !ruby/object:Gem::Requirement
160
+ requirements:
161
+ - - ">="
162
+ - !ruby/object:Gem::Version
163
+ version: '0'
164
+ requirements: []
165
+ rubyforge_project:
166
+ rubygems_version: 2.4.3
167
+ signing_key:
168
+ specification_version: 4
169
+ summary: An unofficial simple jdpay gem.
170
+ test_files:
171
+ - test/jd_pay/des_test.rb
172
+ - test/jd_pay/qr_service_test.rb
173
+ - test/jd_pay/result_test.rb
174
+ - test/jd_pay/service_test.rb
175
+ - test/jd_pay/sign_test.rb
176
+ - test/jd_pay/util_test.rb
177
+ - test/jd_pay_test.rb
178
+ - test/test_helper.rb