payoneer_api 0.1.0 → 1.0.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/payoneer_api.rb +12 -0
- data/lib/payoneer_api/api.rb +9 -0
- data/lib/payoneer_api/api/payees.rb +99 -0
- data/lib/payoneer_api/base.rb +17 -0
- data/lib/payoneer_api/client.rb +8 -97
- data/lib/payoneer_api/core_ext/hash.rb +4 -39
- data/lib/payoneer_api/payee.rb +34 -0
- data/lib/payoneer_api/payoneer_response.rb +5 -0
- data/lib/payoneer_api/payoneer_token.rb +18 -0
- data/lib/payoneer_api/request.rb +27 -0
- data/lib/payoneer_api/response.rb +37 -0
- data/lib/payoneer_api/utils.rb +33 -0
- data/lib/payoneer_api/version.rb +2 -2
- data/payoneer_api.gemspec +1 -0
- data/spec/fixtures/vcr_cassettes/PayoneerApi_API_Payees/_payee_details/associates_basic_contact_data_with_the_payee_object.yml +55 -0
- data/spec/fixtures/vcr_cassettes/PayoneerApi_API_Payees/_payee_details/returns_an_instance_of_a_Payee_object.yml +55 -0
- data/spec/fixtures/vcr_cassettes/{PayoneerApi_Client → PayoneerApi_API_Payees}/_payee_prefilled_signup_url/with_all_correct_params_passed_in/includes_a_token_parameter_in_this_url.yml +5 -5
- data/spec/fixtures/vcr_cassettes/{PayoneerApi_Client → PayoneerApi_API_Payees}/_payee_prefilled_signup_url/with_all_correct_params_passed_in/returns_a_url_to_the_prefilled_registration_page.yml +5 -5
- data/spec/fixtures/vcr_cassettes/{PayoneerApi_Client → PayoneerApi_API_Payees}/_payee_prefilled_signup_url/with_incorrect_login_credentials/returns_a_parsed_error_notification.yml +3 -3
- data/spec/fixtures/vcr_cassettes/PayoneerApi_API_Payees/_payee_signup_url/allows_you_to_us_the_to_s_method_on_that_object_to_obtain_the_registration_url.yml +49 -0
- data/spec/fixtures/vcr_cassettes/PayoneerApi_API_Payees/_payee_signup_url/allows_you_to_use_the_uri_method_to_get_the_URI_object_directly.yml +49 -0
- data/spec/fixtures/vcr_cassettes/{PayoneerApi_Client → PayoneerApi_API_Payees}/_payee_signup_url/returns_a_url_to_the_registration_page.yml +7 -7
- data/spec/fixtures/vcr_cassettes/PayoneerApi_API_Payees/_payee_signup_url/returns_payoneer_token.yml +49 -0
- data/spec/fixtures/vcr_cassettes/PayoneerApi_Client/_new_payee_prefilled_signup_url/returns_a_url_to_the_prefilled_registration_page.yml +5 -5
- data/spec/fixtures/vcr_cassettes/PayoneerApi_Client/_new_payee_signup_url/returns_a_url_to_the_registration_page_implicit_credentials_through_environment_variables_.yml +7 -7
- data/spec/payoneer_api/api/payees_spec.rb +83 -0
- data/spec/payoneer_api/client_spec.rb +6 -55
- data/spec/payoneer_api/payee_spec.rb +30 -0
- data/spec/spec_helper.rb +3 -0
- metadata +52 -9
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: ef5defb10e6a13b020c469cff3a96da579859bc2
|
4
|
+
data.tar.gz: e0f6421510031fb627bb75582bf28e01115d4b0d
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 5a9f441a4b18ecba8b8470875f1b409d2d4b8bbbf3a4330fc88ebb2b10a7ce65f915dfeae9818720bc48386a53d985a8d65b7ff3891c2bff669598540e6f3d06
|
7
|
+
data.tar.gz: 79e919905afac856e721d32e23b470cae9597a5fa9a83686f022f59e3bfb9b73c034bb7a47bbbc3315e97005b76adf7248dfa40401b24ba33e451117f5674054
|
data/lib/payoneer_api.rb
CHANGED
@@ -1,7 +1,19 @@
|
|
1
1
|
require 'net/http'
|
2
2
|
require 'net/https'
|
3
3
|
|
4
|
+
require 'active_support/core_ext/hash/slice'
|
5
|
+
require 'active_support/core_ext/hash/conversions'
|
6
|
+
require 'active_support/core_ext/string/inflections'
|
7
|
+
require 'active_support/concern'
|
4
8
|
require 'payoneer_api/core_ext/hash'
|
5
9
|
|
10
|
+
require 'payoneer_api/base'
|
11
|
+
require 'payoneer_api/utils'
|
6
12
|
require 'payoneer_api/payoneer_exception'
|
7
13
|
require 'payoneer_api/client'
|
14
|
+
require 'payoneer_api/request'
|
15
|
+
require 'payoneer_api/response'
|
16
|
+
require 'payoneer_api/api'
|
17
|
+
require 'payoneer_api/payee'
|
18
|
+
require 'payoneer_api/payoneer_token'
|
19
|
+
|
@@ -0,0 +1,99 @@
|
|
1
|
+
require 'payoneer_api/utils'
|
2
|
+
require 'payoneer_api/payee'
|
3
|
+
|
4
|
+
module PayoneerApi
|
5
|
+
module API
|
6
|
+
module Payees
|
7
|
+
extend ActiveSupport::Concern
|
8
|
+
include PayoneerApi::Utils
|
9
|
+
|
10
|
+
module ClassMethods
|
11
|
+
def payee_signup_url(member_name, options = {})
|
12
|
+
new(options).payee_signup_url(member_name)
|
13
|
+
end
|
14
|
+
|
15
|
+
def payee_prefilled_signup_url(member_name, options = {})
|
16
|
+
attributes = options.slice!(:partner_id, :username, :password)
|
17
|
+
new(options).payee_prefilled_signup_url(member_name, attributes)
|
18
|
+
end
|
19
|
+
|
20
|
+
def payee_details(payee_id, options = {})
|
21
|
+
new(options).payee_details(payee_id)
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
def payee_signup_url(payee_id, attributes = {})
|
26
|
+
perform_with_object :get,
|
27
|
+
payee_signup_args(attributes.merge(payee_id: payee_id)),
|
28
|
+
PayoneerApi::PayoneerToken
|
29
|
+
end
|
30
|
+
|
31
|
+
def payee_prefilled_signup_url(payee_id, attributes = {})
|
32
|
+
perform_with_object :post,
|
33
|
+
payee_prefilled_signup_args(attributes.merge(payee_id: payee_id)),
|
34
|
+
PayoneerApi::PayoneerToken
|
35
|
+
end
|
36
|
+
|
37
|
+
def payee_details(payee_id)
|
38
|
+
perform_with_object :get,
|
39
|
+
payee_request_args('GetPayeeDetails', payee_id),
|
40
|
+
PayoneerApi::Payee
|
41
|
+
end
|
42
|
+
|
43
|
+
protected
|
44
|
+
|
45
|
+
def payee_request_args(method_name, member_name)
|
46
|
+
request_args(method_name).merge(p4: member_name)
|
47
|
+
end
|
48
|
+
|
49
|
+
def payee_signup_args(args)
|
50
|
+
payee_request_args('GetToken', args[:payee_id]).merge(
|
51
|
+
p5: args[:session_id],
|
52
|
+
p6: args[:redirect_url],
|
53
|
+
p8: args[:redirect_time],
|
54
|
+
p9: bool_to_string(args[:test_card]),
|
55
|
+
p10: 'True',
|
56
|
+
p11: payout_methods_list(args[:payout_methods]),
|
57
|
+
p12: args[:registration_mode],
|
58
|
+
p13: bool_to_string(args[:hold_approval])
|
59
|
+
).delete_blank
|
60
|
+
end
|
61
|
+
|
62
|
+
def payee_prefilled_signup_args(args)
|
63
|
+
builder = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
|
64
|
+
xml.PayoneerDetails do
|
65
|
+
xml.Details do
|
66
|
+
xml.userName @username
|
67
|
+
xml.password @password
|
68
|
+
xml.prid @partner_id
|
69
|
+
xml.apuid args[:payee_id]
|
70
|
+
xml.sessionid args[:session_id] if args[:session_id]
|
71
|
+
xml.redirect args[:redirect_url] if args[:redirect_url]
|
72
|
+
xml.redirectTime args[:redirect_time] if args[:redirect_time]
|
73
|
+
xml.cardType args[:card_type] if args[:card_type]
|
74
|
+
xml.BlockType args[:block_type] if args[:block_type]
|
75
|
+
xml.PayoutMethodList payout_methods_list(args[:payout_methods]) if args[:payout_methods]
|
76
|
+
xml.regMode args[:registration_mode] if args[:registration_mode]
|
77
|
+
xml.holdApproval bool_to_string(args[:hold_approval]) if args[:hold_approval]
|
78
|
+
end
|
79
|
+
xml.PersonalDetails do
|
80
|
+
xml.firstName args[:first_name] if args[:first_name]
|
81
|
+
xml.lastName args[:last_name] if args[:last_name]
|
82
|
+
xml.dateOfBirth args[:date_of_birth] if args[:date_of_birth]
|
83
|
+
xml.address1 args[:address].is_a?(Array) ? args[:address].first : args[:address]
|
84
|
+
xml.address2 args[:address].last if args[:address].is_a?(Array)
|
85
|
+
xml.city args[:city] if args[:city]
|
86
|
+
xml.country args[:country_code] if args[:country_code]
|
87
|
+
xml.state args[:state_code] if args[:state_code]
|
88
|
+
xml.zipCode args[:zip_code] if args[:zip_code]
|
89
|
+
xml.mobile args[:mobile_phone] if args[:mobile_phone]
|
90
|
+
xml.phone args[:phone] if args[:phone]
|
91
|
+
xml.email args[:email] if args[:email]
|
92
|
+
end
|
93
|
+
end
|
94
|
+
end
|
95
|
+
payee_request_args('GetTokenXML', args[:payee_id]).merge(xml: builder.to_xml)
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
module PayoneerApi
|
2
|
+
class Base
|
3
|
+
attr_reader :attrs
|
4
|
+
|
5
|
+
# Initializes a new object
|
6
|
+
#
|
7
|
+
# @param attrs [Hash]
|
8
|
+
# @return [PayoneerApi::Base]
|
9
|
+
def initialize(attrs = {})
|
10
|
+
@attrs = attrs.deep_find(self.class.to_s.demodulize) if attrs.is_a?(Hash)
|
11
|
+
@attrs ||= attrs
|
12
|
+
@attrs.each do |k, v|
|
13
|
+
instance_variable_set("@#{k.to_s.underscore}", v) unless v.nil?
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
data/lib/payoneer_api/client.rb
CHANGED
@@ -1,18 +1,15 @@
|
|
1
|
+
require 'payoneer_api/utils'
|
2
|
+
require 'payoneer_api/api'
|
3
|
+
|
1
4
|
module PayoneerApi
|
2
5
|
class Client
|
6
|
+
include PayoneerApi::Utils
|
7
|
+
include PayoneerApi::API
|
8
|
+
|
3
9
|
SANDBOX_API_URL = 'https://api.sandbox.payoneer.com/Payouts/HttpApi/API.aspx?'
|
4
10
|
PRODUCTION_API_URL = 'https://api.payoneer.com/payouts/HttpAPI/API.aspx?'
|
5
11
|
API_PORT = '443'
|
6
12
|
|
7
|
-
def self.new_payee_signup_url(member_name, options = {})
|
8
|
-
new(options).payee_signup_url(member_name)
|
9
|
-
end
|
10
|
-
|
11
|
-
def self.new_payee_prefilled_signup_url(member_name, options = {})
|
12
|
-
attributes = options.slice!(:partner_id, :username, :password)
|
13
|
-
new(options).payee_prefilled_signup_url(member_name, attributes)
|
14
|
-
end
|
15
|
-
|
16
13
|
def initialize(options = {})
|
17
14
|
@partner_id, @username, @password = options[:partner_id], options[:username], options[:password]
|
18
15
|
@partner_id ||= ENV['PAYONEER_PARTNER_ID']
|
@@ -26,43 +23,8 @@ module PayoneerApi
|
|
26
23
|
@environment ||= 'sandbox'
|
27
24
|
end
|
28
25
|
|
29
|
-
def payee_signup_url(member_name)
|
30
|
-
response = get_api_call(payee_link_args(payee_id: member_name))
|
31
|
-
api_result(response)
|
32
|
-
end
|
33
|
-
|
34
|
-
def payee_prefilled_signup_url(member_name, attributes = {})
|
35
|
-
response = post_api_call(payee_prefill_args(attributes.merge(payee_id: member_name)))
|
36
|
-
xml_api_result(response)
|
37
|
-
end
|
38
|
-
|
39
26
|
private
|
40
27
|
|
41
|
-
def api_result(response)
|
42
|
-
if response.code == '200'
|
43
|
-
return response.body
|
44
|
-
else
|
45
|
-
raise PayoneerException, api_error_description(response)
|
46
|
-
end
|
47
|
-
end
|
48
|
-
|
49
|
-
def xml_api_result(response)
|
50
|
-
if response.code == '200'
|
51
|
-
result = Nokogiri::XML.parse(response.body)
|
52
|
-
token = result.css('PayoneerToken Token').first
|
53
|
-
return token.text if token
|
54
|
-
end
|
55
|
-
raise PayoneerException, api_error_description(response)
|
56
|
-
end
|
57
|
-
|
58
|
-
def api_error_description(response)
|
59
|
-
return unless response and response.body
|
60
|
-
result = Nokogiri::XML.parse(response.body)
|
61
|
-
error_message = result.css('PayoneerResponse Description').first
|
62
|
-
return error_message if error_message
|
63
|
-
result.to_s
|
64
|
-
end
|
65
|
-
|
66
28
|
def get_api_call(args_hash)
|
67
29
|
uri = URI.parse(api_url)
|
68
30
|
uri.query = URI.encode_www_form(args_hash)
|
@@ -83,66 +45,15 @@ module PayoneerApi
|
|
83
45
|
http.request(request)
|
84
46
|
end
|
85
47
|
|
86
|
-
def
|
48
|
+
def request_args(method_name)
|
87
49
|
{
|
88
|
-
mname:
|
50
|
+
mname: method_name.to_s.camelize,
|
89
51
|
p1: @username,
|
90
52
|
p2: @password,
|
91
53
|
p3: @partner_id,
|
92
|
-
p4: args[:payee_id],
|
93
|
-
p5: args[:session_id],
|
94
|
-
}.delete_if { |_, value| value.nil? || value.empty? }
|
95
|
-
end
|
96
|
-
|
97
|
-
def payee_prefill_args(args)
|
98
|
-
{
|
99
|
-
mname: 'GetTokenXML',
|
100
|
-
p1: @username,
|
101
|
-
p2: @password,
|
102
|
-
p3: @partner_id,
|
103
|
-
p4: args[:payee_id],
|
104
|
-
xml: prefill_xml_data(args)
|
105
54
|
}
|
106
55
|
end
|
107
56
|
|
108
|
-
def prefill_xml_data(args)
|
109
|
-
builder = Nokogiri::XML::Builder.new(encoding: 'UTF-8') do |xml|
|
110
|
-
xml.PayoneerDetails do
|
111
|
-
xml.Details do
|
112
|
-
xml.userName @username
|
113
|
-
xml.password @password
|
114
|
-
xml.prid @partner_id
|
115
|
-
xml.apuid args[:payee_id]
|
116
|
-
xml.sessionid args[:session_id] if args[:session_id]
|
117
|
-
xml.redirect args[:redirect_url] if args[:redirect_url]
|
118
|
-
xml.redirectTime args[:redirect_time] if args[:redirect_time]
|
119
|
-
xml.cardType args[:card_type] if args[:card_type]
|
120
|
-
xml.BlockType args[:block_type] if args[:block_type]
|
121
|
-
xml.PayoutMethodList (args[:payout_methods].is_a?(Array) ?
|
122
|
-
args[:payout_methods].join(',') :
|
123
|
-
args[:payout_methods]) if args[:payout_methods]
|
124
|
-
xml.regMode args[:registration_mode] if args[:registration_mode]
|
125
|
-
xml.holdApproval args[:hold_approval] if args[:hold_approval]
|
126
|
-
end
|
127
|
-
xml.PersonalDetails do
|
128
|
-
xml.firstName args[:first_name] if args[:first_name]
|
129
|
-
xml.lastName args[:last_name] if args[:last_name]
|
130
|
-
xml.dateOfBirth args[:date_of_birth] if args[:date_of_birth]
|
131
|
-
xml.address1 args[:address].is_a?(Array) ? args[:address].first : args[:address]
|
132
|
-
xml.address2 args[:address].last if args[:address].is_a?(Array)
|
133
|
-
xml.city args[:city] if args[:city]
|
134
|
-
xml.country args[:country_code] if args[:country_code]
|
135
|
-
xml.state args[:state_code] if args[:state_code]
|
136
|
-
xml.zipCode args[:zip_code] if args[:zip_code]
|
137
|
-
xml.mobile args[:mobile_phone] if args[:mobile_phone]
|
138
|
-
xml.phone args[:phone] if args[:phone]
|
139
|
-
xml.email args[:email] if args[:email]
|
140
|
-
end
|
141
|
-
end
|
142
|
-
end
|
143
|
-
builder.to_xml#.tap { |x| puts x.to_s if sandbox? }
|
144
|
-
end
|
145
|
-
|
146
57
|
def api_url
|
147
58
|
sandbox? ? SANDBOX_API_URL : PRODUCTION_API_URL
|
148
59
|
end
|
@@ -1,44 +1,9 @@
|
|
1
|
-
# Taken from activesupport
|
2
|
-
|
3
1
|
class Hash
|
4
|
-
|
5
|
-
|
6
|
-
#
|
7
|
-
# def search(criteria = {})
|
8
|
-
# criteria.assert_valid_keys(:mass, :velocity, :time)
|
9
|
-
# end
|
10
|
-
#
|
11
|
-
# search(options.slice(:mass, :velocity, :time))
|
12
|
-
#
|
13
|
-
# If you have an array of keys you want to limit to, you should splat them:
|
14
|
-
#
|
15
|
-
# valid_keys = [:mass, :velocity, :time]
|
16
|
-
# search(options.slice(*valid_keys))
|
17
|
-
def slice(*keys)
|
18
|
-
keys.map! { |key| convert_key(key) } if respond_to?(:convert_key, true)
|
19
|
-
keys.each_with_object(self.class.new) { |k, hash| hash[k] = self[k] if has_key?(k) }
|
20
|
-
end
|
21
|
-
|
22
|
-
# Replaces the hash with only the given keys.
|
23
|
-
# Returns a hash containing the removed key/value pairs.
|
24
|
-
#
|
25
|
-
# { a: 1, b: 2, c: 3, d: 4 }.slice!(:a, :b)
|
26
|
-
# # => {:c=>3, :d=>4}
|
27
|
-
def slice!(*keys)
|
28
|
-
keys.map! { |key| convert_key(key) } if respond_to?(:convert_key, true)
|
29
|
-
omit = slice(*self.keys - keys)
|
30
|
-
hash = slice(*keys)
|
31
|
-
hash.default = default
|
32
|
-
hash.default_proc = default_proc if default_proc
|
33
|
-
replace(hash)
|
34
|
-
omit
|
2
|
+
def delete_blank
|
3
|
+
delete_if{|k, v| v.nil? or (v.respond_to?(:empty?) && v.empty?) or (v.instance_of?(Hash) && v.delete_blank.empty?)}
|
35
4
|
end
|
36
5
|
|
37
|
-
|
38
|
-
|
39
|
-
# { a: 1, b: 2, c: 3, d: 4 }.extract!(:a, :b) # => {:a=>1, :b=>2}
|
40
|
-
# { a: 1, b: 2 }.extract!(:a, :x) # => {:a=>1}
|
41
|
-
def extract!(*keys)
|
42
|
-
keys.each_with_object(self.class.new) { |key, result| result[key] = delete(key) if has_key?(key) }
|
6
|
+
def deep_find(key)
|
7
|
+
key?(key) ? self[key] : self.values.inject(nil) {|memo, v| memo ||= v.deep_find(key) if v.respond_to?(:deep_find) }
|
43
8
|
end
|
44
9
|
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
module PayoneerApi
|
2
|
+
class Payee < PayoneerApi::Base
|
3
|
+
attr_reader :first_name, :last_name, :address1, :address2, :city, :state, :zip, :country, :email, :phone,
|
4
|
+
:mobile, :pay_out_method, :payee_status, :reg_date, :cards,
|
5
|
+
:card_id, :card_activation_status, :card_ship_date, :card_status
|
6
|
+
|
7
|
+
def initialize(attrs = {})
|
8
|
+
super
|
9
|
+
initialize_card_attrs if card?
|
10
|
+
end
|
11
|
+
|
12
|
+
def card?
|
13
|
+
pay_out_method == 'Prepaid Card'
|
14
|
+
end
|
15
|
+
|
16
|
+
def direct_deposit?
|
17
|
+
pay_out_method == 'Direct deposit'
|
18
|
+
end
|
19
|
+
|
20
|
+
def iach?
|
21
|
+
pay_out_method == 'iACH'
|
22
|
+
end
|
23
|
+
|
24
|
+
private
|
25
|
+
|
26
|
+
def initialize_card_attrs
|
27
|
+
card_data = @attrs.fetch('Cards', {}).fetch('Card', {})
|
28
|
+
@card_id = card_data['CardID']
|
29
|
+
@card_activation_status = card_data['ActivationStatus']
|
30
|
+
@card_ship_date = card_data['CardShipDate']
|
31
|
+
@card_status = card_data['CardStatus']
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,18 @@
|
|
1
|
+
module PayoneerApi
|
2
|
+
class PayoneerToken < PayoneerApi::Base
|
3
|
+
attr_reader :token
|
4
|
+
|
5
|
+
def initialize(attrs = {})
|
6
|
+
super
|
7
|
+
raise PayoneerException, attrs unless token
|
8
|
+
end
|
9
|
+
|
10
|
+
def uri
|
11
|
+
URI.parse(token)
|
12
|
+
end
|
13
|
+
|
14
|
+
def to_s
|
15
|
+
uri.to_s
|
16
|
+
end
|
17
|
+
end
|
18
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module PayoneerApi
|
2
|
+
class Request
|
3
|
+
attr_accessor :client, :request_method, :options
|
4
|
+
|
5
|
+
# @param client [PayoneerApi::Client]
|
6
|
+
# @param request_method [String, Symbol]
|
7
|
+
# @param options [Hash]
|
8
|
+
# @return [PayoneerApi::Request]
|
9
|
+
def initialize(client, request_method, options = {})
|
10
|
+
@client = client
|
11
|
+
@request_method = request_method.to_sym
|
12
|
+
@options = options
|
13
|
+
end
|
14
|
+
|
15
|
+
# @return [Hash]
|
16
|
+
def perform
|
17
|
+
PayoneerApi::Response.new(@client.send("#{@request_method.to_s}_api_call".to_sym, @options)).body
|
18
|
+
end
|
19
|
+
|
20
|
+
# @param klass [Class]
|
21
|
+
# @param request [PayoneerApi::Request]
|
22
|
+
# @return [Object]
|
23
|
+
def perform_with_object(klass)
|
24
|
+
klass.new(perform)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module PayoneerApi
|
2
|
+
class Response
|
3
|
+
def initialize(response)
|
4
|
+
@response = response
|
5
|
+
raise PayoneerException, api_error_description if @response.code != '200'
|
6
|
+
check_for_errors
|
7
|
+
end
|
8
|
+
|
9
|
+
def body
|
10
|
+
xml?(@response.body) ? Hash.from_xml(@response.body) : @response.body
|
11
|
+
end
|
12
|
+
|
13
|
+
def xml_body
|
14
|
+
@xml_body ||= Nokogiri::XML.parse(@response.body)
|
15
|
+
end
|
16
|
+
|
17
|
+
def xml?(text)
|
18
|
+
!Nokogiri::XML.parse(text).errors.any?
|
19
|
+
end
|
20
|
+
|
21
|
+
private
|
22
|
+
|
23
|
+
def api_error_description
|
24
|
+
return unless @response and @response.body
|
25
|
+
result = xml_body
|
26
|
+
error_message = result.css('PayoneerResponse Description').first
|
27
|
+
return error_message.text if error_message
|
28
|
+
result.to_s
|
29
|
+
end
|
30
|
+
|
31
|
+
def check_for_errors
|
32
|
+
if (result = xml_body.css('PayoneerResponse Result').first) && result.text == 'A00B556F'
|
33
|
+
raise PayoneerException, api_error_description
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|