activemerchant 1.42.2 → 1.42.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +8 -8
- checksums.yaml.gz.sig +0 -0
- data.tar.gz.sig +0 -0
- data/CHANGELOG +32 -0
- data/CONTRIBUTORS +12 -0
- data/README.md +3 -0
- data/lib/active_merchant/billing/base.rb +9 -2
- data/lib/active_merchant/billing/credit_card_methods.rb +1 -1
- data/lib/active_merchant/billing/gateway.rb +1 -1
- data/lib/active_merchant/billing/gateways/authorize_net.rb +3 -2
- data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +8 -8
- data/lib/active_merchant/billing/gateways/balanced.rb +7 -2
- data/lib/active_merchant/billing/gateways/beanstream.rb +1 -1
- data/lib/active_merchant/billing/gateways/bogus.rb +32 -22
- data/lib/active_merchant/billing/gateways/braintree_blue.rb +124 -39
- data/lib/active_merchant/billing/gateways/cyber_source.rb +2 -2
- data/lib/active_merchant/billing/gateways/litle.rb +1 -1
- data/lib/active_merchant/billing/gateways/merchant_warrior.rb +2 -2
- data/lib/active_merchant/billing/gateways/moneris.rb +1 -1
- data/lib/active_merchant/billing/gateways/moneris_us.rb +1 -1
- data/lib/active_merchant/billing/gateways/nab_transact.rb +3 -1
- data/lib/active_merchant/billing/gateways/netpay.rb +1 -1
- data/lib/active_merchant/billing/gateways/pay_junction.rb +7 -7
- data/lib/active_merchant/billing/gateways/payex.rb +402 -0
- data/lib/active_merchant/billing/gateways/payflow.rb +41 -11
- data/lib/active_merchant/billing/gateways/payment_express.rb +1 -1
- data/lib/active_merchant/billing/gateways/paymill.rb +55 -3
- data/lib/active_merchant/billing/gateways/paypal/paypal_common_api.rb +1 -1
- data/lib/active_merchant/billing/gateways/payscout.rb +171 -0
- data/lib/active_merchant/billing/gateways/pin.rb +1 -1
- data/lib/active_merchant/billing/gateways/realex.rb +1 -1
- data/lib/active_merchant/billing/gateways/redsys.rb +1 -1
- data/lib/active_merchant/billing/gateways/so_easy_pay.rb +194 -0
- data/lib/active_merchant/billing/gateways/stripe.rb +23 -25
- data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +26 -15
- data/lib/active_merchant/billing/gateways/webpay.rb +27 -11
- data/lib/active_merchant/billing/gateways/wirecard.rb +1 -1
- data/lib/active_merchant/billing/integrations/bit_pay/helper.rb +1 -1
- data/lib/active_merchant/billing/integrations/ipay88.rb +4 -0
- data/lib/active_merchant/billing/integrations/ipay88/helper.rb +1 -1
- data/lib/active_merchant/billing/integrations/ipay88/notification.rb +103 -0
- data/lib/active_merchant/billing/integrations/ipay88/return.rb +8 -74
- data/lib/active_merchant/billing/integrations/pay_fast/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/paypal/helper.rb +1 -1
- data/lib/active_merchant/billing/integrations/payu_in.rb +2 -9
- data/lib/active_merchant/billing/integrations/payu_in/helper.rb +15 -13
- data/lib/active_merchant/billing/integrations/payu_in/notification.rb +9 -20
- data/lib/active_merchant/billing/integrations/payu_in_paisa/helper.rb +1 -1
- data/lib/active_merchant/billing/integrations/payu_in_paisa/notification.rb +0 -10
- data/lib/active_merchant/billing/integrations/payu_in_paisa/return.rb +1 -1
- data/lib/active_merchant/billing/integrations/two_checkout/helper.rb +1 -1
- data/lib/active_merchant/billing/integrations/valitor/helper.rb +3 -3
- data/lib/active_merchant/billing/integrations/valitor/response_fields.rb +2 -2
- data/lib/active_merchant/billing/integrations/verkkomaksut/notification.rb +1 -1
- data/lib/active_merchant/billing/integrations/wirecard_checkout_page.rb +1 -1
- data/lib/active_merchant/billing/integrations/world_pay/helper.rb +2 -2
- data/lib/active_merchant/version.rb +1 -1
- metadata +7 -3
- metadata.gz.sig +0 -0
@@ -40,7 +40,7 @@ module ActiveMerchant #:nodoc:
|
|
40
40
|
post = create_post_for_auth_or_purchase(money, creditcard, options)
|
41
41
|
post[:capture] = "false"
|
42
42
|
|
43
|
-
commit(:post, 'charges', post,
|
43
|
+
commit(:post, 'charges', post, options)
|
44
44
|
end
|
45
45
|
|
46
46
|
# To create a charge on a card or a token, call
|
@@ -53,31 +53,30 @@ module ActiveMerchant #:nodoc:
|
|
53
53
|
def purchase(money, creditcard, options = {})
|
54
54
|
post = create_post_for_auth_or_purchase(money, creditcard, options)
|
55
55
|
|
56
|
-
commit(:post, 'charges', post,
|
56
|
+
commit(:post, 'charges', post, options)
|
57
57
|
end
|
58
58
|
|
59
59
|
def capture(money, authorization, options = {})
|
60
60
|
post = {:amount => amount(money)}
|
61
61
|
add_application_fee(post, options)
|
62
62
|
|
63
|
-
commit(:post, "charges/#{CGI.escape(authorization)}/capture", post)
|
63
|
+
commit(:post, "charges/#{CGI.escape(authorization)}/capture", post, options)
|
64
64
|
end
|
65
65
|
|
66
66
|
def void(identification, options = {})
|
67
|
-
commit(:post, "charges/#{CGI.escape(identification)}/refund", {})
|
67
|
+
commit(:post, "charges/#{CGI.escape(identification)}/refund", {}, options)
|
68
68
|
end
|
69
69
|
|
70
70
|
def refund(money, identification, options = {})
|
71
71
|
post = {:amount => amount(money)}
|
72
|
-
commit_options = generate_options(options)
|
73
72
|
|
74
73
|
MultiResponse.run(:first) do |r|
|
75
|
-
r.process { commit(:post, "charges/#{CGI.escape(identification)}/refund", post,
|
74
|
+
r.process { commit(:post, "charges/#{CGI.escape(identification)}/refund", post, options) }
|
76
75
|
|
77
76
|
return r unless options[:refund_fee_amount]
|
78
77
|
|
79
|
-
r.process { fetch_application_fees(identification,
|
80
|
-
r.process { refund_application_fee(options[:refund_fee_amount], application_fee_from_response(r),
|
78
|
+
r.process { fetch_application_fees(identification, options) }
|
79
|
+
r.process { refund_application_fee(options[:refund_fee_amount], application_fee_from_response(r), options) }
|
81
80
|
end
|
82
81
|
end
|
83
82
|
|
@@ -104,17 +103,16 @@ module ActiveMerchant #:nodoc:
|
|
104
103
|
post[:description] = options[:description]
|
105
104
|
post[:email] = options[:email]
|
106
105
|
|
107
|
-
commit_options = generate_options(options)
|
108
106
|
if options[:customer]
|
109
107
|
MultiResponse.run(:first) do |r|
|
110
|
-
r.process { commit(:post, "customers/#{CGI.escape(options[:customer])}/cards", post,
|
108
|
+
r.process { commit(:post, "customers/#{CGI.escape(options[:customer])}/cards", post, options) }
|
111
109
|
|
112
110
|
return r unless options[:set_default] and r.success? and !r.params["id"].blank?
|
113
111
|
|
114
112
|
r.process { update_customer(options[:customer], :default_card => r.params["id"]) }
|
115
113
|
end
|
116
114
|
else
|
117
|
-
commit(:post, 'customers', post,
|
115
|
+
commit(:post, 'customers', post, options)
|
118
116
|
end
|
119
117
|
end
|
120
118
|
|
@@ -124,14 +122,14 @@ module ActiveMerchant #:nodoc:
|
|
124
122
|
end
|
125
123
|
|
126
124
|
def update_customer(customer_id, options = {})
|
127
|
-
commit(:post, "customers/#{CGI.escape(customer_id)}", options,
|
125
|
+
commit(:post, "customers/#{CGI.escape(customer_id)}", options, options)
|
128
126
|
end
|
129
127
|
|
130
128
|
def unstore(customer_id, card_id = nil, options = {})
|
131
129
|
if card_id.nil?
|
132
|
-
commit(:delete, "customers/#{CGI.escape(customer_id)}", nil,
|
130
|
+
commit(:delete, "customers/#{CGI.escape(customer_id)}", nil, options)
|
133
131
|
else
|
134
|
-
commit(:delete, "customers/#{CGI.escape(customer_id)}/cards/#{CGI.escape(card_id)}", nil,
|
132
|
+
commit(:delete, "customers/#{CGI.escape(customer_id)}/cards/#{CGI.escape(card_id)}", nil, options)
|
135
133
|
end
|
136
134
|
end
|
137
135
|
|
@@ -143,7 +141,8 @@ module ActiveMerchant #:nodoc:
|
|
143
141
|
add_creditcard(post, creditcard, options)
|
144
142
|
add_customer(post, creditcard, options)
|
145
143
|
add_customer_data(post,options)
|
146
|
-
post[:description] = options[:description]
|
144
|
+
post[:description] = options[:description]
|
145
|
+
post[:metadata] = { email: options[:email] } if options[:email]
|
147
146
|
add_flags(post, options)
|
148
147
|
add_application_fee(post, options)
|
149
148
|
post
|
@@ -158,6 +157,10 @@ module ActiveMerchant #:nodoc:
|
|
158
157
|
post[:application_fee] = options[:application_fee] if options[:application_fee]
|
159
158
|
end
|
160
159
|
|
160
|
+
def add_expand_parameters(post, options)
|
161
|
+
post[:expand] = Array.wrap(options[:expand])
|
162
|
+
end
|
163
|
+
|
161
164
|
def add_customer_data(post, options)
|
162
165
|
metadata_options = [:description, :ip, :user_agent, :referrer]
|
163
166
|
post.update(options.slice(*metadata_options))
|
@@ -232,21 +235,14 @@ module ActiveMerchant #:nodoc:
|
|
232
235
|
h["#{key}[#{k}]"] = v unless v.blank?
|
233
236
|
end
|
234
237
|
post_data(h)
|
238
|
+
elsif value.is_a?(Array)
|
239
|
+
value.map { |v| "#{key}[]=#{CGI.escape(v.to_s)}" }.join("&")
|
235
240
|
else
|
236
241
|
"#{key}=#{CGI.escape(value.to_s)}"
|
237
242
|
end
|
238
243
|
end.compact.join("&")
|
239
244
|
end
|
240
245
|
|
241
|
-
def generate_options(raw_options)
|
242
|
-
options = generate_meta(raw_options)
|
243
|
-
options.merge!(raw_options.slice(:version))
|
244
|
-
end
|
245
|
-
|
246
|
-
def generate_meta(options)
|
247
|
-
{:meta => {:ip => options[:ip]}}
|
248
|
-
end
|
249
|
-
|
250
246
|
def headers(options = {})
|
251
247
|
@@ua ||= JSON.dump({
|
252
248
|
:bindings_version => ActiveMerchant::VERSION,
|
@@ -262,13 +258,15 @@ module ActiveMerchant #:nodoc:
|
|
262
258
|
"Authorization" => "Basic " + Base64.encode64(key.to_s + ":").strip,
|
263
259
|
"User-Agent" => "Stripe/v1 ActiveMerchantBindings/#{ActiveMerchant::VERSION}",
|
264
260
|
"X-Stripe-Client-User-Agent" => @@ua,
|
265
|
-
"X-Stripe-Client-User-Metadata" => options[:
|
261
|
+
"X-Stripe-Client-User-Metadata" => {:ip => options[:ip]}.to_json
|
266
262
|
}
|
267
263
|
headers.merge!("Stripe-Version" => options[:version]) if options[:version]
|
268
264
|
headers
|
269
265
|
end
|
270
266
|
|
271
267
|
def commit(method, url, parameters=nil, options = {})
|
268
|
+
add_expand_parameters(parameters, options) if parameters
|
269
|
+
|
272
270
|
raw_response = response = nil
|
273
271
|
success = false
|
274
272
|
begin
|
@@ -179,7 +179,6 @@ module ActiveMerchant #:nodoc:
|
|
179
179
|
} #:nodoc:
|
180
180
|
|
181
181
|
CHECK_DATA_OPTIONS = {
|
182
|
-
:check_number => [:integer, 'CheckNumber'],
|
183
182
|
:drivers_license => [:string, 'DriversLicense'],
|
184
183
|
:drivers_license_state => [:string, 'DriversLicenseState'],
|
185
184
|
:record_type => [:string, 'RecordType'],
|
@@ -339,9 +338,10 @@ module ActiveMerchant #:nodoc:
|
|
339
338
|
commit(__method__, request)
|
340
339
|
end
|
341
340
|
|
342
|
-
# Update a customer by replacing all of the customer details
|
341
|
+
# Update a customer by replacing all of the customer details.
|
343
342
|
#
|
344
|
-
#
|
343
|
+
# ==== Required
|
344
|
+
# * <tt>:customer_number</tt> -- customer to update
|
345
345
|
#
|
346
346
|
# ==== Options
|
347
347
|
# * Same as add_customer
|
@@ -355,7 +355,7 @@ module ActiveMerchant #:nodoc:
|
|
355
355
|
|
356
356
|
# Enable a customer for recurring billing.
|
357
357
|
#
|
358
|
-
# Note: Customer does not need to have all recurring
|
358
|
+
# Note: Customer does not need to have all recurring parameters to succeed.
|
359
359
|
#
|
360
360
|
# ==== Required
|
361
361
|
# * <tt>:customer_number</tt>
|
@@ -454,7 +454,7 @@ module ActiveMerchant #:nodoc:
|
|
454
454
|
commit(__method__, request)
|
455
455
|
end
|
456
456
|
|
457
|
-
# Delete one the payment methods
|
457
|
+
# Delete one the payment methods belonging to a customer
|
458
458
|
#
|
459
459
|
# ==== Required
|
460
460
|
# * <tt>:customer_number</tt>
|
@@ -543,11 +543,11 @@ module ActiveMerchant #:nodoc:
|
|
543
543
|
# will be returned in the response.
|
544
544
|
#
|
545
545
|
# ==== Options
|
546
|
-
# * <tt>:
|
546
|
+
# * <tt>:payment_method</tt> -- credit_card or check
|
547
547
|
# * <tt>:command</tt> -- sale, credit, void, creditvoid, authonly, capture, postauth, check, checkcredit; defaults to sale; only required for run_transaction when other than sale
|
548
548
|
# * <tt>:reference_number</tt> -- for the original transaction; obtained by sale or authonly
|
549
549
|
# * <tt>:authorization_code</tt> -- required for postauth; obtained offline
|
550
|
-
# * <tt>:ignore_duplicate</tt> -- set +true+ if you want to override the duplicate
|
550
|
+
# * <tt>:ignore_duplicate</tt> -- set +true+ if you want to override the duplicate transaction handling
|
551
551
|
# * <tt>:account_holder</tt> -- name of account holder
|
552
552
|
# * <tt>:customer_id</tt> -- merchant assigned id
|
553
553
|
# * <tt>:customer_receipt</tt> -- set +true+ to email receipt to billing email address
|
@@ -680,7 +680,7 @@ module ActiveMerchant #:nodoc:
|
|
680
680
|
commit(__method__, request)
|
681
681
|
end
|
682
682
|
|
683
|
-
# Override transaction flagged for
|
683
|
+
# Override transaction flagged for manager approval.
|
684
684
|
#
|
685
685
|
# Note: Checks only!
|
686
686
|
#
|
@@ -1166,7 +1166,7 @@ module ActiveMerchant #:nodoc:
|
|
1166
1166
|
soap.tag! "ns1:captureTransaction" do |soap|
|
1167
1167
|
build_token soap, options
|
1168
1168
|
build_tag soap, :integer, 'RefNum', options[:reference_number]
|
1169
|
-
build_tag soap, :double, '
|
1169
|
+
build_tag soap, :double, 'Amount', amount(options[:amount])
|
1170
1170
|
end
|
1171
1171
|
end
|
1172
1172
|
|
@@ -1244,16 +1244,18 @@ module ActiveMerchant #:nodoc:
|
|
1244
1244
|
when payment_method[:method].kind_of?(ActiveMerchant::Billing::CreditCard)
|
1245
1245
|
build_tag soap, :string, 'CardNumber', payment_method[:method].number
|
1246
1246
|
build_tag soap, :string, 'CardExpiration',
|
1247
|
-
"#{"%02d" % payment_method[:method].month}#{payment_method[:method].year}"
|
1247
|
+
"#{"%02d" % payment_method[:method].month}#{payment_method[:method].year.to_s[-2..-1]}"
|
1248
1248
|
if options[:billing_address]
|
1249
1249
|
build_tag soap, :string, 'AvsStreet', options[:billing_address][:address1]
|
1250
1250
|
build_tag soap, :string, 'AvsZip', options[:billing_address][:zip]
|
1251
1251
|
end
|
1252
1252
|
build_tag soap, :string, 'CardCode', payment_method[:method].verification_value
|
1253
1253
|
when payment_method[:method].kind_of?(ActiveMerchant::Billing::Check)
|
1254
|
-
build_tag soap, :string, 'Account', payment_method[:method].
|
1254
|
+
build_tag soap, :string, 'Account', payment_method[:method].account_number
|
1255
1255
|
build_tag soap, :string, 'Routing', payment_method[:method].routing_number
|
1256
|
-
|
1256
|
+
unless payment_method[:method].account_type.nil?
|
1257
|
+
build_tag soap, :string, 'AccountType', payment_method[:method].account_type.capitalize
|
1258
|
+
end
|
1257
1259
|
build_tag soap, :string, 'DriversLicense', options[:drivers_license]
|
1258
1260
|
build_tag soap, :string, 'DriversLicenseState', options[:drivers_license_state]
|
1259
1261
|
build_tag soap, :string, 'RecordType', options[:record_type]
|
@@ -1323,8 +1325,7 @@ module ActiveMerchant #:nodoc:
|
|
1323
1325
|
def build_credit_card_data(soap, options)
|
1324
1326
|
soap.CreditCardData 'xsi:type' => "ns1:CreditCardData" do |soap|
|
1325
1327
|
build_tag soap, :string, 'CardNumber', options[:payment_method].number
|
1326
|
-
build_tag soap, :string, 'CardExpiration',
|
1327
|
-
"#{"%02d" % options[:payment_method].month}#{options[:payment_method].year}"
|
1328
|
+
build_tag soap, :string, 'CardExpiration', build_card_expiration(options)
|
1328
1329
|
if options[:billing_address]
|
1329
1330
|
build_tag soap, :string, 'AvsStreet', options[:billing_address][:address1]
|
1330
1331
|
build_tag soap, :string, 'AvsZip', options[:billing_address][:zip]
|
@@ -1337,8 +1338,17 @@ module ActiveMerchant #:nodoc:
|
|
1337
1338
|
end
|
1338
1339
|
end
|
1339
1340
|
|
1341
|
+
def build_card_expiration(options)
|
1342
|
+
month = options[:payment_method].month
|
1343
|
+
year = options[:payment_method].year
|
1344
|
+
unless month.nil? || year.nil?
|
1345
|
+
"#{"%02d" % month}#{year.to_s[-2..-1]}"
|
1346
|
+
end
|
1347
|
+
end
|
1348
|
+
|
1340
1349
|
def build_check_data(soap, options)
|
1341
1350
|
soap.CheckData 'xsi:type' => "ns1:CheckData" do |soap|
|
1351
|
+
build_tag soap, :integer, 'CheckNumber', options[:payment_method].number
|
1342
1352
|
build_tag soap, :string, 'Account', options[:payment_method].account_number
|
1343
1353
|
build_tag soap, :string, 'Routing', options[:payment_method].routing_number
|
1344
1354
|
build_tag soap, :string, 'AccountType', options[:payment_method].account_type.capitalize
|
@@ -1461,7 +1471,8 @@ module ActiveMerchant #:nodoc:
|
|
1461
1471
|
when :get_customer_payment_methods
|
1462
1472
|
p['item']
|
1463
1473
|
when :get_transaction_custom
|
1464
|
-
p['item'].
|
1474
|
+
items = p['item'].kind_of?(Array) ? p['item'] : [p['item']]
|
1475
|
+
items.inject({}) { |hash, item| hash[item['field']] = item['value']; hash }
|
1465
1476
|
else
|
1466
1477
|
p
|
1467
1478
|
end
|
@@ -13,25 +13,22 @@ module ActiveMerchant #:nodoc:
|
|
13
13
|
self.homepage_url = 'https://webpay.jp/'
|
14
14
|
self.display_name = 'WebPay'
|
15
15
|
|
16
|
-
def
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
def capture(money, credit_card, options = {})
|
21
|
-
raise NotImplementedError.new
|
16
|
+
def capture(money, authorization, options = {})
|
17
|
+
post = {:amount => localized_amount(money)}
|
18
|
+
add_application_fee(post, options)
|
19
|
+
commit(:post, "charges/#{CGI.escape(authorization)}/capture", post)
|
22
20
|
end
|
23
21
|
|
24
22
|
def refund(money, identification, options = {})
|
25
23
|
post = {:amount => localized_amount(money)}
|
26
|
-
commit_options = generate_meta(options)
|
27
24
|
|
28
25
|
MultiResponse.run do |r|
|
29
|
-
r.process { commit(:post, "charges/#{CGI.escape(identification)}/refund", post,
|
26
|
+
r.process { commit(:post, "charges/#{CGI.escape(identification)}/refund", post, options) }
|
30
27
|
|
31
28
|
return r unless options[:refund_fee_amount]
|
32
29
|
|
33
|
-
r.process { fetch_application_fees(identification,
|
34
|
-
r.process { refund_application_fee(options[:refund_fee_amount], application_fee_from_response(r),
|
30
|
+
r.process { fetch_application_fees(identification, options) }
|
31
|
+
r.process { refund_application_fee(options[:refund_fee_amount], application_fee_from_response(r), options) }
|
35
32
|
end
|
36
33
|
end
|
37
34
|
|
@@ -52,6 +49,25 @@ module ActiveMerchant #:nodoc:
|
|
52
49
|
post[:customer] = options[:customer] if options[:customer] && !creditcard.respond_to?(:number)
|
53
50
|
end
|
54
51
|
|
52
|
+
def store(creditcard, options = {})
|
53
|
+
post = {}
|
54
|
+
add_creditcard(post, creditcard, options)
|
55
|
+
post[:description] = options[:description]
|
56
|
+
post[:email] = options[:email]
|
57
|
+
|
58
|
+
if options[:customer]
|
59
|
+
MultiResponse.run(:first) do |r|
|
60
|
+
r.process { commit(:post, "customers/#{CGI.escape(options[:customer])}/", post, options) }
|
61
|
+
|
62
|
+
return r unless options[:set_default] and r.success? and !r.params["id"].blank?
|
63
|
+
|
64
|
+
r.process { update_customer(options[:customer], :default_card => r.params["id"]) }
|
65
|
+
end
|
66
|
+
else
|
67
|
+
commit(:post, 'customers', post, options)
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
55
71
|
def json_error(raw_response)
|
56
72
|
msg = 'Invalid response received from the WebPay API. Please contact support@webpay.jp if you continue to receive this message.'
|
57
73
|
msg += " (The raw response returned by the API was #{raw_response.inspect})"
|
@@ -75,7 +91,7 @@ module ActiveMerchant #:nodoc:
|
|
75
91
|
"Authorization" => "Basic " + Base64.encode64(@api_key.to_s + ":").strip,
|
76
92
|
"User-Agent" => "Webpay/v1 ActiveMerchantBindings/#{ActiveMerchant::VERSION}",
|
77
93
|
"X-Webpay-Client-User-Agent" => @@ua,
|
78
|
-
"X-Webpay-Client-User-Metadata" => options[:
|
94
|
+
"X-Webpay-Client-User-Metadata" => {:ip => options[:ip]}.to_json
|
79
95
|
}
|
80
96
|
end
|
81
97
|
end
|
@@ -232,7 +232,7 @@ module ActiveMerchant #:nodoc:
|
|
232
232
|
response
|
233
233
|
end
|
234
234
|
|
235
|
-
# Parse the <ProcessingStatus> Element which
|
235
|
+
# Parse the <ProcessingStatus> Element which contains all important information
|
236
236
|
def parse_response(response, root)
|
237
237
|
status = nil
|
238
238
|
# get the root element for this Transaction
|
@@ -10,6 +10,10 @@ module ActiveMerchant #:nodoc:
|
|
10
10
|
"https://www.mobile88.com/epayment/entry.asp"
|
11
11
|
end
|
12
12
|
|
13
|
+
def self.requery_url
|
14
|
+
"https://www.mobile88.com/epayment/enquiry.asp"
|
15
|
+
end
|
16
|
+
|
13
17
|
def self.return(query_string, options={})
|
14
18
|
Return.new(query_string, options)
|
15
19
|
end
|
@@ -107,7 +107,7 @@ module ActiveMerchant #:nodoc:
|
|
107
107
|
components = [merchant_key]
|
108
108
|
components << fields[mappings[:account]]
|
109
109
|
components << fields[mappings[:order]]
|
110
|
-
components << amount_in_dollars.
|
110
|
+
components << amount_in_dollars.gsub(/[.,]/, '')
|
111
111
|
components << fields[mappings[:currency]]
|
112
112
|
components.join
|
113
113
|
end
|
@@ -0,0 +1,103 @@
|
|
1
|
+
module ActiveMerchant #:nodoc:
|
2
|
+
module Billing #:nodoc:
|
3
|
+
module Integrations #:nodoc:
|
4
|
+
module Ipay88
|
5
|
+
class Notification < ActiveMerchant::Billing::Integrations::Notification
|
6
|
+
include ActiveMerchant::PostsData
|
7
|
+
|
8
|
+
def status
|
9
|
+
params["Status"] == '1' ? 'Completed' : 'Failed'
|
10
|
+
end
|
11
|
+
|
12
|
+
def complete?
|
13
|
+
status == 'Completed'
|
14
|
+
end
|
15
|
+
|
16
|
+
def item_id
|
17
|
+
params["RefNo"]
|
18
|
+
end
|
19
|
+
|
20
|
+
def gross
|
21
|
+
params["Amount"]
|
22
|
+
end
|
23
|
+
|
24
|
+
def currency
|
25
|
+
params["Currency"]
|
26
|
+
end
|
27
|
+
|
28
|
+
def account
|
29
|
+
params["MerchantCode"]
|
30
|
+
end
|
31
|
+
|
32
|
+
def payment
|
33
|
+
params["PaymentId"].to_i
|
34
|
+
end
|
35
|
+
|
36
|
+
def remark
|
37
|
+
params["Remark"]
|
38
|
+
end
|
39
|
+
|
40
|
+
def transaction_id
|
41
|
+
params["TransId"]
|
42
|
+
end
|
43
|
+
|
44
|
+
def auth_code
|
45
|
+
params["AuthCode"]
|
46
|
+
end
|
47
|
+
|
48
|
+
def error
|
49
|
+
params["ErrDesc"]
|
50
|
+
end
|
51
|
+
|
52
|
+
def signature
|
53
|
+
params["Signature"]
|
54
|
+
end
|
55
|
+
|
56
|
+
def secure?
|
57
|
+
generated_signature == signature
|
58
|
+
end
|
59
|
+
|
60
|
+
def success?
|
61
|
+
status == 'Completed'
|
62
|
+
end
|
63
|
+
|
64
|
+
def acknowledge
|
65
|
+
secure? && success? && requery == "00"
|
66
|
+
end
|
67
|
+
|
68
|
+
protected
|
69
|
+
|
70
|
+
def generated_signature
|
71
|
+
Helper.sign(sig_components)
|
72
|
+
end
|
73
|
+
|
74
|
+
def sig_components
|
75
|
+
components = [@options[:credential2]]
|
76
|
+
[:account, :payment, :item_id, :amount_in_cents, :currency].each do |i|
|
77
|
+
components << send(i)
|
78
|
+
end
|
79
|
+
components << params["Status"]
|
80
|
+
components.join
|
81
|
+
end
|
82
|
+
|
83
|
+
def requery
|
84
|
+
data = { "MerchantCode" => account, "RefNo" => item_id, "Amount" => gross }
|
85
|
+
params = parameterize(data)
|
86
|
+
ssl_post Ipay88.requery_url, params, { "Content-Length" => params.size.to_s, "User-Agent" => "Active Merchant -- http://activemerchant.org" }
|
87
|
+
end
|
88
|
+
|
89
|
+
private
|
90
|
+
|
91
|
+
def parameterize(params)
|
92
|
+
params.reject { |k, v| v.blank? }.keys.sort.collect { |key| "#{key}=#{CGI.escape(params[key].to_s)}" }.join("&")
|
93
|
+
end
|
94
|
+
|
95
|
+
def amount_in_cents
|
96
|
+
@amount_in_cents ||= (gross || "").gsub(/[.,]/, "")
|
97
|
+
end
|
98
|
+
end
|
99
|
+
end
|
100
|
+
end
|
101
|
+
end
|
102
|
+
end
|
103
|
+
|