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 ADDED
@@ -0,0 +1,5 @@
1
+ require 'httparty'
2
+ require 'zaypay/price_setting'
3
+ require 'zaypay/error'
4
+ require 'zaypay/util'
5
+ require "zaypay/version"
@@ -0,0 +1,10 @@
1
+ module Zaypay
2
+ class Error < StandardError
3
+ def initialize(type = nil, message = "default message")
4
+ @type = type
5
+ super(message)
6
+ end
7
+ attr_accessor :type
8
+ end
9
+
10
+ end
@@ -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
@@ -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,3 @@
1
+ module Zaypay
2
+ VERSION = "1.0.0"
3
+ 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 &#8364; 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 &#8364; 0,90 betaald. Verder betaal je het normale tarief voor het versturen van &#233;&#233;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,4 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <response status="error">
3
+ <error>It is not supported to use dynamic amounts with a Price Setting that is in Full Control mode. Use one in (Super) Easy mode if you want to use dynamic amounts through the API.</error>
4
+ </response>
@@ -0,0 +1,4 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <response status="success">
3
+ <locale>nl-NL</locale>
4
+ </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&#241;ol (Castellano)</native-name>
33
+ </language>
34
+ <language>
35
+ <code>ls</code>
36
+ <english-name>Spanish (Latin-American)</english-name>
37
+ <native-name>Espa&#241;ol (Latinoam&#233;rica)</native-name>
38
+ </language>
39
+ <language>
40
+ <code>fr</code>
41
+ <english-name>French</english-name>
42
+ <native-name>fran&#231;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&#234;s</native-name>
68
+ </language>
69
+ <language>
70
+ <code>ru</code>
71
+ <english-name>Russian</english-name>
72
+ <native-name>Pycc&#312;&#1080;&#1081;</native-name>
73
+ </language>
74
+ <language>
75
+ <code>ro</code>
76
+ <english-name>Romanian</english-name>
77
+ <native-name>Rom&#226;n&#259;</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>&#269;e&#353;tina</native-name>
98
+ </language>
99
+ <language>
100
+ <code>bg</code>
101
+ <english-name>Bulgarian</english-name>
102
+ <native-name>&#1041;&#1098;&#1083;&#1075;&#1072;&#1088;&#1089;&#1082;&#1080;</native-name>
103
+ </language>
104
+ <language>
105
+ <code>he</code>
106
+ <english-name>Hebrew</english-name>
107
+ <native-name>&#1506;&#1489;&#1512;&#1497;&#1514;</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>