offsite_payments 2.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.
Files changed (59) hide show
  1. checksums.yaml +7 -0
  2. data/MIT-LICENSE +20 -0
  3. data/README.md +70 -0
  4. data/lib/offsite_payments.rb +46 -0
  5. data/lib/offsite_payments/action_view_helper.rb +72 -0
  6. data/lib/offsite_payments/helper.rb +119 -0
  7. data/lib/offsite_payments/integrations.rb +14 -0
  8. data/lib/offsite_payments/integrations/a1agregator.rb +245 -0
  9. data/lib/offsite_payments/integrations/authorize_net_sim.rb +580 -0
  10. data/lib/offsite_payments/integrations/bit_pay.rb +150 -0
  11. data/lib/offsite_payments/integrations/bogus.rb +32 -0
  12. data/lib/offsite_payments/integrations/chronopay.rb +283 -0
  13. data/lib/offsite_payments/integrations/citrus.rb +227 -0
  14. data/lib/offsite_payments/integrations/direc_pay.rb +339 -0
  15. data/lib/offsite_payments/integrations/directebanking.rb +237 -0
  16. data/lib/offsite_payments/integrations/doku.rb +171 -0
  17. data/lib/offsite_payments/integrations/dotpay.rb +166 -0
  18. data/lib/offsite_payments/integrations/dwolla.rb +160 -0
  19. data/lib/offsite_payments/integrations/e_payment_plans.rb +146 -0
  20. data/lib/offsite_payments/integrations/easy_pay.rb +137 -0
  21. data/lib/offsite_payments/integrations/epay.rb +161 -0
  22. data/lib/offsite_payments/integrations/first_data.rb +133 -0
  23. data/lib/offsite_payments/integrations/gestpay.rb +201 -0
  24. data/lib/offsite_payments/integrations/hi_trust.rb +179 -0
  25. data/lib/offsite_payments/integrations/ipay88.rb +240 -0
  26. data/lib/offsite_payments/integrations/klarna.rb +291 -0
  27. data/lib/offsite_payments/integrations/liqpay.rb +216 -0
  28. data/lib/offsite_payments/integrations/maksuturva.rb +231 -0
  29. data/lib/offsite_payments/integrations/mollie_ideal.rb +213 -0
  30. data/lib/offsite_payments/integrations/moneybookers.rb +199 -0
  31. data/lib/offsite_payments/integrations/nochex.rb +228 -0
  32. data/lib/offsite_payments/integrations/pag_seguro.rb +255 -0
  33. data/lib/offsite_payments/integrations/paxum.rb +114 -0
  34. data/lib/offsite_payments/integrations/pay_fast.rb +269 -0
  35. data/lib/offsite_payments/integrations/paydollar.rb +142 -0
  36. data/lib/offsite_payments/integrations/payflow_link.rb +194 -0
  37. data/lib/offsite_payments/integrations/paypal.rb +362 -0
  38. data/lib/offsite_payments/integrations/paypal_payments_advanced.rb +23 -0
  39. data/lib/offsite_payments/integrations/paysbuy.rb +71 -0
  40. data/lib/offsite_payments/integrations/payu_in.rb +266 -0
  41. data/lib/offsite_payments/integrations/payu_in_paisa.rb +46 -0
  42. data/lib/offsite_payments/integrations/platron.rb +153 -0
  43. data/lib/offsite_payments/integrations/pxpay.rb +271 -0
  44. data/lib/offsite_payments/integrations/quickpay.rb +232 -0
  45. data/lib/offsite_payments/integrations/rbkmoney.rb +110 -0
  46. data/lib/offsite_payments/integrations/robokassa.rb +154 -0
  47. data/lib/offsite_payments/integrations/sage_pay_form.rb +425 -0
  48. data/lib/offsite_payments/integrations/two_checkout.rb +332 -0
  49. data/lib/offsite_payments/integrations/universal.rb +180 -0
  50. data/lib/offsite_payments/integrations/valitor.rb +200 -0
  51. data/lib/offsite_payments/integrations/verkkomaksut.rb +143 -0
  52. data/lib/offsite_payments/integrations/web_pay.rb +186 -0
  53. data/lib/offsite_payments/integrations/webmoney.rb +119 -0
  54. data/lib/offsite_payments/integrations/wirecard_checkout_page.rb +359 -0
  55. data/lib/offsite_payments/integrations/world_pay.rb +273 -0
  56. data/lib/offsite_payments/notification.rb +71 -0
  57. data/lib/offsite_payments/return.rb +37 -0
  58. data/lib/offsite_payments/version.rb +3 -0
  59. metadata +270 -0
@@ -0,0 +1,150 @@
1
+ module OffsitePayments #:nodoc:
2
+ module Integrations #:nodoc:
3
+ module BitPay
4
+ mattr_accessor :service_url
5
+ self.service_url = 'https://bitpay.com/invoice'
6
+
7
+ mattr_accessor :invoicing_url
8
+ self.invoicing_url = 'https://bitpay.com/api/invoice'
9
+
10
+ def self.notification(post, options = {})
11
+ Notification.new(post, options)
12
+ end
13
+
14
+ def self.helper(order, account, options = {})
15
+ Helper.new(order, account, options)
16
+ end
17
+
18
+ def self.return(query_string, options = {})
19
+ Return.new(query_string)
20
+ end
21
+
22
+ class Helper < OffsitePayments::Helper
23
+ def initialize(order_id, account, options)
24
+ super
25
+ @account = account
26
+
27
+ add_field('posData', {'orderId' => order_id}.to_json)
28
+ add_field('fullNotifications', true)
29
+ add_field('transactionSpeed', 'high')
30
+ end
31
+
32
+ mapping :amount, 'price'
33
+ mapping :order, 'orderID'
34
+ mapping :currency, 'currency'
35
+
36
+ mapping :customer, :first_name => 'buyerName',
37
+ :email => 'buyerEmail',
38
+ :phone => 'buyerPhone'
39
+
40
+ mapping :billing_address, :city => 'buyerCity',
41
+ :address1 => 'buyerAddress1',
42
+ :address2 => 'buyerAddress2',
43
+ :state => 'buyerState',
44
+ :zip => 'buyerZip',
45
+ :country => 'buyerCountry'
46
+
47
+ mapping :notify_url, 'notificationURL'
48
+ mapping :return_url, 'redirectURL'
49
+ mapping :id, 'id'
50
+
51
+ def form_method
52
+ "GET"
53
+ end
54
+
55
+ def form_fields
56
+ invoice = create_invoice
57
+
58
+ raise ActionViewHelperError, "Invalid response while retrieving BitPay Invoice ID. Please try again." unless invoice
59
+
60
+ {"id" => invoice['id']}
61
+ end
62
+
63
+ private
64
+
65
+ def create_invoice
66
+ uri = URI.parse(BitPay.invoicing_url)
67
+ http = Net::HTTP.new(uri.host, uri.port)
68
+ http.use_ssl = true
69
+
70
+ request = Net::HTTP::Post.new(uri.request_uri)
71
+ request.content_type = "application/json"
72
+ request.body = @fields.to_json
73
+ request.basic_auth @account, ''
74
+
75
+ response = http.request(request)
76
+ JSON.parse(response.body)
77
+ rescue JSON::ParserError
78
+ end
79
+ end
80
+
81
+ class Notification < OffsitePayments::Notification
82
+ def complete?
83
+ status == "Completed"
84
+ end
85
+
86
+ def transaction_id
87
+ params['id']
88
+ end
89
+
90
+ def item_id
91
+ JSON.parse(params['posData'])['orderId']
92
+ rescue JSON::ParserError
93
+ end
94
+
95
+ def status
96
+ case params['status']
97
+ when 'complete'
98
+ 'Completed'
99
+ when 'confirmed'
100
+ 'Pending'
101
+ when 'invalid'
102
+ 'Failed'
103
+ end
104
+ end
105
+
106
+ # When was this payment received by the client.
107
+ def received_at
108
+ params['invoiceTime'].to_i
109
+ end
110
+
111
+ def currency
112
+ params['currency']
113
+ end
114
+
115
+ def gross
116
+ params['price'].to_f
117
+ end
118
+
119
+ def acknowledge(authcode = nil)
120
+ uri = URI.parse("#{OffsitePayments::Integrations::BitPay.invoicing_url}/#{transaction_id}")
121
+
122
+ http = Net::HTTP.new(uri.host, uri.port)
123
+ http.use_ssl = true
124
+
125
+ request = Net::HTTP::Get.new(uri.path)
126
+ request.basic_auth @options[:credential1], ''
127
+
128
+ response = http.request(request)
129
+
130
+ posted_json = JSON.parse(@raw).tap { |j| j.delete('currentTime') }
131
+ parse(response.body)
132
+ retrieved_json = JSON.parse(@raw).tap { |j| j.delete('currentTime') }
133
+
134
+ posted_json == retrieved_json
135
+ rescue JSON::ParserError
136
+ end
137
+
138
+ private
139
+ def parse(body)
140
+ @raw = body
141
+ @params = JSON.parse(@raw)
142
+ rescue JSON::ParserError
143
+ end
144
+ end
145
+
146
+ class Return < OffsitePayments::Return
147
+ end
148
+ end
149
+ end
150
+ end
@@ -0,0 +1,32 @@
1
+ module OffsitePayments #:nodoc:
2
+ module Integrations #:nodoc:
3
+ module Bogus
4
+ mattr_accessor :service_url
5
+ self.service_url = 'http://www.bogus.com'
6
+
7
+ def self.notification(post, options = {})
8
+ Notification.new(post)
9
+ end
10
+
11
+ def self.return(query_string, options = {})
12
+ Return.new(query_string)
13
+ end
14
+
15
+ class Helper < OffsitePayments::Helper
16
+ mapping :account, 'account'
17
+ mapping :order, 'order'
18
+ mapping :amount, 'amount'
19
+ mapping :currency, 'currency'
20
+ mapping :customer, :first_name => 'first_name',
21
+ :last_name => 'last_name'
22
+
23
+ end
24
+
25
+ class Notification < OffsitePayments::Notification
26
+ end
27
+
28
+ class Return < OffsitePayments::Return
29
+ end
30
+ end
31
+ end
32
+ end
@@ -0,0 +1,283 @@
1
+ module OffsitePayments #:nodoc:
2
+ module Integrations #:nodoc:
3
+ module Chronopay
4
+ mattr_accessor :service_url
5
+ self.service_url = 'https://secure.chronopay.com/index_shop.cgi'
6
+
7
+ def self.notification(post, options = {})
8
+ Notification.new(post)
9
+ end
10
+
11
+ def self.return(query_string, options = {})
12
+ Return.new(query_string)
13
+ end
14
+
15
+ class Helper < OffsitePayments::Helper
16
+ # All currently supported checkout languages:
17
+ # es (Spanish)
18
+ # en (English)
19
+ # de (German)
20
+ # pt (Portuguese)
21
+ # lv (Latvian)
22
+ # cn1 (Chinese Version 1)
23
+ # cn2 (Chinese version 2)
24
+ # nl (Dutch)
25
+ # ru (Russian)
26
+ COUNTRIES_FOR_LANG = {
27
+ 'ES' => %w( AR BO CL CO CR CU DO EC SV GQ GT HN MX NI PA PY PE ES UY VE),
28
+ 'DE' => %w( DE AT CH LI ),
29
+ 'PT' => %w( AO BR CV GW MZ PT ST TL),
30
+ 'RU' => %w( BY KG KZ RU ),
31
+ 'LV' => %w( LV ),
32
+ 'CN1' => %w( CN ),
33
+ 'NL' => %w( NL )
34
+ }
35
+
36
+ LANG_FOR_COUNTRY = COUNTRIES_FOR_LANG.inject(Hash.new("EN")) do |memo, (lang, countries)|
37
+ countries.each do |code|
38
+ memo[code] = lang
39
+ end
40
+ memo
41
+ end
42
+
43
+
44
+ self.country_format = :alpha3
45
+
46
+ def initialize(order, account, options = {})
47
+ super
48
+ add_field('cb_type', 'p')
49
+ end
50
+
51
+ # product_id
52
+ mapping :account, 'product_id'
53
+ # product_name
54
+ mapping :invoice, 'product_name'
55
+ # product_price
56
+ mapping :amount, 'product_price'
57
+ # product_price_currency
58
+ mapping :currency, 'product_price_currency'
59
+
60
+ # f_name
61
+ # s_name
62
+ # email
63
+ mapping :customer, :first_name => 'f_name',
64
+ :last_name => 's_name',
65
+ :phone => 'phone',
66
+ :email => 'email'
67
+
68
+ # city
69
+ # street
70
+ # state
71
+ # zip
72
+ # country - The country must be a 3 digit country code
73
+ # phone
74
+
75
+ mapping :billing_address, :city => 'city',
76
+ :address1 => 'street',
77
+ :state => 'state',
78
+ :zip => 'zip',
79
+ :country => 'country'
80
+
81
+ def billing_address(mapping = {})
82
+ # Gets the country code in the appropriate format or returns what we were given
83
+ # The appropriate format for Chronopay is the alpha 3 country code
84
+ country_code = lookup_country_code(mapping.delete(:country))
85
+ add_field(mappings[:billing_address][:country], country_code)
86
+
87
+ countries_with_supported_states = ['USA', 'CAN']
88
+ if !countries_with_supported_states.include?(country_code)
89
+ mapping.delete(:state)
90
+ add_field(mappings[:billing_address][:state], 'XX')
91
+ end
92
+ mapping.each do |k, v|
93
+ field = mappings[:billing_address][k]
94
+ add_field(field, v) unless field.nil?
95
+ end
96
+ add_field('language', checkout_language_from_country(country_code))
97
+ end
98
+
99
+ # card_no
100
+ # exp_month
101
+ # exp_year
102
+ mapping :credit_card, :number => 'card_no',
103
+ :expiry_month => 'exp_month',
104
+ :expiry_year => 'exp_year'
105
+
106
+ # cb_url
107
+ mapping :notify_url, 'cb_url'
108
+
109
+ # cs1
110
+ mapping :order, 'cs1'
111
+
112
+ # cs2
113
+ # cs3
114
+ # decline_url
115
+
116
+
117
+ private
118
+
119
+ def checkout_language_from_country(country_code)
120
+ country = ActiveMerchant::Country.find(country_code)
121
+ short_code = country.code(:alpha2).to_s
122
+ LANG_FOR_COUNTRY[short_code]
123
+ rescue ActiveMerchant::InvalidCountryCodeError
124
+ 'EN'
125
+ end
126
+ end
127
+
128
+ class Notification < OffsitePayments::Notification
129
+ def complete?
130
+ status == 'Completed'
131
+ end
132
+
133
+ # Status of transaction. List of possible values:
134
+ # <tt>onetime – one time payment has been made, no repayment required;</tt>::
135
+ # <tt>initial – first payment has been made, repayment required in corresponding period;</tt>::
136
+ # <tt>decline – charge request has been rejected;</tt>::
137
+ # <tt>rebill – repayment has been made together with initial transaction;</ttt>::
138
+ # <tt>cancel – repayments has been disabled;</tt>::
139
+ # <tt>expire – customer’s access to restricted zone membership has been expired;</tt>::
140
+ # <tt>refund – request to refund has been received;</tt>::
141
+ # <tt>chargeback – request to chargeback has been received.</tt>::
142
+ #
143
+ # This implementation of Chronopay does not support subscriptions.
144
+ # The status codes used are matched to the status codes that Paypal
145
+ # sends. See Paypal::Notification#status for more details
146
+ def status
147
+ case params['transaction_type']
148
+ when 'onetime'
149
+ 'Completed'
150
+ when 'refund'
151
+ 'Refunded'
152
+ when 'chargeback'
153
+ 'Reversed'
154
+ else
155
+ 'Failed'
156
+ end
157
+ end
158
+
159
+ # Unique ID of transaction
160
+ def transaction_id
161
+ params['transaction_id']
162
+ end
163
+
164
+ # Unique ID of customer
165
+ def customer_id
166
+ params['customer_id']
167
+ end
168
+
169
+ # Unique ID of Merchant’s web-site
170
+ def site_id
171
+ params['site_id']
172
+ end
173
+
174
+ # ID of a product that was purchased
175
+ def product_id
176
+ params['product_id']
177
+ end
178
+
179
+ # Language
180
+ def language
181
+ params['language']
182
+ end
183
+
184
+ def received_at
185
+ # Date should be formatted "dd-mm-yy" to be parsed by 1.8 and 1.9 the same way
186
+ formatted_date = Date.strptime(date, "%m/%d/%Y").strftime("%d-%m-%Y")
187
+ Time.parse("#{formatted_date} #{time}") unless date.blank? || time.blank?
188
+ end
189
+
190
+ # Date of transaction in MM/DD/YYYY format
191
+ def date
192
+ params['date']
193
+ end
194
+
195
+ # Time of transaction in HH:MM:SS format
196
+ def time
197
+ params['time']
198
+ end
199
+
200
+ # The customer's full name
201
+ def name
202
+ params['name']
203
+ end
204
+
205
+ # The customer's email address
206
+ def email
207
+ params['email']
208
+ end
209
+
210
+ # The customer's street address
211
+ def street
212
+ params['street']
213
+ end
214
+
215
+ # The customer's country - 3 digit country code
216
+ def country
217
+ params['country']
218
+ end
219
+
220
+ # The customer's city
221
+ def city
222
+ params['city']
223
+ end
224
+
225
+ # The customer's zip
226
+ def zip
227
+ params['zip']
228
+ end
229
+
230
+ # The customer's state. Only useful for US Customers
231
+ def state
232
+ params['state']
233
+ end
234
+
235
+ # Customer’s login for restricted access zone of Merchant’s Web-site
236
+ def username
237
+ params['username']
238
+ end
239
+
240
+ # Customer's password for restricted access zone of Merchant’s Web-site, as chosen
241
+ def password
242
+ params['password']
243
+ end
244
+
245
+ # The item id passed in the first custom parameter
246
+ def item_id
247
+ params['cs1']
248
+ end
249
+
250
+ # Additional parameter
251
+ def custom2
252
+ params['cs2']
253
+ end
254
+
255
+ # Additional parameter
256
+ def custom3
257
+ params['cs3']
258
+ end
259
+
260
+ # The currency the purchase was made in
261
+ def currency
262
+ params['currency']
263
+ end
264
+
265
+ # the money amount we received in X.2 decimal.
266
+ def gross
267
+ params['total']
268
+ end
269
+
270
+ def test?
271
+ date.blank? && time.blank? && transaction_id.blank?
272
+ end
273
+
274
+ def acknowledge(authcode = nil)
275
+ true
276
+ end
277
+ end
278
+
279
+ class Return < OffsitePayments::Return
280
+ end
281
+ end
282
+ end
283
+ end