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.
- checksums.yaml +7 -0
- data/MIT-LICENSE +20 -0
- data/README.md +70 -0
- data/lib/offsite_payments.rb +46 -0
- data/lib/offsite_payments/action_view_helper.rb +72 -0
- data/lib/offsite_payments/helper.rb +119 -0
- data/lib/offsite_payments/integrations.rb +14 -0
- data/lib/offsite_payments/integrations/a1agregator.rb +245 -0
- data/lib/offsite_payments/integrations/authorize_net_sim.rb +580 -0
- data/lib/offsite_payments/integrations/bit_pay.rb +150 -0
- data/lib/offsite_payments/integrations/bogus.rb +32 -0
- data/lib/offsite_payments/integrations/chronopay.rb +283 -0
- data/lib/offsite_payments/integrations/citrus.rb +227 -0
- data/lib/offsite_payments/integrations/direc_pay.rb +339 -0
- data/lib/offsite_payments/integrations/directebanking.rb +237 -0
- data/lib/offsite_payments/integrations/doku.rb +171 -0
- data/lib/offsite_payments/integrations/dotpay.rb +166 -0
- data/lib/offsite_payments/integrations/dwolla.rb +160 -0
- data/lib/offsite_payments/integrations/e_payment_plans.rb +146 -0
- data/lib/offsite_payments/integrations/easy_pay.rb +137 -0
- data/lib/offsite_payments/integrations/epay.rb +161 -0
- data/lib/offsite_payments/integrations/first_data.rb +133 -0
- data/lib/offsite_payments/integrations/gestpay.rb +201 -0
- data/lib/offsite_payments/integrations/hi_trust.rb +179 -0
- data/lib/offsite_payments/integrations/ipay88.rb +240 -0
- data/lib/offsite_payments/integrations/klarna.rb +291 -0
- data/lib/offsite_payments/integrations/liqpay.rb +216 -0
- data/lib/offsite_payments/integrations/maksuturva.rb +231 -0
- data/lib/offsite_payments/integrations/mollie_ideal.rb +213 -0
- data/lib/offsite_payments/integrations/moneybookers.rb +199 -0
- data/lib/offsite_payments/integrations/nochex.rb +228 -0
- data/lib/offsite_payments/integrations/pag_seguro.rb +255 -0
- data/lib/offsite_payments/integrations/paxum.rb +114 -0
- data/lib/offsite_payments/integrations/pay_fast.rb +269 -0
- data/lib/offsite_payments/integrations/paydollar.rb +142 -0
- data/lib/offsite_payments/integrations/payflow_link.rb +194 -0
- data/lib/offsite_payments/integrations/paypal.rb +362 -0
- data/lib/offsite_payments/integrations/paypal_payments_advanced.rb +23 -0
- data/lib/offsite_payments/integrations/paysbuy.rb +71 -0
- data/lib/offsite_payments/integrations/payu_in.rb +266 -0
- data/lib/offsite_payments/integrations/payu_in_paisa.rb +46 -0
- data/lib/offsite_payments/integrations/platron.rb +153 -0
- data/lib/offsite_payments/integrations/pxpay.rb +271 -0
- data/lib/offsite_payments/integrations/quickpay.rb +232 -0
- data/lib/offsite_payments/integrations/rbkmoney.rb +110 -0
- data/lib/offsite_payments/integrations/robokassa.rb +154 -0
- data/lib/offsite_payments/integrations/sage_pay_form.rb +425 -0
- data/lib/offsite_payments/integrations/two_checkout.rb +332 -0
- data/lib/offsite_payments/integrations/universal.rb +180 -0
- data/lib/offsite_payments/integrations/valitor.rb +200 -0
- data/lib/offsite_payments/integrations/verkkomaksut.rb +143 -0
- data/lib/offsite_payments/integrations/web_pay.rb +186 -0
- data/lib/offsite_payments/integrations/webmoney.rb +119 -0
- data/lib/offsite_payments/integrations/wirecard_checkout_page.rb +359 -0
- data/lib/offsite_payments/integrations/world_pay.rb +273 -0
- data/lib/offsite_payments/notification.rb +71 -0
- data/lib/offsite_payments/return.rb +37 -0
- data/lib/offsite_payments/version.rb +3 -0
- metadata +270 -0
@@ -0,0 +1,119 @@
|
|
1
|
+
module OffsitePayments #:nodoc:
|
2
|
+
module Integrations #:nodoc:
|
3
|
+
# Documentation:
|
4
|
+
# http://wiki.webmoney.ru/projects/webmoney/wiki/Web_Merchant_Interface
|
5
|
+
module Webmoney
|
6
|
+
mattr_accessor :test_url
|
7
|
+
self.test_url = "https://merchant.webmoney.ru/lmi/payment.asp"
|
8
|
+
|
9
|
+
mattr_accessor :production_url
|
10
|
+
self.production_url = "https://merchant.webmoney.ru/lmi/payment.asp"
|
11
|
+
|
12
|
+
mattr_accessor :signature_parameter_name
|
13
|
+
self.signature_parameter_name = 'LMI_HASH'
|
14
|
+
|
15
|
+
def self.service_url
|
16
|
+
mode = OffsitePayments.mode
|
17
|
+
case mode
|
18
|
+
when :production
|
19
|
+
self.production_url
|
20
|
+
when :test
|
21
|
+
self.test_url
|
22
|
+
else
|
23
|
+
raise StandardError, "Integration mode set to an invalid value: #{mode}"
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
27
|
+
def self.helper(order, account, options = {})
|
28
|
+
Helper.new(order, account, options)
|
29
|
+
end
|
30
|
+
|
31
|
+
def self.notification(query_string, options = {})
|
32
|
+
Notification.new(query_string, options)
|
33
|
+
end
|
34
|
+
|
35
|
+
module Common
|
36
|
+
def generate_signature_string
|
37
|
+
"#{params['LMI_PAYEE_PURSE']}#{params['LMI_PAYMENT_AMOUNT']}#{params['LMI_PAYMENT_NO']}#{params['LMI_MODE']}#{params['LMI_SYS_INVS_NO']}#{params['LMI_SYS_TRANS_NO']}#{params['LMI_SYS_TRANS_DATE']}#{secret}#{params['LMI_PAYER_PURSE']}#{params['LMI_PAYER_WM']}"
|
38
|
+
end
|
39
|
+
|
40
|
+
def generate_signature
|
41
|
+
Digest::MD5.hexdigest(generate_signature_string).upcase
|
42
|
+
end
|
43
|
+
end
|
44
|
+
|
45
|
+
class Helper < OffsitePayments::Helper
|
46
|
+
include Common
|
47
|
+
|
48
|
+
def initialize(order, account, options = {})
|
49
|
+
@webmoney_options = options.dup
|
50
|
+
options.delete(:description)
|
51
|
+
options.delete(:fail_url)
|
52
|
+
options.delete(:success_url)
|
53
|
+
options.delete(:result_url)
|
54
|
+
super
|
55
|
+
@webmoney_options.each do |key, value|
|
56
|
+
add_field mappings[key], value
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
def form_fields
|
61
|
+
@fields
|
62
|
+
end
|
63
|
+
|
64
|
+
def params
|
65
|
+
@fields
|
66
|
+
end
|
67
|
+
|
68
|
+
mapping :account, 'LMI_PAYEE_PURSE'
|
69
|
+
mapping :amount, 'LMI_PAYMENT_AMOUNT'
|
70
|
+
mapping :order, 'LMI_PAYMENT_NO'
|
71
|
+
mapping :description, 'LMI_PAYMENT_DESC'
|
72
|
+
mapping :fail_url, 'LMI_FAIL_URL'
|
73
|
+
mapping :success_url, 'LMI_SUCCESS_URL'
|
74
|
+
mapping :result_url, 'LMI_RESULT_URL'
|
75
|
+
mapping :debug, 'LMI_SIM_MODE'
|
76
|
+
end
|
77
|
+
|
78
|
+
class Notification < OffsitePayments::Notification
|
79
|
+
include Common
|
80
|
+
|
81
|
+
def recognizes?
|
82
|
+
(params.has_key?('LMI_PAYMENT_NO') && params.has_key?('LMI_PAYMENT_AMOUNT'))
|
83
|
+
end
|
84
|
+
|
85
|
+
def amount
|
86
|
+
BigDecimal.new(gross)
|
87
|
+
end
|
88
|
+
|
89
|
+
def key_present?
|
90
|
+
params["LMI_HASH"].present?
|
91
|
+
end
|
92
|
+
|
93
|
+
def item_id
|
94
|
+
params['LMI_PAYMENT_NO']
|
95
|
+
end
|
96
|
+
|
97
|
+
def gross
|
98
|
+
params['LMI_PAYMENT_AMOUNT']
|
99
|
+
end
|
100
|
+
|
101
|
+
def security_key
|
102
|
+
params["LMI_HASH"]
|
103
|
+
end
|
104
|
+
|
105
|
+
def secret
|
106
|
+
@options[:secret]
|
107
|
+
end
|
108
|
+
|
109
|
+
def acknowledge(authcode = nil)
|
110
|
+
(security_key == generate_signature)
|
111
|
+
end
|
112
|
+
|
113
|
+
def success_response(*args)
|
114
|
+
{:nothing => true}
|
115
|
+
end
|
116
|
+
end
|
117
|
+
end
|
118
|
+
end
|
119
|
+
end
|
@@ -0,0 +1,359 @@
|
|
1
|
+
module OffsitePayments #:nodoc:
|
2
|
+
module Integrations #:nodoc:
|
3
|
+
# Shop System Plugins - Terms of use
|
4
|
+
#
|
5
|
+
# This terms of use regulates warranty and liability between Wirecard Central Eastern Europe (subsequently referred to as WDCEE) and it's
|
6
|
+
# contractual partners (subsequently referred to as customer or customers) which are related to the use of plugins provided by WDCEE.
|
7
|
+
#
|
8
|
+
# The Plugin is provided by WDCEE free of charge for it's customers and must be used for the purpose of WDCEE's payment platform
|
9
|
+
# integration only. It explicitly is not part of the general contract between WDCEE and it's customer. The plugin has successfully been tested
|
10
|
+
# under specific circumstances which are defined as the shopsystem's standard configuration (vendor's delivery state). The Customer is
|
11
|
+
# responsible for testing the plugin's functionality before putting it into production environment.
|
12
|
+
# The customer uses the plugin at own risk. WDCEE does not guarantee it's full functionality neither does WDCEE assume liability for any
|
13
|
+
# disadvantage related to the use of this plugin. By installing the plugin into the shopsystem the customer agrees to the terms of use.
|
14
|
+
# Please do not use this plugin if you do not agree to the terms of use!
|
15
|
+
module WirecardCheckoutPage
|
16
|
+
mattr_accessor :service_url
|
17
|
+
self.service_url = 'https://checkout.wirecard.com/page/init.php'
|
18
|
+
|
19
|
+
def self.notification(post, options)
|
20
|
+
Notification.new(post, options)
|
21
|
+
end
|
22
|
+
|
23
|
+
def self.return(postdata, options)
|
24
|
+
Return.new(postdata, options)
|
25
|
+
end
|
26
|
+
|
27
|
+
module Common
|
28
|
+
mattr_accessor :paymenttypes
|
29
|
+
self.paymenttypes = %w(
|
30
|
+
SELECT
|
31
|
+
CCARD
|
32
|
+
BANCONTACT_MISTERCASH
|
33
|
+
C2P
|
34
|
+
CCARD-MOTO
|
35
|
+
EKONTO
|
36
|
+
ELV
|
37
|
+
EPS
|
38
|
+
GIROPAY
|
39
|
+
IDL
|
40
|
+
INSTALLMENT
|
41
|
+
INSTANTBANK
|
42
|
+
INVOICE
|
43
|
+
MAESTRO
|
44
|
+
MONETA
|
45
|
+
MPASS
|
46
|
+
PRZELEWY24
|
47
|
+
PAYPAL
|
48
|
+
PBX
|
49
|
+
POLI
|
50
|
+
PSC
|
51
|
+
QUICK
|
52
|
+
SKRILLDIRECT
|
53
|
+
SKRILLWALLET
|
54
|
+
SOFORTUEBERWEISUNG)
|
55
|
+
|
56
|
+
def message
|
57
|
+
@message
|
58
|
+
end
|
59
|
+
|
60
|
+
def verify_response(params, secret)
|
61
|
+
logstr = ''
|
62
|
+
params.each { |key, value|
|
63
|
+
logstr += "#{key} #{value}\n"
|
64
|
+
}
|
65
|
+
|
66
|
+
@paymentstate = 'FAILURE'
|
67
|
+
|
68
|
+
unless params.has_key?('paymentState')
|
69
|
+
@message = "paymentState is missing"
|
70
|
+
return false
|
71
|
+
end
|
72
|
+
|
73
|
+
if params['paymentState'] == 'SUCCESS' || params['paymentState'] == 'PENDING'
|
74
|
+
unless params.has_key?('responseFingerprint')
|
75
|
+
@message = "responseFingerprint is missing"
|
76
|
+
return false
|
77
|
+
end
|
78
|
+
|
79
|
+
unless params.has_key?('responseFingerprintOrder')
|
80
|
+
@message = "responseFingerprintOrder is missing"
|
81
|
+
return false
|
82
|
+
end
|
83
|
+
|
84
|
+
end
|
85
|
+
|
86
|
+
if params['paymentState'] == 'SUCCESS' || params['paymentState'] == 'PENDING'
|
87
|
+
fields = params['responseFingerprintOrder'].split(",")
|
88
|
+
values = ''
|
89
|
+
fields.each { |f|
|
90
|
+
values += f == 'secret' ? secret : params[f]
|
91
|
+
}
|
92
|
+
|
93
|
+
|
94
|
+
if Digest::MD5.hexdigest(values) != params['responseFingerprint']
|
95
|
+
@message = "responseFingerprint verification failed"
|
96
|
+
return false
|
97
|
+
end
|
98
|
+
end
|
99
|
+
|
100
|
+
@paymentstate = params['paymentState']
|
101
|
+
true
|
102
|
+
end
|
103
|
+
end
|
104
|
+
|
105
|
+
class Helper < OffsitePayments::Helper
|
106
|
+
include Common
|
107
|
+
|
108
|
+
PLUGIN_NAME = 'ActiveMerchant_WirecardCheckoutPage'
|
109
|
+
PLUGIN_VERSION = '1.0.0'
|
110
|
+
|
111
|
+
# Replace with the real mapping
|
112
|
+
mapping :account, 'customerId'
|
113
|
+
mapping :amount, 'amount'
|
114
|
+
|
115
|
+
mapping :order, 'xActiveMerchantOrderId'
|
116
|
+
|
117
|
+
mapping :customer, :first_name => 'consumerBillingFirstName',
|
118
|
+
:last_name => 'consumerBillingLastName',
|
119
|
+
:email => 'consumerEmail',
|
120
|
+
:phone => 'consumerBillingPhone',
|
121
|
+
:ipaddress => 'consumerIpAddress',
|
122
|
+
:user_agent => 'consumerUserAgent',
|
123
|
+
:fax => 'consumerBillingFax',
|
124
|
+
:birthdate => 'consumerBirthDate' # mandatory for INVOICE and INSTALLMENT
|
125
|
+
|
126
|
+
mapping :billing_address, :city => 'consumerBillingCity',
|
127
|
+
:address1 => 'consumerBillingAddress1',
|
128
|
+
:address2 => 'consumerBillingAddress2',
|
129
|
+
:state => 'consumerBillingState',
|
130
|
+
:zip => 'consumerBillingZipCode',
|
131
|
+
:country => 'consumerBillingCountry'
|
132
|
+
|
133
|
+
mapping :shipping_address, :first_name => 'consumerShippingFirstName',
|
134
|
+
:last_name => 'consumerShippingLastName',
|
135
|
+
:address1 => 'consumerShippingAddress1',
|
136
|
+
:address2 => 'consumerShippingAddress2',
|
137
|
+
:city => 'consumerShippingCity',
|
138
|
+
:state => 'consumerShippingState',
|
139
|
+
:country => 'consumerShippingCountry',
|
140
|
+
:zip => 'consumerShippingZipCode',
|
141
|
+
:phone => 'consumerShippingPhone',
|
142
|
+
:fax => 'consumerShippingFax'
|
143
|
+
|
144
|
+
mapping :currency, 'currency'
|
145
|
+
mapping :language, 'language' # language for displayed texts on payment page
|
146
|
+
|
147
|
+
mapping :description, 'orderDescription' # unique description of the consumer's order in a human readable form
|
148
|
+
|
149
|
+
mapping :shop_service_url, 'serviceUrl' # URL of your service page containing contact information
|
150
|
+
|
151
|
+
mapping :notify_url, 'confirmUrl'
|
152
|
+
mapping :return_url, 'successUrl'
|
153
|
+
|
154
|
+
# defaulting to return_url
|
155
|
+
mapping :cancel_return_url, 'cancelUrl'
|
156
|
+
mapping :pending_url, 'pendingUrl'
|
157
|
+
mapping :failure_url, 'failureUrl'
|
158
|
+
|
159
|
+
# optional parameters
|
160
|
+
mapping :window_name, 'windowName' # window.name of browser window where payment page is opened
|
161
|
+
mapping :duplicate_request_check, 'duplicateRequestCheck' # check for duplicate requests done by your consumer
|
162
|
+
mapping :customer_statement, 'customerStatement' # text displayed on invoice of financial institution of your consumer
|
163
|
+
mapping :order_reference, 'orderReference' # unique order reference id sent from merchant to financial institution
|
164
|
+
mapping :display_text, 'displayText' # text displayed to your consumer within the payment page
|
165
|
+
mapping :image_url, 'imageUrl' # URL of your web shop where your web shop logo is located
|
166
|
+
mapping :max_retries, 'maxRetries' # maximum number of attempted payments for the same order
|
167
|
+
mapping :auto_deposit, 'autoDeposit' # enable automated debiting of payments
|
168
|
+
mapping :financial_institution, 'financialInstitution' # based on pre-selected payment type a sub-selection of financial institutions regarding to pre-selected payment type
|
169
|
+
|
170
|
+
# not used
|
171
|
+
mapping :tax, ''
|
172
|
+
mapping :shipping, ''
|
173
|
+
|
174
|
+
def initialize(order, customer_id, options = {})
|
175
|
+
@paymenttype = options.delete(:paymenttype)
|
176
|
+
|
177
|
+
raise "Unknown Paymenttype: " + @paymenttype if paymenttypes.find_index(@paymenttype) == nil
|
178
|
+
|
179
|
+
@secret = options.delete(:secret)
|
180
|
+
@customer_id = customer_id
|
181
|
+
@shop_id = options.delete(:shop_id)
|
182
|
+
super
|
183
|
+
end
|
184
|
+
|
185
|
+
def add_version(shop_name, shop_version)
|
186
|
+
add_field('pluginVersion', Base64.encode64(shop_name + ';' + shop_version + ';ActiveMerchant;' + PLUGIN_NAME + ';' + PLUGIN_VERSION))
|
187
|
+
end
|
188
|
+
|
189
|
+
def add_standard_fields
|
190
|
+
addfields = {}
|
191
|
+
addfields['shopId'] = @shop_id if !@shop_id.blank?
|
192
|
+
addfields['paymentType'] = @paymenttype
|
193
|
+
|
194
|
+
addfields[mappings[:pending_url]] = @fields[mappings[:return_url]] unless @fields.has_key?(mappings[:pending_url])
|
195
|
+
addfields[mappings[:cancel_return_url]] = @fields[mappings[:return_url]] unless @fields.has_key?(mappings[:cancel_return_url])
|
196
|
+
addfields[mappings[:failure_url]] = @fields[mappings[:return_url]] unless @fields.has_key?(mappings[:failure_url])
|
197
|
+
|
198
|
+
addfields
|
199
|
+
end
|
200
|
+
|
201
|
+
def add_request_fingerprint(fpfields)
|
202
|
+
addfields = {}
|
203
|
+
fingerprint_order = %w(secret)
|
204
|
+
fingerprint_values = @secret.to_s
|
205
|
+
fpfields.each { |key, value|
|
206
|
+
next if key == 'pluginVersion'
|
207
|
+
fingerprint_order.append key
|
208
|
+
fingerprint_values += value.to_s
|
209
|
+
}
|
210
|
+
|
211
|
+
fingerprint_order.append 'requestFingerprintOrder'
|
212
|
+
fingerprint_values += fingerprint_order.join(',')
|
213
|
+
|
214
|
+
addfields['requestFingerprintOrder'] = fingerprint_order.join(',')
|
215
|
+
addfields['requestFingerprint'] = Digest::MD5.hexdigest(fingerprint_values)
|
216
|
+
|
217
|
+
addfields
|
218
|
+
end
|
219
|
+
|
220
|
+
def form_fields
|
221
|
+
result = {}
|
222
|
+
result.merge!(@fields)
|
223
|
+
result.merge!(add_standard_fields)
|
224
|
+
result.merge!(add_request_fingerprint(result))
|
225
|
+
result
|
226
|
+
end
|
227
|
+
|
228
|
+
def secret
|
229
|
+
@secret
|
230
|
+
end
|
231
|
+
|
232
|
+
def customer_id
|
233
|
+
@customer_id
|
234
|
+
end
|
235
|
+
|
236
|
+
def shop_id
|
237
|
+
@shop_id
|
238
|
+
end
|
239
|
+
end
|
240
|
+
|
241
|
+
class Notification < OffsitePayments::Notification
|
242
|
+
include Common
|
243
|
+
|
244
|
+
def complete?
|
245
|
+
@paymentstate == 'SUCCESS'
|
246
|
+
end
|
247
|
+
|
248
|
+
def item_id
|
249
|
+
params['xActiveMerchantOrderId']
|
250
|
+
end
|
251
|
+
|
252
|
+
def transaction_id
|
253
|
+
params['orderNumber']
|
254
|
+
end
|
255
|
+
|
256
|
+
# When was this payment received by the client.
|
257
|
+
def received_at
|
258
|
+
nil
|
259
|
+
end
|
260
|
+
|
261
|
+
# the money amount we received in X.2 decimal.
|
262
|
+
def gross
|
263
|
+
params['amount']
|
264
|
+
end
|
265
|
+
|
266
|
+
# Was this a test transaction?
|
267
|
+
def test?
|
268
|
+
false
|
269
|
+
end
|
270
|
+
|
271
|
+
def status
|
272
|
+
case @paymentstate
|
273
|
+
when 'SUCCESS'
|
274
|
+
'Completed'
|
275
|
+
when 'PENDING'
|
276
|
+
'Pending'
|
277
|
+
when 'CANCEL'
|
278
|
+
'Cancelled'
|
279
|
+
when 'FAILURE'
|
280
|
+
'Failed'
|
281
|
+
else
|
282
|
+
'Error'
|
283
|
+
end
|
284
|
+
end
|
285
|
+
|
286
|
+
def status_code
|
287
|
+
@paymentstate
|
288
|
+
end
|
289
|
+
|
290
|
+
# Acknowledge the transaction to WirecardCheckoutPage. This method has to be called after a new
|
291
|
+
# apc arrives. WirecardCheckoutPage will verify that all the information we received are correct and will return a
|
292
|
+
# ok or a fail.
|
293
|
+
#
|
294
|
+
# Example:
|
295
|
+
#
|
296
|
+
# def ipn
|
297
|
+
# notify = WirecardCheckoutPageNotification.new(request.raw_post, options)
|
298
|
+
#
|
299
|
+
# if notify.acknowledge
|
300
|
+
# ... process order ... if notify.complete?
|
301
|
+
# else
|
302
|
+
# ... log possible hacking attempt ...
|
303
|
+
# end
|
304
|
+
def acknowledge
|
305
|
+
verify_response(params, @options[:secret])
|
306
|
+
end
|
307
|
+
|
308
|
+
def response(umessage = nil)
|
309
|
+
if @message || umessage
|
310
|
+
'<QPAY-CONFIRMATION-RESPONSE result="NOK" message="' + CGI.escapeHTML(umessage ? umessage : @message) + '"/>'
|
311
|
+
else
|
312
|
+
'<QPAY-CONFIRMATION-RESPONSE result="OK"/>'
|
313
|
+
end
|
314
|
+
end
|
315
|
+
|
316
|
+
def method_missing(method_id, *args)
|
317
|
+
return params[method_id.to_s] if params.has_key?(method_id.to_s)
|
318
|
+
end
|
319
|
+
|
320
|
+
private
|
321
|
+
|
322
|
+
# Take the posted data and move the relevant data into a hash
|
323
|
+
def parse(post)
|
324
|
+
@raw = post.to_s
|
325
|
+
for line in @raw.split('&')
|
326
|
+
key, value = *line.scan( %r{^([A-Za-z0-9_.]+)\=(.*)$} ).flatten
|
327
|
+
params[key] = CGI.unescape(value)
|
328
|
+
end
|
329
|
+
end
|
330
|
+
end
|
331
|
+
|
332
|
+
class Return < OffsitePayments::Return
|
333
|
+
include Common
|
334
|
+
|
335
|
+
def initialize(postdata, options = {})
|
336
|
+
@params = parse(postdata)
|
337
|
+
@options = options
|
338
|
+
verify_response(@params, options[:secret])
|
339
|
+
end
|
340
|
+
|
341
|
+
def success?
|
342
|
+
@paymentstate == 'SUCCESS'
|
343
|
+
end
|
344
|
+
|
345
|
+
def cancelled?
|
346
|
+
@paymentstate == 'CANCEL'
|
347
|
+
end
|
348
|
+
|
349
|
+
def pending?
|
350
|
+
@paymentstate == 'PENDING'
|
351
|
+
end
|
352
|
+
|
353
|
+
def method_missing(method_id, *args)
|
354
|
+
return params[method_id.to_s] if params.has_key?(method_id.to_s)
|
355
|
+
end
|
356
|
+
end
|
357
|
+
end
|
358
|
+
end
|
359
|
+
end
|