zaypay 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.
- data/lib/zaypay.rb +5 -0
- data/lib/zaypay/error.rb +10 -0
- data/lib/zaypay/price_setting.rb +138 -0
- data/lib/zaypay/util.rb +28 -0
- data/lib/zaypay/version.rb +3 -0
- data/test/create_payment.xml +33 -0
- data/test/error_with_dynamic_amounts.xml +4 -0
- data/test/locale_for_ip.xml +4 -0
- data/test/mark_payload_provided.xml +28 -0
- data/test/multi_countries_ps.xml +280 -0
- data/test/multiple_payment_methods.xml +28 -0
- data/test/price_setting_test.rb +498 -0
- data/test/show_payment.xml +28 -0
- data/test/single_country_ps.xml +116 -0
- data/test/single_payment_method.xml +18 -0
- data/test/test_helper.rb +20 -0
- data/test/util_test.rb +48 -0
- data/test/verification_code.xml +28 -0
- metadata +223 -0
data/lib/zaypay.rb
ADDED
data/lib/zaypay/error.rb
ADDED
@@ -0,0 +1,138 @@
|
|
1
|
+
module Zaypay
|
2
|
+
require 'yaml'
|
3
|
+
class PriceSetting
|
4
|
+
include HTTParty
|
5
|
+
attr_reader :price_setting_id, :key
|
6
|
+
attr_accessor :locale, :payment_method_id
|
7
|
+
|
8
|
+
base_uri 'https://secure.zaypay.com'
|
9
|
+
headers :Accept => 'application/xml'
|
10
|
+
|
11
|
+
def initialize(price_setting_id=nil, key=nil)
|
12
|
+
@price_setting_id, @key = price_setting_id, key
|
13
|
+
select_settings
|
14
|
+
end
|
15
|
+
|
16
|
+
def locale_for_ip(ip)
|
17
|
+
get "/#{ip}/pay/#{price_setting_id}/locale_for_ip" do |data|
|
18
|
+
parts = data[:locale].split('-')
|
19
|
+
{:country => parts[1], :language => parts[0]}
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
def locale_string_for_ip(ip)
|
24
|
+
get "/#{ip}/pay/#{price_setting_id}/locale_for_ip" do |data|
|
25
|
+
parts = data[:locale].split('-')
|
26
|
+
Zaypay::Util.stringify_locale_hash({:country => parts[1], :language => parts[0]})
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
def ip_country_is_configured?(ip, options={})
|
31
|
+
# options can take a :amount key
|
32
|
+
locale = locale_for_ip(ip)
|
33
|
+
country = list_countries(options).select{ |c| c.has_value? locale[:country] }.first
|
34
|
+
{:country => country, :locale => locale} if country
|
35
|
+
end
|
36
|
+
|
37
|
+
# returns a hash containing keys countries and languages
|
38
|
+
def list_locales(options={})
|
39
|
+
get "/#{options[:amount]}/pay/#{price_setting_id}/list_locales" do |data|
|
40
|
+
{:countries => Zaypay::Util.arrayify_if_not_an_array(data[:countries][:country]),
|
41
|
+
:languages => data[:languages][:language]}
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
# returns an array with countries
|
46
|
+
def list_countries(options={})
|
47
|
+
get "/#{options[:amount]}/pay/#{price_setting_id}/list_locales" do |data|
|
48
|
+
Zaypay::Util.arrayify_if_not_an_array(data[:countries][:country])
|
49
|
+
end
|
50
|
+
end
|
51
|
+
|
52
|
+
# returns an array with languages
|
53
|
+
def list_languages(options={})
|
54
|
+
get "/#{options[:amount]}/pay/#{price_setting_id}/list_locales" do |data|
|
55
|
+
data[:languages][:language]
|
56
|
+
end
|
57
|
+
end
|
58
|
+
|
59
|
+
def list_payment_methods(options={})
|
60
|
+
raise Zaypay::Error.new(:locale_not_set, "locale was not set for your price setting") if @locale.nil?
|
61
|
+
get "/#{options[:amount]}/#{@locale}/pay/#{price_setting_id}/payments/new" do |data|
|
62
|
+
Zaypay::Util.arrayify_if_not_an_array(data[:payment_methods][:payment_method])
|
63
|
+
end
|
64
|
+
end
|
65
|
+
|
66
|
+
# Example: @price_setting.create_payment(:custom_variable => "my value", :payalogue_id => payalogue_id, :amount => optional_amount )
|
67
|
+
def create_payment(options={})
|
68
|
+
raise Zaypay::Error.new(:locale_not_set, "locale was not set for your price setting") if @locale.nil?
|
69
|
+
raise Zaypay::Error.new(:payment_method_id_not_set, "payment_method_id was not set for your price setting") if @payment_method_id.nil?
|
70
|
+
query = {:payment_method_id => payment_method_id}
|
71
|
+
query.merge!(options)
|
72
|
+
amount = query.delete(:amount)
|
73
|
+
post "/#{amount}/#{@locale}/pay/#{price_setting_id}/payments", query do |data|
|
74
|
+
payment_hash data
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
def show_payment(payment_id)
|
79
|
+
get "///pay/#{price_setting_id}/payments/#{payment_id}" do |data|
|
80
|
+
payment_hash data
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
def verification_code(payment_id, verification_code)
|
85
|
+
post "///pay/#{price_setting_id}/payments/#{payment_id}/verification_code", :verification_code => verification_code do |data|
|
86
|
+
payment_hash data
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def mark_payload_provided(payment_id)
|
91
|
+
post "///pay/#{price_setting_id}/payments/#{payment_id}/mark_payload_provided" do |data|
|
92
|
+
payment_hash data
|
93
|
+
end
|
94
|
+
end
|
95
|
+
|
96
|
+
protected
|
97
|
+
def select_settings
|
98
|
+
unless @price_setting_id and @key
|
99
|
+
begin
|
100
|
+
config = YAML.load_file("#{Rails.root}/config/zaypay.yml")
|
101
|
+
rescue => e
|
102
|
+
puts 'Please either specify price_setting id and its API-key as first 2 arguments to #new, or create a config-file (checkout the plugin README)'
|
103
|
+
raise e
|
104
|
+
end
|
105
|
+
@price_setting_id = config['default'] unless @price_setting_id
|
106
|
+
@key = config[@price_setting_id]
|
107
|
+
if @key.nil? || @price_setting_id.nil?
|
108
|
+
raise Zaypay::Error.new(:config_error, "You did not provide a price_setting id or/and an API-key. You can either pass it to the constructor
|
109
|
+
or create a config file (check out README)")
|
110
|
+
end
|
111
|
+
end
|
112
|
+
end
|
113
|
+
|
114
|
+
def method_missing(method, url, extra_query_string={})
|
115
|
+
super unless [:get, :post, :put, :delete].include?(method)
|
116
|
+
response = self.class.send(method, ('https://secure.zaypay.com' + url), {:query => default_query.merge!(extra_query_string),
|
117
|
+
:headers => {'Accept' => 'application/xml' } })
|
118
|
+
|
119
|
+
Zaypay::Util.uber_symbolize(response)
|
120
|
+
check response
|
121
|
+
block_given? ? yield(response[:response]) : response[:response]
|
122
|
+
end
|
123
|
+
|
124
|
+
def check(response)
|
125
|
+
raise Zaypay::Error.new(:http_error, "HTTP-request to zaypay yielded status #{response.code}..\n\nzaypay said:\n#{response.body}") unless response.code == 200
|
126
|
+
raise Zaypay::Error.new(:http_error, "HTTP-request to yielded an error:\n#{response[:response][:error]}") if response[:response].delete(:status)=='error'
|
127
|
+
end
|
128
|
+
|
129
|
+
def default_query
|
130
|
+
{:key => key}
|
131
|
+
end
|
132
|
+
|
133
|
+
def payment_hash(data)
|
134
|
+
{:payment => data.delete(:payment),
|
135
|
+
:instructions => data}.delete_if{|k,v| v.nil?}
|
136
|
+
end
|
137
|
+
end
|
138
|
+
end
|
data/lib/zaypay/util.rb
ADDED
@@ -0,0 +1,28 @@
|
|
1
|
+
module Zaypay
|
2
|
+
class Util
|
3
|
+
|
4
|
+
def self.uber_symbolize(data)
|
5
|
+
if data.is_a?(Hash)
|
6
|
+
data.keys.each do |key|
|
7
|
+
data[(key.to_sym rescue key) || key] = data.delete(key)
|
8
|
+
end
|
9
|
+
data.values.each do |v|
|
10
|
+
Zaypay::Util.uber_symbolize(v)
|
11
|
+
end
|
12
|
+
end
|
13
|
+
if data.is_a?(Array)
|
14
|
+
data.each{|e| Zaypay::Util.uber_symbolize(e)}
|
15
|
+
end
|
16
|
+
data
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.stringify_locale_hash(locale_hash)
|
20
|
+
locale_hash[:language] << '-' << locale_hash[:country]
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.arrayify_if_not_an_array(obj)
|
24
|
+
obj.is_a?(Array) ? obj : [obj]
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<response status="success">
|
3
|
+
<payment>
|
4
|
+
<created-at type="datetime">2012-07-31T09:48:18Z</created-at>
|
5
|
+
<id type="integer">789456321</id>
|
6
|
+
<locale>nl-NL</locale>
|
7
|
+
<paycode>1372</paycode>
|
8
|
+
<payload-provided type="boolean">false</payload-provided>
|
9
|
+
<total-amount type="decimal">0.9</total-amount>
|
10
|
+
<currency>EUR</currency>
|
11
|
+
<amount-euro type="float">0.9</amount-euro>
|
12
|
+
<total-payout type="decimal">0.42</total-payout>
|
13
|
+
<number>7711</number>
|
14
|
+
<formatted-number>7711</formatted-number>
|
15
|
+
<keyword>PAY</keyword>
|
16
|
+
<platform>sms</platform>
|
17
|
+
<human-platform>sms</human-platform>
|
18
|
+
<messages-to-be-sent type="integer">1</messages-to-be-sent>
|
19
|
+
<messages-left-to-be-sent type="integer">1</messages-left-to-be-sent>
|
20
|
+
<partly-customer-phone-number>unknown</partly-customer-phone-number>
|
21
|
+
<customer-phone-number-hash>unknown</customer-phone-number-hash>
|
22
|
+
<customer-mo-message>unknown</customer-mo-message>
|
23
|
+
<verification-needed type="boolean">false</verification-needed>
|
24
|
+
<status>prepared</status>
|
25
|
+
<payment-method-id type="integer">2</payment-method-id>
|
26
|
+
</payment>
|
27
|
+
<status-string>De betaling is voorbereid</status-string>
|
28
|
+
<very-short-instructions>betaal per sms</very-short-instructions>
|
29
|
+
<very-short-instructions-with-amount>betaal € 0,90 per sms</very-short-instructions-with-amount>
|
30
|
+
<short-instructions>SMS de tekst PAY 1372 naar nummer 7711.</short-instructions>
|
31
|
+
<long-instructions>SMS de tekst PAY 1372 naar telefoonnummer 7711. Je zal 1 bericht ontvangen. Hiermee is dan € 0,90 betaald. Verder betaal je het normale tarief voor het versturen van één SMSje. </long-instructions>
|
32
|
+
<disclaimer>Je staat op het punt om met echt geld te betalen. Als je jonger bent dan 13 jaar, moet je hiervoor toestemming hebben van je ouders.</disclaimer>
|
33
|
+
</response>
|
@@ -0,0 +1,28 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<response status="success">
|
3
|
+
<payment>
|
4
|
+
<created-at type="datetime">2012-07-11T13:53:35Z</created-at>
|
5
|
+
<id type="integer">789456321</id>
|
6
|
+
<locale>nl-NL</locale>
|
7
|
+
<paycode>1543</paycode>
|
8
|
+
<payload-provided type="boolean">true</payload-provided>
|
9
|
+
<total-amount type="decimal">0.25</total-amount>
|
10
|
+
<currency>EUR</currency>
|
11
|
+
<amount-euro type="float">0.25</amount-euro>
|
12
|
+
<total-payout type="decimal">0.05</total-payout>
|
13
|
+
<number>7711</number>
|
14
|
+
<formatted-number>7711</formatted-number>
|
15
|
+
<keyword>PAY</keyword>
|
16
|
+
<platform>sms</platform>
|
17
|
+
<human-platform>sms</human-platform>
|
18
|
+
<messages-to-be-sent type="integer">1</messages-to-be-sent>
|
19
|
+
<messages-left-to-be-sent type="integer">0</messages-left-to-be-sent>
|
20
|
+
<partly-customer-phone-number>3161158xxxx</partly-customer-phone-number>
|
21
|
+
<customer-phone-number-hash>f86610eb216961e7caa46f009cb990bd98b0c8ae</customer-phone-number-hash>
|
22
|
+
<customer-mo-message>PAY 1543</customer-mo-message>
|
23
|
+
<verification-needed type="boolean">false</verification-needed>
|
24
|
+
<status>paid</status>
|
25
|
+
<payment-method-id type="integer">2</payment-method-id>
|
26
|
+
<ip-address>95.97.131.28</ip-address>
|
27
|
+
</payment>
|
28
|
+
</response>
|
@@ -0,0 +1,280 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<response status="success">
|
3
|
+
<languages>
|
4
|
+
<language>
|
5
|
+
<code>id</code>
|
6
|
+
<english-name>Indonesian</english-name>
|
7
|
+
<native-name>Bahasa indonesia</native-name>
|
8
|
+
</language>
|
9
|
+
<language>
|
10
|
+
<code>bs</code>
|
11
|
+
<english-name>Bosnian</english-name>
|
12
|
+
<native-name>Bosnian</native-name>
|
13
|
+
</language>
|
14
|
+
<language>
|
15
|
+
<code>da</code>
|
16
|
+
<english-name>Danish</english-name>
|
17
|
+
<native-name>Dansk</native-name>
|
18
|
+
</language>
|
19
|
+
<language>
|
20
|
+
<code>de</code>
|
21
|
+
<english-name>German</english-name>
|
22
|
+
<native-name>Deutsch</native-name>
|
23
|
+
</language>
|
24
|
+
<language>
|
25
|
+
<code>en</code>
|
26
|
+
<english-name>English</english-name>
|
27
|
+
<native-name>English</native-name>
|
28
|
+
</language>
|
29
|
+
<language>
|
30
|
+
<code>es</code>
|
31
|
+
<english-name>Spanish (Castellano)</english-name>
|
32
|
+
<native-name>Español (Castellano)</native-name>
|
33
|
+
</language>
|
34
|
+
<language>
|
35
|
+
<code>ls</code>
|
36
|
+
<english-name>Spanish (Latin-American)</english-name>
|
37
|
+
<native-name>Español (Latinoamérica)</native-name>
|
38
|
+
</language>
|
39
|
+
<language>
|
40
|
+
<code>fr</code>
|
41
|
+
<english-name>French</english-name>
|
42
|
+
<native-name>français</native-name>
|
43
|
+
</language>
|
44
|
+
<language>
|
45
|
+
<code>hr</code>
|
46
|
+
<english-name>Croatian</english-name>
|
47
|
+
<native-name>Hrvatski</native-name>
|
48
|
+
</language>
|
49
|
+
<language>
|
50
|
+
<code>it</code>
|
51
|
+
<english-name>Italian</english-name>
|
52
|
+
<native-name>italiano</native-name>
|
53
|
+
</language>
|
54
|
+
<language>
|
55
|
+
<code>nl</code>
|
56
|
+
<english-name>Dutch</english-name>
|
57
|
+
<native-name>Nederlands</native-name>
|
58
|
+
</language>
|
59
|
+
<language>
|
60
|
+
<code>pl</code>
|
61
|
+
<english-name>Polish</english-name>
|
62
|
+
<native-name>Polski</native-name>
|
63
|
+
</language>
|
64
|
+
<language>
|
65
|
+
<code>pt</code>
|
66
|
+
<english-name>Portuguese</english-name>
|
67
|
+
<native-name>português</native-name>
|
68
|
+
</language>
|
69
|
+
<language>
|
70
|
+
<code>ru</code>
|
71
|
+
<english-name>Russian</english-name>
|
72
|
+
<native-name>Pyccĸий</native-name>
|
73
|
+
</language>
|
74
|
+
<language>
|
75
|
+
<code>ro</code>
|
76
|
+
<english-name>Romanian</english-name>
|
77
|
+
<native-name>Română</native-name>
|
78
|
+
</language>
|
79
|
+
<language>
|
80
|
+
<code>sr</code>
|
81
|
+
<english-name>Serbian</english-name>
|
82
|
+
<native-name>Srpski</native-name>
|
83
|
+
</language>
|
84
|
+
<language>
|
85
|
+
<code>fi</code>
|
86
|
+
<english-name>Finnish</english-name>
|
87
|
+
<native-name>suomi</native-name>
|
88
|
+
</language>
|
89
|
+
<language>
|
90
|
+
<code>sv</code>
|
91
|
+
<english-name>Swedish</english-name>
|
92
|
+
<native-name>svenska</native-name>
|
93
|
+
</language>
|
94
|
+
<language>
|
95
|
+
<code>cs</code>
|
96
|
+
<english-name>Czech</english-name>
|
97
|
+
<native-name>čeština</native-name>
|
98
|
+
</language>
|
99
|
+
<language>
|
100
|
+
<code>bg</code>
|
101
|
+
<english-name>Bulgarian</english-name>
|
102
|
+
<native-name>Български</native-name>
|
103
|
+
</language>
|
104
|
+
<language>
|
105
|
+
<code>he</code>
|
106
|
+
<english-name>Hebrew</english-name>
|
107
|
+
<native-name>עברית</native-name>
|
108
|
+
</language>
|
109
|
+
</languages>
|
110
|
+
<countries>
|
111
|
+
<country>
|
112
|
+
<code>AR</code>
|
113
|
+
<name>Argentina</name>
|
114
|
+
</country>
|
115
|
+
<country>
|
116
|
+
<code>AU</code>
|
117
|
+
<name>Australia</name>
|
118
|
+
</country>
|
119
|
+
<country>
|
120
|
+
<code>AT</code>
|
121
|
+
<name>Austria</name>
|
122
|
+
</country>
|
123
|
+
<country>
|
124
|
+
<code>BE</code>
|
125
|
+
<name>Belgium</name>
|
126
|
+
</country>
|
127
|
+
<country>
|
128
|
+
<code>BA</code>
|
129
|
+
<name>Bosnia and Herzegovina</name>
|
130
|
+
</country>
|
131
|
+
<country>
|
132
|
+
<code>BG</code>
|
133
|
+
<name>Bulgaria</name>
|
134
|
+
</country>
|
135
|
+
<country>
|
136
|
+
<code>CA</code>
|
137
|
+
<name>Canada</name>
|
138
|
+
</country>
|
139
|
+
<country>
|
140
|
+
<code>CL</code>
|
141
|
+
<name>Chile</name>
|
142
|
+
</country>
|
143
|
+
<country>
|
144
|
+
<code>CZ</code>
|
145
|
+
<name>Czech Republic</name>
|
146
|
+
</country>
|
147
|
+
<country>
|
148
|
+
<code>DK</code>
|
149
|
+
<name>Denmark</name>
|
150
|
+
</country>
|
151
|
+
<country>
|
152
|
+
<code>EE</code>
|
153
|
+
<name>Estonia</name>
|
154
|
+
</country>
|
155
|
+
<country>
|
156
|
+
<code>FI</code>
|
157
|
+
<name>Finland</name>
|
158
|
+
</country>
|
159
|
+
<country>
|
160
|
+
<code>FR</code>
|
161
|
+
<name>France</name>
|
162
|
+
</country>
|
163
|
+
<country>
|
164
|
+
<code>DE</code>
|
165
|
+
<name>Germany</name>
|
166
|
+
</country>
|
167
|
+
<country>
|
168
|
+
<code>GR</code>
|
169
|
+
<name>Greece</name>
|
170
|
+
</country>
|
171
|
+
<country>
|
172
|
+
<code>HK</code>
|
173
|
+
<name>Hong Kong</name>
|
174
|
+
</country>
|
175
|
+
<country>
|
176
|
+
<code>HU</code>
|
177
|
+
<name>Hungary</name>
|
178
|
+
</country>
|
179
|
+
<country>
|
180
|
+
<code>IE</code>
|
181
|
+
<name>Ireland</name>
|
182
|
+
</country>
|
183
|
+
<country>
|
184
|
+
<code>IL</code>
|
185
|
+
<name>Israel</name>
|
186
|
+
</country>
|
187
|
+
<country>
|
188
|
+
<code>IT</code>
|
189
|
+
<name>Italy</name>
|
190
|
+
</country>
|
191
|
+
<country>
|
192
|
+
<code>LV</code>
|
193
|
+
<name>Latvia</name>
|
194
|
+
</country>
|
195
|
+
<country>
|
196
|
+
<code>LT</code>
|
197
|
+
<name>Lithuania</name>
|
198
|
+
</country>
|
199
|
+
<country>
|
200
|
+
<code>LU</code>
|
201
|
+
<name>Luxembourg</name>
|
202
|
+
</country>
|
203
|
+
<country>
|
204
|
+
<code>MX</code>
|
205
|
+
<name>Mexico</name>
|
206
|
+
</country>
|
207
|
+
<country>
|
208
|
+
<code>NL</code>
|
209
|
+
<name>Netherlands</name>
|
210
|
+
</country>
|
211
|
+
<country>
|
212
|
+
<code>NZ</code>
|
213
|
+
<name>New Zealand</name>
|
214
|
+
</country>
|
215
|
+
<country>
|
216
|
+
<code>NO</code>
|
217
|
+
<name>Norway</name>
|
218
|
+
</country>
|
219
|
+
<country>
|
220
|
+
<code>PL</code>
|
221
|
+
<name>Poland</name>
|
222
|
+
</country>
|
223
|
+
<country>
|
224
|
+
<code>PT</code>
|
225
|
+
<name>Portugal</name>
|
226
|
+
</country>
|
227
|
+
<country>
|
228
|
+
<code>RO</code>
|
229
|
+
<name>Romania</name>
|
230
|
+
</country>
|
231
|
+
<country>
|
232
|
+
<code>RU</code>
|
233
|
+
<name>Russian Federation</name>
|
234
|
+
</country>
|
235
|
+
<country>
|
236
|
+
<code>CS</code>
|
237
|
+
<name>Serbia and Montenegro</name>
|
238
|
+
</country>
|
239
|
+
<country>
|
240
|
+
<code>SK</code>
|
241
|
+
<name>Slovakia</name>
|
242
|
+
</country>
|
243
|
+
<country>
|
244
|
+
<code>ZA</code>
|
245
|
+
<name>South Africa</name>
|
246
|
+
</country>
|
247
|
+
<country>
|
248
|
+
<code>ES</code>
|
249
|
+
<name>Spain</name>
|
250
|
+
</country>
|
251
|
+
<country>
|
252
|
+
<code>SE</code>
|
253
|
+
<name>Sweden</name>
|
254
|
+
</country>
|
255
|
+
<country>
|
256
|
+
<code>CH</code>
|
257
|
+
<name>Switzerland</name>
|
258
|
+
</country>
|
259
|
+
<country>
|
260
|
+
<code>TW</code>
|
261
|
+
<name>Taiwan</name>
|
262
|
+
</country>
|
263
|
+
<country>
|
264
|
+
<code>TR</code>
|
265
|
+
<name>Turkey</name>
|
266
|
+
</country>
|
267
|
+
<country>
|
268
|
+
<code>UA</code>
|
269
|
+
<name>Ukraine</name>
|
270
|
+
</country>
|
271
|
+
<country>
|
272
|
+
<code>GB</code>
|
273
|
+
<name>United Kingdom</name>
|
274
|
+
</country>
|
275
|
+
<country>
|
276
|
+
<code>US</code>
|
277
|
+
<name>United States of America</name>
|
278
|
+
</country>
|
279
|
+
</countries>
|
280
|
+
</response>
|