rack-payment 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/lib/rack-payment/helper.rb +8 -0
- data/lib/rack-payment/payment.rb +7 -1
- data/lib/rack-payment/request.rb +40 -23
- metadata +1 -1
data/lib/rack-payment/helper.rb
CHANGED
@@ -30,6 +30,14 @@ module Rack #:nodoc:
|
|
30
30
|
|
31
31
|
attr_accessor :rack_payment, :amount, :credit_card, :billing_address, :errors, :use_express, :response
|
32
32
|
|
33
|
+
# Specifies what page to render if payment fails (for this specific request).
|
34
|
+
# To set this option globally, see {Rack::Payment#on_error}.
|
35
|
+
attr_accessor :on_error
|
36
|
+
|
37
|
+
# Specifies what page to render if payment succeeds (for this specific request).
|
38
|
+
# To set this option globally, see {Rack::Payment#on_success}.
|
39
|
+
attr_accessor :on_success
|
40
|
+
|
33
41
|
# @param [Rack::Payment]
|
34
42
|
def initialize rack_payment
|
35
43
|
@rack_payment = rack_payment
|
data/lib/rack-payment/payment.rb
CHANGED
@@ -45,6 +45,7 @@ module Rack #:nodoc:
|
|
45
45
|
#
|
46
46
|
DEFAULT_OPTIONS = {
|
47
47
|
'on_success' => nil,
|
48
|
+
'on_error' => nil,
|
48
49
|
'built_in_form_path' => '/rack.payment/process',
|
49
50
|
'express_ok_path' => '/rack.payment/express.callback/ok',
|
50
51
|
'express_cancel_path' => '/rack.payment/express.callback/cancel',
|
@@ -67,11 +68,16 @@ module Rack #:nodoc:
|
|
67
68
|
@logger ||= Rack::Payment.logger
|
68
69
|
end
|
69
70
|
|
70
|
-
# When a payment is successful, we
|
71
|
+
# When a payment is successful, we render this path, if set.
|
71
72
|
# If this is `nil`, we display our own confirmation page.
|
72
73
|
# @return [String, nil] (nil)
|
73
74
|
attr_accessor :on_success
|
74
75
|
|
76
|
+
# When a payment is unsuccessful, we render this path, if set.
|
77
|
+
# If this is `nil`, we render the URL that the POST came from.
|
78
|
+
# @return [String, nil] (nil)
|
79
|
+
attr_accessor :on_error
|
80
|
+
|
75
81
|
# This is the path that the built-in form POSTs to when submitting
|
76
82
|
# Credit Card data. This is only used if you use the built_in_form.
|
77
83
|
# See {#use_built_in_form} to enable/disable using the default form
|
data/lib/rack-payment/request.rb
CHANGED
@@ -9,10 +9,9 @@ module Rack #:nodoc:
|
|
9
9
|
class Request
|
10
10
|
extend Forwardable
|
11
11
|
|
12
|
-
def_delegators :payment_instance, :app, :gateway, :express_gateway, :
|
12
|
+
def_delegators :payment_instance, :app, :gateway, :express_gateway, :built_in_form_path,
|
13
13
|
:env_instance_variable, :env_helper_variable, :session_variable,
|
14
|
-
:rack_session_variable, :express_ok_path, :express_cancel_path
|
15
|
-
:built_in_form_path
|
14
|
+
:rack_session_variable, :express_ok_path, :express_cancel_path
|
16
15
|
|
17
16
|
def_delegators :request, :params
|
18
17
|
|
@@ -94,6 +93,7 @@ module Rack #:nodoc:
|
|
94
93
|
#
|
95
94
|
# @return [Array] A Rack response, eg. `[200, {}, ["Hello World"]]`
|
96
95
|
def finish
|
96
|
+
update_credit_card_and_billing_address_from_params
|
97
97
|
|
98
98
|
# The application returned a 402 ('Payment Required')
|
99
99
|
if app_response.status == 402
|
@@ -123,11 +123,12 @@ module Rack #:nodoc:
|
|
123
123
|
app_response.finish
|
124
124
|
end
|
125
125
|
|
126
|
-
#
|
127
|
-
#
|
128
|
-
|
129
|
-
|
130
|
-
|
126
|
+
# If the params include fields that start with credit_card_ or
|
127
|
+
# the params have a hash of credit card variables, we use them
|
128
|
+
# to update our credit card information.
|
129
|
+
#
|
130
|
+
# We do the same with the billing address.
|
131
|
+
def update_credit_card_and_billing_address_from_params
|
131
132
|
# The params *should* be set on the payment data object, but we accept
|
132
133
|
# POST requests too, so we check the POST variables for credit_card
|
133
134
|
# or billing_address fields
|
@@ -149,6 +150,14 @@ module Rack #:nodoc:
|
|
149
150
|
if params['billing_address'] and params['billing_address'].respond_to?(:each)
|
150
151
|
payment.billing_address.update params['billing_address']
|
151
152
|
end
|
153
|
+
end
|
154
|
+
|
155
|
+
# Gets parameters, attempts an #authorize call, attempts a #capture call,
|
156
|
+
# and renders the results.
|
157
|
+
def process_credit_card
|
158
|
+
payment.amount ||= amount_in_session
|
159
|
+
|
160
|
+
update_credit_card_and_billing_address_from_params
|
152
161
|
|
153
162
|
# Purchase!
|
154
163
|
if payment.purchase(:ip => request.ip)
|
@@ -183,34 +192,42 @@ module Rack #:nodoc:
|
|
183
192
|
# so we can actually just re-call the same env (should display the form) using a GET
|
184
193
|
payment.errors = errors
|
185
194
|
new_env = env.clone
|
195
|
+
cleanup_env_for_rails(new_env)
|
186
196
|
new_env['REQUEST_METHOD'] = 'GET'
|
187
197
|
|
188
|
-
|
189
|
-
|
190
|
-
|
191
|
-
|
192
|
-
|
193
|
-
|
194
|
-
|
195
|
-
new_env.delete 'action_controller.rescue.response'
|
198
|
+
if request.path_info == express_ok_path # if express, we render on_success
|
199
|
+
new_env['PATH_INFO'] = (payment.on_success || payment_instance.on_success)
|
200
|
+
elsif payment.on_error
|
201
|
+
new_env['PATH_INFO'] = payment.on_error # Specific to this request
|
202
|
+
elsif payment_instance.on_error
|
203
|
+
new_env['PATH_INFO'] = payment_instance.on_error # Global
|
204
|
+
end
|
196
205
|
|
197
|
-
new_env['PATH_INFO'] = on_success if request.path_info == express_ok_path # if express, we render on_success
|
198
206
|
app.call(new_env)
|
199
207
|
end
|
200
208
|
end
|
201
209
|
|
210
|
+
# Rails keeps track of its own Request/Response.
|
211
|
+
#
|
212
|
+
# If we're using Rails, we need to delete these variables
|
213
|
+
# to trick Rails into thinking that this is a new request.
|
214
|
+
#
|
215
|
+
# Kind of icky!
|
216
|
+
def cleanup_env_for_rails new_env
|
217
|
+
new_env.delete 'action_controller.rescue.request'
|
218
|
+
new_env.delete 'action_controller.rescue.response'
|
219
|
+
new_env.delete 'REQUEST_URI'
|
220
|
+
end
|
221
|
+
|
202
222
|
def render_on_success
|
223
|
+
on_success = (payment.on_success || payment_instance.on_success)
|
224
|
+
|
203
225
|
if on_success
|
204
226
|
# on_success is overriden ... we #call the main application using the on_success path
|
205
227
|
new_env = env.clone
|
228
|
+
cleanup_env_for_rails(new_env)
|
206
229
|
new_env['PATH_INFO'] = on_success
|
207
230
|
new_env['REQUEST_METHOD'] = 'GET'
|
208
|
-
|
209
|
-
# For Rails
|
210
|
-
new_env.delete 'action_controller.rescue.request'
|
211
|
-
new_env.delete 'action_controller.rescue.response'
|
212
|
-
new_env.delete 'REQUEST_URI'
|
213
|
-
|
214
231
|
app.call new_env
|
215
232
|
else
|
216
233
|
# on_success has not been overriden ... let's just display out own info
|