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.
- checksums.yaml +7 -0
- data/.gitignore +18 -0
- data/.travis.yml +8 -0
- data/CODE_OF_CONDUCT.md +74 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +361 -0
- data/Rakefile +10 -0
- data/bin/console +14 -0
- data/bin/setup +8 -0
- data/jd_pay.gemspec +29 -0
- data/lib/jd_pay.rb +24 -0
- data/lib/jd_pay/des.rb +66 -0
- data/lib/jd_pay/qr_service.rb +17 -0
- data/lib/jd_pay/result.rb +28 -0
- data/lib/jd_pay/service.rb +180 -0
- data/lib/jd_pay/sign.rb +47 -0
- data/lib/jd_pay/util.rb +34 -0
- data/lib/jd_pay/version.rb +3 -0
- data/test/jd_pay/des_test.rb +16 -0
- data/test/jd_pay/qr_service_test.rb +28 -0
- data/test/jd_pay/result_test.rb +12 -0
- data/test/jd_pay/service_test.rb +131 -0
- data/test/jd_pay/sign_test.rb +21 -0
- data/test/jd_pay/util_test.rb +27 -0
- data/test/jd_pay_test.rb +11 -0
- data/test/test_helper.rb +42 -0
- metadata +178 -0
|
@@ -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
|
data/test/jd_pay_test.rb
ADDED
data/test/test_helper.rb
ADDED
|
@@ -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
|