alipay_global 0.0.2 → 0.0.3

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: ad843ac2c3089ede0f911c6430269cdbfd1d4518
4
- data.tar.gz: a8c7096d475a52cfa08dbb70f328a096a0e2202e
3
+ metadata.gz: 8d806d2aa21fbbc9eb231773eb0df9e468add4b0
4
+ data.tar.gz: 8b9c2c7df624401147e1d7187400ac912cddd897
5
5
  SHA512:
6
- metadata.gz: c706cda76ad9a1848bbc2ef3ea1653e2d255751254eec9b0b21d78558fa74a012bc5e93d9520e092c8b9d49906c92ca82155075152fe279751b1cc0eb2066b5f
7
- data.tar.gz: b07e6fac57ec6d969647eeaaa56ef9d0e9992a1d7ebe67a53fa5a570318b53fee7d8b31a5492aa297b3fae6efa1457c3b37a82fe376cb33d5e1da56aa0b903f6
6
+ metadata.gz: 9e663a7259a74309f6bf10942dce4eaa37c86b2e96e752f6b108d41a79001db77b677c1b2ed37c52b7ca7892da27eda74e52c3f7616e3938390ef04983a73462
7
+ data.tar.gz: 27b7cadceb9d7ac35996b3581265fff5542681917eeeba73197280e024b60d93c50721a55be85d47c509a3ea00c95c1c30e8377e6d2eb29c30b1e1ceeb28c721
data/README.md CHANGED
@@ -19,9 +19,25 @@ AlipayGlobal.api_secret_key = 'YOUR_KEY'
19
19
  #AlipayGlobal.debug_mode = true # Enable parameter check. Default is true.
20
20
  ```
21
21
 
22
- ## Warning
22
+ ## Note
23
23
 
24
- ### Still in testing phase. Gem is not yet ready for production use and is prone to failures/ bugs. Use at your own peril. Full functionality hasn't been achieved yet too
24
+ ### Operational Functions
25
+
26
+ | Feature | Description |
27
+ | ------- | ----------- |
28
+ | AlipayGlobal::Service::Trade.create | |
29
+ | AlipayGlobal::Service::Trade.refund | |
30
+ | AlipayGlobal::Service::Notification.check | |
31
+ | AlipayGlobal::Service::Reconciliation.request | |
32
+ | AlipayGlobal::Service::Exchange.current_rates | |
33
+
34
+ ### Incomplete/ Untested Functions
35
+
36
+ | Feature | Description |
37
+ | ------- | ----------- |
38
+ | AlipayGlobal::Sign | RSA | Not tested. I do not have an RSA based relationship with Alipay at the moment to test requests via RSA signing |
39
+ | AlipayGlobal::Sign | DSA | Not implemented |
40
+ | AlipayGlobal::Service::Trade.batch_refund | Awaiting verification and support from Alipay: Issue with signing for multipartforms |
25
41
 
26
42
  ## Usage
27
43
 
@@ -41,9 +57,8 @@ AlipayGlobal::Service::Trade.create({ARGUMENTS})
41
57
 
42
58
  #### Issues (awaiting resolution)
43
59
 
44
- 1. create_forex_trade
45
- 1. rmb_fee issues with MD5 Signature (awaiting Alipay tech response)
46
- 2. RSA integration: User needs to work with Alipay team to exchange RSA public keys to properly test the content
60
+ 1. create
61
+ 1. RSA integration: User needs to work with Alipay team to exchange RSA public keys to properly test the content
47
62
  2. testing environment
48
63
  1. Alipay mobile site for testing is down. works in production.
49
64
 
@@ -88,6 +103,42 @@ AlipayGlobal::Service::Trade.create(
88
103
 
89
104
  \*\*\* Attention2:The request parameters can only be accepted by the Alipay system if they are signed according to the signature mechanism specified in this document.The parameter “timeout_rule”, the default value is 12h. If you want to use this parameter to change timing, you need to contact Alipay technical. Otherwise you will have an error.
90
105
 
106
+ ```ruby
107
+ refund
108
+ ```
109
+
110
+ #### Definition
111
+
112
+ ```ruby
113
+ AlipayGlobal::Service::Trade.refund({ARGUMENTS})
114
+ ```
115
+
116
+ #### Example
117
+
118
+ ```ruby
119
+ AlipayGlobal::Service::Trade.refund(
120
+ out_return_no: "SAMPLE_REFUND_ID",
121
+ out_trade_no: "SAMPLE_TRANSACTION_ID",
122
+ return_rmb_amount: 200.00,
123
+ reason: "hello",
124
+ gmt_return: (Time.parse("2015-03-20 12:00").getlocal("+08:00")).strftime("%Y%m%d%H%M%S"),
125
+ currency: "USD"
126
+ )
127
+ # => 'https://mapi.alipay.com/gateway.do?service=create_forex_trade...' #for production
128
+ ```
129
+
130
+ #### ARGUMENTS
131
+
132
+ | Key | Requirement | Data Type | Description |
133
+ | --- | ----------- | --------- | ----------- |
134
+ | out_return_no | required | string | The new ID which created for refund. |
135
+ | out_trade_no | required | string | The ID for the original transaction. |
136
+ | return_amount | required | float | |
137
+ | currency | required | string | |
138
+ | reason | required | string | Reason for refund, out of supply e.g. |
139
+ | return_rmb_amount | optional* | float | This parameter related the RMB price function in the payment interface |
140
+
141
+ \* return_rmb_amount: if used, then leave return_amount empty
91
142
 
92
143
  #### Service::Exchange
93
144
 
@@ -247,4 +298,8 @@ AlipayGlobal::Service::Reconciliation.request(params)
247
298
  {:partner_transaction_id=>"1326555", :amount=>"2125.25", :currency=>"HKD", :transaction_time=>#<DateTime: 2013-12-19T17:56:37+00:00 ((2456646j,64597s,0n),+0s,2299161j)>, :settlement_time=>"", :transaction_type=>"P", :service_charge=>"21.25", :status=>"P", :remarks=>"Grey Hours Limited (Testing)"},
248
299
  {:partner_transaction_id=>"1326244", :amount=>"0.01", :currency=>"HKD", :transaction_time=>#<DateTime: 2013-12-19T16:11:26+00:00 ((2456646j,58286s,0n),+0s,2299161j)>, :settlement_time=>"", :transaction_type=>"P", :service_charge=>"0.00", :status=>"P", :remarks=>"MICROS-Fidelio Information Systems Co. Limited (Testing)"}
249
300
  ]
250
- ```
301
+ ```
302
+
303
+ ### Contributing
304
+
305
+ Feel free to fork this repo and make a PR.
@@ -23,4 +23,6 @@ Gem::Specification.new do |spec|
23
23
  spec.add_development_dependency "minitest"
24
24
  spec.add_development_dependency "fakeweb"
25
25
  spec.add_development_dependency "nokogiri"
26
+ spec.add_development_dependency "rest-client", "~> 1.8.0"
27
+
26
28
  end
@@ -7,7 +7,7 @@ module AlipayGlobal
7
7
  def self.request_uri(params, sign = true)
8
8
  uri = URI(gateway_url)
9
9
  processed_params = sign ? sign_params(params) : params
10
- uri.query = URI.encode_www_form(processed_params)
10
+ uri.query = URI.encode_www_form(AlipayGlobal::Utils.stringify_keys(processed_params))
11
11
  uri
12
12
  end
13
13
 
@@ -1,4 +1,4 @@
1
- require 'open-uri'
1
+ require 'net/http'
2
2
 
3
3
  module AlipayGlobal
4
4
  module Service
@@ -10,9 +10,6 @@ module AlipayGlobal
10
10
  'partner' => AlipayGlobal.api_partner_id,
11
11
  }.merge(params)
12
12
 
13
- Rails.logger.debug AlipayGlobal::Service.request_uri(params,false)
14
- Rails.logger.debug Net::HTTP.get(AlipayGlobal::Service.request_uri(params,false))
15
-
16
13
  Net::HTTP.get(AlipayGlobal::Service.request_uri(params,false))
17
14
  end
18
15
 
@@ -1,11 +1,12 @@
1
1
  require "net/http"
2
+ require "rest-client"
2
3
  require "uri"
3
4
  require "nokogiri"
4
5
 
5
6
  module AlipayGlobal
6
7
  module Service
7
8
  module Trade
8
-
9
+ BOUNDARY = "AaB03x"
9
10
  CREATE_TRADE_REQUIRED_PARAMS = %w( notify_url subject out_trade_no currency )
10
11
  CREATE_TRADE_OPTIONAL_PARAMS = %w( return_url body total_fee rmb_fee order_gmt_create order_valid_time timeout_rule auth_token supplier seller_id seller_name seller_industry )
11
12
 
@@ -26,7 +27,19 @@ module AlipayGlobal
26
27
  AlipayGlobal::Service.request_uri(params).to_s
27
28
  end
28
29
 
29
- def self.refund(refunds)
30
+ def self.refund(params)
31
+ resp = Net::HTTP.get(build_refund_uri(params))
32
+
33
+ alipay_results = Nokogiri::XML(resp).at_xpath('//alipay')
34
+
35
+ alipay_success = alipay_results.at_xpath('//is_success').content == "T"
36
+
37
+ alipay_reason = alipay_success ? "" : alipay_results.at_xpath('//error').content
38
+
39
+ { success: alipay_success , message: alipay_reason }
40
+ end
41
+
42
+ def self.batch_refund(refunds)
30
43
  file = build_refund_file(refunds)
31
44
 
32
45
  params = {
@@ -38,14 +51,18 @@ module AlipayGlobal
38
51
 
39
52
  #p uri.to_s
40
53
 
41
- form_params = { 'partner' => AlipayGlobal.api_partner_id, 'service' => 'forex_refund_file', 'refund_file' => IO.read(file.path) }
54
+ form_params = { 'partner' => AlipayGlobal.api_partner_id, 'service' => 'forex_refund_file', 'refund_file' => File.read(file.path) }
55
+
56
+ #IO.read(file.path)
42
57
 
43
58
  #p form_params
44
59
 
45
- resp = Net::HTTP.post_form(uri, form_params)
60
+ #resp = Net::HTTP.post_form(uri, form_params)
46
61
 
47
62
  #p resp.body
48
63
 
64
+ resp = RestClient.post uri.to_s, :partner => AlipayGlobal.api_partner_id, :file => File.new(file.path, 'rb'), :service => 'forex_refund_file'
65
+
49
66
  alipay_resp = Nokogiri::XML(resp.body)
50
67
 
51
68
  alipay_results = alipay_resp.at_xpath('//alipay')
@@ -56,12 +73,24 @@ module AlipayGlobal
56
73
  end
57
74
 
58
75
  def self.build_refund_file(refunds)
59
- file = Tempfile.new(['refund_file','.txt'])
76
+ file = Tempfile.new(['refund','.txt'])
60
77
  refund_content = AlipayGlobal::Utils.write_refund_content(refunds)
61
78
  file.write(refund_content)
62
79
  file.close
63
80
  file
64
81
  end
82
+
83
+ def self.build_refund_uri(refund)
84
+ refund[:reason] = "no_reason" if !refund[:reason]
85
+ refund[:reason] = "no_reason" if refund[:reason].strip.length == 0
86
+ params = {
87
+ 'service' => 'forex_refund',
88
+ '_input_charset' => 'utf-8',
89
+ 'partner' => AlipayGlobal.api_partner_id
90
+ }.merge(refund)
91
+
92
+ AlipayGlobal::Service.request_uri(params)
93
+ end
65
94
  end
66
95
  end
67
96
  end
@@ -4,8 +4,7 @@ module AlipayGlobal
4
4
  new_hash = {}
5
5
  hash.each do |key, value|
6
6
  case key
7
- when :total_fee, :rmb_fee, :refund_sum
8
- value = value.round(2)
7
+ when :total_fee, :rmb_fee, :refund_sum, :return_rmb_amount, :return_amount
9
8
  value = '%.2f' % value
10
9
  end
11
10
  new_hash[(key.to_s rescue key) || key] = value
@@ -1,3 +1,3 @@
1
1
  module AlipayGlobal
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
@@ -56,13 +56,59 @@ describe "AlipayGlobal::Service::Trade", "Forex trade actions" do
56
56
  end
57
57
 
58
58
  describe "#refund" do
59
+ it "should refund correctly for a valid refund url" do
60
+ params = {
61
+ out_return_no: "SAMPLE_REFUND_ID",
62
+ out_trade_no: "SAMPLE_TRANSACTION_ID",
63
+ return_rmb_amount: 200.00,
64
+ reason: "hello",
65
+ gmt_return: (Time.parse("2015-03-20 12:00").getlocal("+08:00")).strftime("%Y%m%d%H%M%S"),
66
+ currency: "USD"
67
+ }
68
+ expected_result = { success: false, message: "PURCHASE_TRADE_NOT_EXIST" }
69
+
70
+ assert_equal "https://mapi.alipay.net/gateway.do?service=forex_refund&_input_charset=utf-8&partner=2088101122136241&out_return_no=SAMPLE_REFUND_ID&out_trade_no=SAMPLE_TRANSACTION_ID&return_rmb_amount=200.00&reason=hello&gmt_return=20150320120000&currency=USD&sign_type=MD5&sign=a77e894e71491f41e73ebe40319cc300", @alipay::Service::Trade.build_refund_uri(params).to_s
71
+ assert_equal expected_result, @alipay::Service::Trade.refund(params)
72
+ end
73
+
74
+ it "should handle nil reason correctly" do
75
+ params = {
76
+ out_return_no: "SAMPLE_REFUND_ID",
77
+ out_trade_no: "SAMPLE_TRANSACTION_ID",
78
+ return_rmb_amount: 200.00,
79
+ gmt_return: (Time.parse("2015-03-20 12:00").getlocal("+08:00")).strftime("%Y%m%d%H%M%S"),
80
+ currency: "USD"
81
+ }
82
+ expected_result = { success: false, message: "PURCHASE_TRADE_NOT_EXIST" }
83
+
84
+ assert_equal "https://mapi.alipay.net/gateway.do?service=forex_refund&_input_charset=utf-8&partner=2088101122136241&out_return_no=SAMPLE_REFUND_ID&out_trade_no=SAMPLE_TRANSACTION_ID&return_rmb_amount=200.00&gmt_return=20150320120000&currency=USD&reason=no_reason&sign_type=MD5&sign=c4c09ca3fc78d04b88d9459b02673b1b", @alipay::Service::Trade.build_refund_uri(params).to_s
85
+ assert_equal expected_result, @alipay::Service::Trade.refund(params)
86
+ end
87
+
88
+ it "should handle empty reason correctly" do
89
+ params = {
90
+ out_return_no: "SAMPLE_REFUND_ID",
91
+ out_trade_no: "SAMPLE_TRANSACTION_ID",
92
+ return_rmb_amount: 200.00,
93
+ gmt_return: (Time.parse("2015-03-20 12:00").getlocal("+08:00")).strftime("%Y%m%d%H%M%S"),
94
+ reason: " ",
95
+ currency: "USD"
96
+ }
97
+ expected_result = { success: false, message: "PURCHASE_TRADE_NOT_EXIST" }
98
+
99
+ assert_equal "https://mapi.alipay.net/gateway.do?service=forex_refund&_input_charset=utf-8&partner=2088101122136241&out_return_no=SAMPLE_REFUND_ID&out_trade_no=SAMPLE_TRANSACTION_ID&return_rmb_amount=200.00&gmt_return=20150320120000&reason=no_reason&currency=USD&sign_type=MD5&sign=c4c09ca3fc78d04b88d9459b02673b1b", @alipay::Service::Trade.build_refund_uri(params).to_s
100
+ assert_equal expected_result, @alipay::Service::Trade.refund(params)
101
+ end
102
+ end
103
+
104
+ describe "#batch_refund" do
59
105
  it "should transact refund correctly" do
60
106
  sample_refunds = [
61
107
  { new_transaction_id: '111222333', old_transaction_id: '444555666', currency: 'USD', refund_sum: 200.00, refund_time: '20120330235959', refund_reason: 'bello minions' },
62
108
  { new_transaction_id: '111222333', old_transaction_id: '444555667', currency: 'USD', refund_sum: 150.00, refund_time: '20120330235959', refund_reason: 'monkey' }
63
109
  ]
64
110
 
65
- @alipay::Service::Trade.refund(sample_refunds)
111
+ @alipay::Service::Trade.batch_refund(sample_refunds)
66
112
  end
67
113
 
68
114
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: alipay_global
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Melvrick Goh, Ng Junyang, Grzegorz Witek
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-06-18 00:00:00.000000000 Z
11
+ date: 2015-06-20 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -80,6 +80,20 @@ dependencies:
80
80
  - - ">="
81
81
  - !ruby/object:Gem::Version
82
82
  version: '0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: rest-client
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - "~>"
88
+ - !ruby/object:Gem::Version
89
+ version: 1.8.0
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - "~>"
95
+ - !ruby/object:Gem::Version
96
+ version: 1.8.0
83
97
  description: An unofficial simple global.alipay gem
84
98
  email:
85
99
  - melvrickgoh@kaligo.com