activemerchant 1.133.0 → 1.137.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 +4 -4
- data/CHANGELOG +240 -0
- data/lib/active_merchant/billing/check.rb +2 -2
- data/lib/active_merchant/billing/compatibility.rb +4 -4
- data/lib/active_merchant/billing/credit_card.rb +11 -8
- data/lib/active_merchant/billing/credit_card_formatting.rb +4 -0
- data/lib/active_merchant/billing/credit_card_methods.rb +59 -6
- data/lib/active_merchant/billing/gateway.rb +9 -0
- data/lib/active_merchant/billing/gateways/adyen.rb +162 -43
- data/lib/active_merchant/billing/gateways/airwallex.rb +26 -12
- data/lib/active_merchant/billing/gateways/alelo.rb +23 -5
- data/lib/active_merchant/billing/gateways/authorize_net.rb +43 -35
- data/lib/active_merchant/billing/gateways/authorize_net_arb.rb +10 -6
- data/lib/active_merchant/billing/gateways/authorize_net_cim.rb +1 -3
- data/lib/active_merchant/billing/gateways/axcessms.rb +6 -2
- data/lib/active_merchant/billing/gateways/banwire.rb +4 -2
- data/lib/active_merchant/billing/gateways/beanstream/beanstream_core.rb +7 -3
- data/lib/active_merchant/billing/gateways/blue_pay.rb +13 -5
- data/lib/active_merchant/billing/gateways/blue_snap.rb +5 -5
- data/lib/active_merchant/billing/gateways/braintree/token_nonce.rb +65 -20
- data/lib/active_merchant/billing/gateways/braintree_blue.rb +226 -73
- data/lib/active_merchant/billing/gateways/braintree_orange.rb +1 -1
- data/lib/active_merchant/billing/gateways/card_connect.rb +5 -2
- data/lib/active_merchant/billing/gateways/card_stream.rb +4 -6
- data/lib/active_merchant/billing/gateways/cashnet.rb +1 -1
- data/lib/active_merchant/billing/gateways/cecabank/cecabank_common.rb +36 -0
- data/lib/active_merchant/billing/gateways/cecabank/cecabank_json.rb +316 -0
- data/lib/active_merchant/billing/gateways/cecabank/cecabank_xml.rb +220 -0
- data/lib/active_merchant/billing/gateways/cecabank.rb +7 -240
- data/lib/active_merchant/billing/gateways/checkout_v2.rb +238 -34
- data/lib/active_merchant/billing/gateways/commerce_hub.rb +63 -6
- data/lib/active_merchant/billing/gateways/credorax.rb +3 -5
- data/lib/active_merchant/billing/gateways/cyber_source.rb +185 -47
- data/lib/active_merchant/billing/gateways/cyber_source_rest.rb +102 -58
- data/lib/active_merchant/billing/gateways/d_local.rb +26 -15
- data/lib/active_merchant/billing/gateways/data_cash.rb +21 -17
- data/lib/active_merchant/billing/gateways/datatrans.rb +279 -0
- data/lib/active_merchant/billing/gateways/decidir.rb +53 -18
- data/lib/active_merchant/billing/gateways/decidir_plus.rb +4 -1
- data/lib/active_merchant/billing/gateways/deepstack.rb +382 -0
- data/lib/active_merchant/billing/gateways/ebanx.rb +40 -36
- data/lib/active_merchant/billing/gateways/efsnet.rb +6 -2
- data/lib/active_merchant/billing/gateways/elavon.rb +99 -33
- data/lib/active_merchant/billing/gateways/element.rb +36 -7
- data/lib/active_merchant/billing/gateways/epay.rb +6 -2
- data/lib/active_merchant/billing/gateways/evo_ca.rb +6 -2
- data/lib/active_merchant/billing/gateways/eway.rb +4 -2
- data/lib/active_merchant/billing/gateways/eway_managed.rb +6 -2
- data/lib/active_merchant/billing/gateways/exact.rb +6 -2
- data/lib/active_merchant/billing/gateways/fat_zebra.rb +31 -3
- data/lib/active_merchant/billing/gateways/federated_canada.rb +6 -2
- data/lib/active_merchant/billing/gateways/first_pay/first_pay_common.rb +15 -0
- data/lib/active_merchant/billing/gateways/first_pay/first_pay_json.rb +190 -0
- data/lib/active_merchant/billing/gateways/first_pay/first_pay_xml.rb +183 -0
- data/lib/active_merchant/billing/gateways/first_pay.rb +6 -172
- data/lib/active_merchant/billing/gateways/firstdata_e4.rb +6 -2
- data/lib/active_merchant/billing/gateways/firstdata_e4_v27.rb +7 -3
- data/lib/active_merchant/billing/gateways/flex_charge.rb +347 -0
- data/lib/active_merchant/billing/gateways/garanti.rb +4 -2
- data/lib/active_merchant/billing/gateways/global_collect.rb +45 -37
- data/lib/active_merchant/billing/gateways/hi_pay.rb +286 -0
- data/lib/active_merchant/billing/gateways/hps.rb +1 -1
- data/lib/active_merchant/billing/gateways/iats_payments.rb +7 -2
- data/lib/active_merchant/billing/gateways/inspire.rb +6 -4
- data/lib/active_merchant/billing/gateways/instapay.rb +7 -4
- data/lib/active_merchant/billing/gateways/ipg.rb +9 -5
- data/lib/active_merchant/billing/gateways/iridium.rb +15 -5
- data/lib/active_merchant/billing/gateways/itransact.rb +6 -2
- data/lib/active_merchant/billing/gateways/iveri.rb +3 -3
- data/lib/active_merchant/billing/gateways/ixopay.rb +2 -2
- data/lib/active_merchant/billing/gateways/jetpay.rb +4 -2
- data/lib/active_merchant/billing/gateways/jetpay_v2.rb +4 -2
- data/lib/active_merchant/billing/gateways/kushki.rb +72 -12
- data/lib/active_merchant/billing/gateways/linkpoint.rb +6 -2
- data/lib/active_merchant/billing/gateways/litle.rb +33 -50
- data/lib/active_merchant/billing/gateways/mastercard.rb +4 -4
- data/lib/active_merchant/billing/gateways/maxipago.rb +2 -2
- data/lib/active_merchant/billing/gateways/merchant_e_solutions.rb +8 -5
- data/lib/active_merchant/billing/gateways/merchant_ware.rb +11 -4
- data/lib/active_merchant/billing/gateways/merchant_ware_version_four.rb +11 -4
- data/lib/active_merchant/billing/gateways/merchant_warrior.rb +19 -3
- data/lib/active_merchant/billing/gateways/mercury.rb +6 -2
- data/lib/active_merchant/billing/gateways/metrics_global.rb +8 -6
- data/lib/active_merchant/billing/gateways/migs/migs_codes.rb +1 -0
- data/lib/active_merchant/billing/gateways/migs.rb +6 -2
- data/lib/active_merchant/billing/gateways/mit.rb +8 -3
- data/lib/active_merchant/billing/gateways/modern_payments_cim.rb +18 -10
- data/lib/active_merchant/billing/gateways/monei.rb +1 -1
- data/lib/active_merchant/billing/gateways/moneris.rb +9 -3
- data/lib/active_merchant/billing/gateways/money_movers.rb +6 -2
- data/lib/active_merchant/billing/gateways/nab_transact.rb +12 -4
- data/lib/active_merchant/billing/gateways/net_registry.rb +6 -2
- data/lib/active_merchant/billing/gateways/netbanx.rb +1 -3
- data/lib/active_merchant/billing/gateways/netbilling.rb +6 -2
- data/lib/active_merchant/billing/gateways/network_merchants.rb +6 -2
- data/lib/active_merchant/billing/gateways/nmi.rb +18 -6
- data/lib/active_merchant/billing/gateways/ogone.rb +6 -2
- data/lib/active_merchant/billing/gateways/openpay.rb +4 -2
- data/lib/active_merchant/billing/gateways/opp.rb +1 -2
- data/lib/active_merchant/billing/gateways/optimal_payment.rb +6 -2
- data/lib/active_merchant/billing/gateways/orbital/orbital_soft_descriptors.rb +1 -3
- data/lib/active_merchant/billing/gateways/orbital.rb +83 -24
- data/lib/active_merchant/billing/gateways/pac_net_raven.rb +7 -4
- data/lib/active_merchant/billing/gateways/pay_gate_xml.rb +6 -2
- data/lib/active_merchant/billing/gateways/pay_hub.rb +4 -2
- data/lib/active_merchant/billing/gateways/pay_junction.rb +6 -2
- data/lib/active_merchant/billing/gateways/pay_secure.rb +6 -2
- data/lib/active_merchant/billing/gateways/pay_trace.rb +31 -18
- data/lib/active_merchant/billing/gateways/payeezy.rb +19 -8
- data/lib/active_merchant/billing/gateways/payex.rb +4 -2
- data/lib/active_merchant/billing/gateways/payflow/payflow_common_api.rb +1 -1
- data/lib/active_merchant/billing/gateways/payflow.rb +1 -3
- data/lib/active_merchant/billing/gateways/payment_express.rb +8 -4
- data/lib/active_merchant/billing/gateways/paymentez.rb +23 -11
- data/lib/active_merchant/billing/gateways/paysafe.rb +12 -11
- data/lib/active_merchant/billing/gateways/payscout.rb +7 -4
- data/lib/active_merchant/billing/gateways/paystation.rb +7 -3
- data/lib/active_merchant/billing/gateways/payway.rb +6 -2
- data/lib/active_merchant/billing/gateways/payway_dot_com.rb +2 -2
- data/lib/active_merchant/billing/gateways/pin.rb +22 -4
- data/lib/active_merchant/billing/gateways/plexo.rb +49 -10
- data/lib/active_merchant/billing/gateways/plugnpay.rb +6 -2
- data/lib/active_merchant/billing/gateways/priority.rb +6 -5
- data/lib/active_merchant/billing/gateways/psigate.rb +6 -2
- data/lib/active_merchant/billing/gateways/psl_card.rb +6 -2
- data/lib/active_merchant/billing/gateways/qbms.rb +6 -2
- data/lib/active_merchant/billing/gateways/quantum.rb +6 -2
- data/lib/active_merchant/billing/gateways/quickbooks.rb +6 -5
- data/lib/active_merchant/billing/gateways/quickpay/quickpay_v10.rb +7 -4
- data/lib/active_merchant/billing/gateways/quickpay/quickpay_v4to7.rb +6 -2
- data/lib/active_merchant/billing/gateways/rapyd.rb +148 -46
- data/lib/active_merchant/billing/gateways/reach.rb +11 -4
- data/lib/active_merchant/billing/gateways/redsys.rb +2 -10
- data/lib/active_merchant/billing/gateways/redsys_rest.rb +507 -0
- data/lib/active_merchant/billing/gateways/s5.rb +3 -3
- data/lib/active_merchant/billing/gateways/safe_charge.rb +36 -16
- data/lib/active_merchant/billing/gateways/sage.rb +12 -4
- data/lib/active_merchant/billing/gateways/sage_pay.rb +79 -5
- data/lib/active_merchant/billing/gateways/sallie_mae.rb +6 -2
- data/lib/active_merchant/billing/gateways/secure_net.rb +6 -2
- data/lib/active_merchant/billing/gateways/secure_pay.rb +8 -6
- data/lib/active_merchant/billing/gateways/secure_pay_au.rb +12 -4
- data/lib/active_merchant/billing/gateways/secure_pay_tech.rb +6 -2
- data/lib/active_merchant/billing/gateways/securion_pay.rb +24 -10
- data/lib/active_merchant/billing/gateways/shift4.rb +17 -20
- data/lib/active_merchant/billing/gateways/shift4_v2.rb +117 -0
- data/lib/active_merchant/billing/gateways/simetrik.rb +17 -11
- data/lib/active_merchant/billing/gateways/skip_jack.rb +6 -2
- data/lib/active_merchant/billing/gateways/smart_ps.rb +7 -4
- data/lib/active_merchant/billing/gateways/so_easy_pay.rb +4 -2
- data/lib/active_merchant/billing/gateways/spreedly_core.rb +2 -4
- data/lib/active_merchant/billing/gateways/stripe.rb +53 -21
- data/lib/active_merchant/billing/gateways/stripe_payment_intents.rb +199 -50
- data/lib/active_merchant/billing/gateways/sum_up.rb +223 -0
- data/lib/active_merchant/billing/gateways/swipe_checkout.rb +4 -2
- data/lib/active_merchant/billing/gateways/telr.rb +3 -4
- data/lib/active_merchant/billing/gateways/trans_first.rb +1 -2
- data/lib/active_merchant/billing/gateways/trans_first_transaction_express.rb +8 -16
- data/lib/active_merchant/billing/gateways/transact_pro.rb +1 -1
- data/lib/active_merchant/billing/gateways/trust_commerce.rb +6 -2
- data/lib/active_merchant/billing/gateways/usa_epay_advanced.rb +9 -8
- data/lib/active_merchant/billing/gateways/usa_epay_transaction.rb +6 -2
- data/lib/active_merchant/billing/gateways/vanco.rb +2 -4
- data/lib/active_merchant/billing/gateways/vantiv_express.rb +587 -0
- data/lib/active_merchant/billing/gateways/verifi.rb +6 -2
- data/lib/active_merchant/billing/gateways/viaklix.rb +6 -2
- data/lib/active_merchant/billing/gateways/visanet_peru.rb +2 -2
- data/lib/active_merchant/billing/gateways/vpos.rb +3 -3
- data/lib/active_merchant/billing/gateways/wirecard.rb +7 -3
- data/lib/active_merchant/billing/gateways/wompi.rb +5 -0
- data/lib/active_merchant/billing/gateways/worldpay.rb +140 -73
- data/lib/active_merchant/billing/gateways/worldpay_online_payments.rb +13 -10
- data/lib/active_merchant/billing/gateways/xpay.rb +242 -0
- data/lib/active_merchant/billing/network_tokenization_credit_card.rb +1 -1
- data/lib/active_merchant/billing/response.rb +2 -2
- data/lib/active_merchant/connection.rb +3 -17
- data/lib/active_merchant/country.rb +1 -0
- data/lib/active_merchant/errors.rb +10 -0
- data/lib/active_merchant/version.rb +1 -1
- data/lib/support/gateway_support.rb +2 -2
- data/lib/support/ssl_verify.rb +4 -4
- data/lib/support/ssl_version.rb +6 -6
- metadata +30 -9
@@ -182,14 +182,16 @@ module ActiveMerchant #:nodoc:
|
|
182
182
|
response = json_error(raw_response)
|
183
183
|
end
|
184
184
|
|
185
|
-
Response.new(
|
185
|
+
Response.new(
|
186
|
+
success,
|
186
187
|
response_message(response),
|
187
188
|
response,
|
188
189
|
test: test?,
|
189
190
|
avs_result: { code: response['AVS_RESULT_CODE'] },
|
190
191
|
cvv_result: response['VERIFICATION_RESULT_CODE'],
|
191
192
|
error_code: (success ? nil : STANDARD_ERROR_CODE_MAPPING[response['RESPONSE_CODE']]),
|
192
|
-
authorization: response['TRANSACTION_ID']
|
193
|
+
authorization: response['TRANSACTION_ID']
|
194
|
+
)
|
193
195
|
end
|
194
196
|
|
195
197
|
def response_error(raw_response)
|
@@ -337,9 +337,13 @@ module ActiveMerchant #:nodoc:
|
|
337
337
|
|
338
338
|
response = parse(ssl_post(url, post_data(action, parameters)))
|
339
339
|
|
340
|
-
Response.new(
|
340
|
+
Response.new(
|
341
|
+
successful?(response),
|
342
|
+
message_from(response),
|
343
|
+
response,
|
341
344
|
test: test?,
|
342
|
-
authorization: response[:transaction_id] || parameters[:transaction_id]
|
345
|
+
authorization: response[:transaction_id] || parameters[:transaction_id]
|
346
|
+
)
|
343
347
|
end
|
344
348
|
|
345
349
|
def successful?(response)
|
@@ -68,9 +68,13 @@ module ActiveMerchant #:nodoc:
|
|
68
68
|
def commit(action, money, parameters)
|
69
69
|
response = parse(ssl_post(self.live_url, post_data(action, parameters)))
|
70
70
|
|
71
|
-
Response.new(
|
71
|
+
Response.new(
|
72
|
+
successful?(response),
|
73
|
+
message_from(response),
|
74
|
+
response,
|
72
75
|
test: test_response?(response),
|
73
|
-
authorization: authorization_from(response)
|
76
|
+
authorization: authorization_from(response)
|
77
|
+
)
|
74
78
|
end
|
75
79
|
|
76
80
|
def successful?(response)
|
@@ -1,7 +1,7 @@
|
|
1
1
|
module ActiveMerchant #:nodoc:
|
2
2
|
module Billing #:nodoc:
|
3
3
|
class PayTraceGateway < Gateway
|
4
|
-
self.test_url = 'https://api.paytrace.com'
|
4
|
+
self.test_url = 'https://api.sandbox.paytrace.com'
|
5
5
|
self.live_url = 'https://api.paytrace.com'
|
6
6
|
|
7
7
|
self.supported_countries = ['US']
|
@@ -46,7 +46,7 @@ module ActiveMerchant #:nodoc:
|
|
46
46
|
def initialize(options = {})
|
47
47
|
requires!(options, :username, :password, :integrator_id)
|
48
48
|
super
|
49
|
-
acquire_access_token
|
49
|
+
acquire_access_token unless options[:access_token]
|
50
50
|
end
|
51
51
|
|
52
52
|
def purchase(money, payment_or_customer_id, options = {})
|
@@ -169,28 +169,35 @@ module ActiveMerchant #:nodoc:
|
|
169
169
|
transcript.
|
170
170
|
gsub(%r((Authorization: Bearer )[a-zA-Z0-9:_]+), '\1[FILTERED]').
|
171
171
|
gsub(%r(("credit_card\\?":{\\?"number\\?":\\?")\d+), '\1[FILTERED]').
|
172
|
-
gsub(%r(("
|
172
|
+
gsub(%r(("csc\\?":\\?")\d+), '\1[FILTERED]').
|
173
173
|
gsub(%r(("username\\?":\\?")\w+@+\w+.+\w+), '\1[FILTERED]').
|
174
|
+
gsub(%r(("username\\?":\\?")\w+), '\1[FILTERED]').
|
174
175
|
gsub(%r(("password\\?":\\?")\w+), '\1[FILTERED]').
|
175
176
|
gsub(%r(("integrator_id\\?":\\?")\w+), '\1[FILTERED]')
|
176
177
|
end
|
177
178
|
|
178
179
|
def acquire_access_token
|
179
180
|
post = {}
|
181
|
+
base_url = (test? ? test_url : live_url)
|
180
182
|
post[:grant_type] = 'password'
|
181
183
|
post[:username] = @options[:username]
|
182
184
|
post[:password] = @options[:password]
|
183
185
|
data = post.collect { |key, value| "#{key}=#{CGI.escape(value.to_s)}" }.join('&')
|
184
|
-
url =
|
186
|
+
url = base_url + '/oauth/token'
|
185
187
|
oauth_headers = {
|
186
188
|
'Accept' => '*/*',
|
187
189
|
'Content-Type' => 'application/x-www-form-urlencoded'
|
188
190
|
}
|
189
191
|
response = ssl_post(url, data, oauth_headers)
|
190
|
-
json_response =
|
192
|
+
json_response = parse(response)
|
191
193
|
|
192
|
-
|
193
|
-
|
194
|
+
if json_response.include?('error')
|
195
|
+
oauth_response = Response.new(false, json_response['error_description'])
|
196
|
+
raise OAuthResponseError.new(oauth_response)
|
197
|
+
else
|
198
|
+
@options[:access_token] = json_response['access_token'] if json_response['access_token']
|
199
|
+
response
|
200
|
+
end
|
194
201
|
end
|
195
202
|
|
196
203
|
private
|
@@ -237,11 +244,11 @@ module ActiveMerchant #:nodoc:
|
|
237
244
|
end
|
238
245
|
|
239
246
|
def customer_id?(payment_or_customer_id)
|
240
|
-
payment_or_customer_id.
|
247
|
+
payment_or_customer_id.instance_of?(String)
|
241
248
|
end
|
242
249
|
|
243
250
|
def string_literal_to_boolean(value)
|
244
|
-
return value unless value.
|
251
|
+
return value unless value.instance_of?(String)
|
245
252
|
|
246
253
|
if value.casecmp('true').zero?
|
247
254
|
true
|
@@ -258,15 +265,16 @@ module ActiveMerchant #:nodoc:
|
|
258
265
|
end
|
259
266
|
|
260
267
|
def add_address(post, creditcard, options)
|
261
|
-
return unless options[:billing_address] || options[:address]
|
262
|
-
|
263
|
-
address = options[:billing_address] || options[:address]
|
264
268
|
post[:billing_address] = {}
|
269
|
+
|
270
|
+
if (address = options[:billing_address] || options[:address])
|
271
|
+
post[:billing_address][:street_address] = address[:address1]
|
272
|
+
post[:billing_address][:city] = address[:city]
|
273
|
+
post[:billing_address][:state] = address[:state]
|
274
|
+
post[:billing_address][:zip] = address[:zip]
|
275
|
+
end
|
276
|
+
|
265
277
|
post[:billing_address][:name] = creditcard.name
|
266
|
-
post[:billing_address][:street_address] = address[:address1]
|
267
|
-
post[:billing_address][:city] = address[:city]
|
268
|
-
post[:billing_address][:state] = address[:state]
|
269
|
-
post[:billing_address][:zip] = address[:zip]
|
270
278
|
end
|
271
279
|
|
272
280
|
def add_amount(post, money, options)
|
@@ -283,6 +291,7 @@ module ActiveMerchant #:nodoc:
|
|
283
291
|
post[:credit_card][:number] = payment.number
|
284
292
|
post[:credit_card][:expiration_month] = payment.month
|
285
293
|
post[:credit_card][:expiration_year] = payment.year
|
294
|
+
post[:csc] = payment.verification_value
|
286
295
|
end
|
287
296
|
end
|
288
297
|
|
@@ -373,6 +382,12 @@ module ActiveMerchant #:nodoc:
|
|
373
382
|
url = base_url + '/v1/' + action
|
374
383
|
raw_response = ssl_post(url, post_data(parameters), headers)
|
375
384
|
response = parse(raw_response)
|
385
|
+
handle_final_response(action, response)
|
386
|
+
rescue JSON::ParserError
|
387
|
+
unparsable_response(raw_response)
|
388
|
+
end
|
389
|
+
|
390
|
+
def handle_final_response(action, response)
|
376
391
|
success = success_from(response)
|
377
392
|
|
378
393
|
Response.new(
|
@@ -385,8 +400,6 @@ module ActiveMerchant #:nodoc:
|
|
385
400
|
test: test?,
|
386
401
|
error_code: success ? nil : error_code_from(response)
|
387
402
|
)
|
388
|
-
rescue JSON::ParserError
|
389
|
-
unparsable_response(raw_response)
|
390
403
|
end
|
391
404
|
|
392
405
|
def unparsable_response(raw_response)
|
@@ -35,6 +35,8 @@ module ActiveMerchant
|
|
35
35
|
|
36
36
|
add_invoice(params, options)
|
37
37
|
add_reversal_id(params, options)
|
38
|
+
add_customer_ref(params, options)
|
39
|
+
add_reference_3(params, options)
|
38
40
|
add_payment_method(params, payment_method, options)
|
39
41
|
add_address(params, options)
|
40
42
|
add_amount(params, amount, options)
|
@@ -51,6 +53,8 @@ module ActiveMerchant
|
|
51
53
|
|
52
54
|
add_invoice(params, options)
|
53
55
|
add_reversal_id(params, options)
|
56
|
+
add_customer_ref(params, options)
|
57
|
+
add_reference_3(params, options)
|
54
58
|
add_payment_method(params, payment_method, options)
|
55
59
|
add_address(params, options)
|
56
60
|
add_amount(params, amount, options)
|
@@ -170,6 +174,14 @@ module ActiveMerchant
|
|
170
174
|
params[:reversal_id] = options[:reversal_id] if options[:reversal_id]
|
171
175
|
end
|
172
176
|
|
177
|
+
def add_customer_ref(params, options)
|
178
|
+
params[:customer_ref] = options[:customer_ref] if options[:customer_ref]
|
179
|
+
end
|
180
|
+
|
181
|
+
def add_reference_3(params, options)
|
182
|
+
params[:reference_3] = options[:reference_3] if options[:reference_3]
|
183
|
+
end
|
184
|
+
|
173
185
|
def amount_from_authorization(authorization)
|
174
186
|
authorization.split('|').last.to_i
|
175
187
|
end
|
@@ -192,7 +204,7 @@ module ActiveMerchant
|
|
192
204
|
params[:apikey] = @options[:apikey]
|
193
205
|
params[:ta_token] = options[:ta_token]
|
194
206
|
params[:type] = 'FDToken'
|
195
|
-
params[:credit_card] = add_card_data(payment_method)
|
207
|
+
params[:credit_card] = add_card_data(payment_method, options)
|
196
208
|
params[:auth] = 'false'
|
197
209
|
end
|
198
210
|
|
@@ -208,7 +220,7 @@ module ActiveMerchant
|
|
208
220
|
elsif payment_method.is_a? NetworkTokenizationCreditCard
|
209
221
|
add_network_tokenization(params, payment_method, options)
|
210
222
|
else
|
211
|
-
add_creditcard(params, payment_method)
|
223
|
+
add_creditcard(params, payment_method, options)
|
212
224
|
end
|
213
225
|
end
|
214
226
|
|
@@ -245,17 +257,17 @@ module ActiveMerchant
|
|
245
257
|
params[:token] = token
|
246
258
|
end
|
247
259
|
|
248
|
-
def add_creditcard(params, creditcard)
|
249
|
-
credit_card = add_card_data(creditcard)
|
260
|
+
def add_creditcard(params, creditcard, options)
|
261
|
+
credit_card = add_card_data(creditcard, options)
|
250
262
|
|
251
263
|
params[:method] = 'credit_card'
|
252
264
|
params[:credit_card] = credit_card
|
253
265
|
end
|
254
266
|
|
255
|
-
def add_card_data(payment_method)
|
267
|
+
def add_card_data(payment_method, options = {})
|
256
268
|
card = {}
|
257
269
|
card[:type] = CREDIT_CARD_BRAND[payment_method.brand]
|
258
|
-
card[:cardholder_name] = payment_method
|
270
|
+
card[:cardholder_name] = name_from_payment_method(payment_method) || name_from_address(options)
|
259
271
|
card[:card_number] = payment_method.number
|
260
272
|
card[:exp_date] = format_exp_date(payment_method.month, payment_method.year)
|
261
273
|
card[:cvv] = payment_method.verification_value if payment_method.verification_value?
|
@@ -412,8 +424,7 @@ module ActiveMerchant
|
|
412
424
|
@options[:token],
|
413
425
|
payload
|
414
426
|
].join('')
|
415
|
-
|
416
|
-
hash
|
427
|
+
Base64.strict_encode64(OpenSSL::HMAC.hexdigest('sha256', @options[:apisecret], message))
|
417
428
|
end
|
418
429
|
|
419
430
|
def headers(payload)
|
@@ -385,11 +385,13 @@ module ActiveMerchant #:nodoc:
|
|
385
385
|
'Content-Length' => request.size.to_s
|
386
386
|
}
|
387
387
|
response = parse(ssl_post(url, request, headers))
|
388
|
-
Response.new(
|
388
|
+
Response.new(
|
389
|
+
success?(response),
|
389
390
|
message_from(response),
|
390
391
|
response,
|
391
392
|
test: test?,
|
392
|
-
authorization: build_authorization(response)
|
393
|
+
authorization: build_authorization(response)
|
394
|
+
)
|
393
395
|
end
|
394
396
|
|
395
397
|
def build_authorization(response)
|
@@ -99,7 +99,7 @@ module ActiveMerchant #:nodoc:
|
|
99
99
|
end
|
100
100
|
xml.tag! 'RequestAuth' do
|
101
101
|
xml.tag! 'UserPass' do
|
102
|
-
xml.tag! 'User',
|
102
|
+
xml.tag! 'User', @options[:user].blank? ? @options[:login] : @options[:user]
|
103
103
|
xml.tag! 'Password', @options[:password]
|
104
104
|
end
|
105
105
|
end
|
@@ -192,9 +192,7 @@ module ActiveMerchant #:nodoc:
|
|
192
192
|
xml.tag! 'TotalAmt', amount(money), 'Currency' => options[:currency] || currency(money)
|
193
193
|
end
|
194
194
|
|
195
|
-
if %i(authorization purchase).include?
|
196
|
-
add_mpi_3ds(xml, options[:three_d_secure]) if options[:three_d_secure]
|
197
|
-
end
|
195
|
+
add_mpi_3ds(xml, options[:three_d_secure]) if %i(authorization purchase).include?(action) && (options[:three_d_secure])
|
198
196
|
|
199
197
|
xml.tag! 'Tender' do
|
200
198
|
add_credit_card(xml, credit_card, options)
|
@@ -20,8 +20,8 @@ module ActiveMerchant #:nodoc:
|
|
20
20
|
self.homepage_url = 'https://www.windcave.com/'
|
21
21
|
self.display_name = 'Windcave (formerly PaymentExpress)'
|
22
22
|
|
23
|
-
self.live_url = 'https://sec.
|
24
|
-
self.test_url = 'https://uat.
|
23
|
+
self.live_url = 'https://sec.windcave.com/pxpost.aspx'
|
24
|
+
self.test_url = 'https://uat.windcave.com/pxpost.aspx'
|
25
25
|
|
26
26
|
APPROVED = '1'
|
27
27
|
|
@@ -306,9 +306,13 @@ module ActiveMerchant #:nodoc:
|
|
306
306
|
response = parse(ssl_post(url, request.to_s))
|
307
307
|
|
308
308
|
# Return a response
|
309
|
-
PaymentExpressResponse.new(
|
309
|
+
PaymentExpressResponse.new(
|
310
|
+
response[:success] == APPROVED,
|
311
|
+
message_from(response),
|
312
|
+
response,
|
310
313
|
test: response[:test_mode] == '1',
|
311
|
-
authorization: authorization_from(action, response)
|
314
|
+
authorization: authorization_from(action, response)
|
315
|
+
)
|
312
316
|
end
|
313
317
|
|
314
318
|
# Response XML documentation: http://www.paymentexpress.com/technical_resources/ecommerce_nonhosted/pxpost.html#XMLTxnOutput
|
@@ -34,7 +34,7 @@ module ActiveMerchant #:nodoc:
|
|
34
34
|
28 => :card_declined
|
35
35
|
}.freeze
|
36
36
|
|
37
|
-
SUCCESS_STATUS = ['
|
37
|
+
SUCCESS_STATUS = ['APPROVED', 'PENDING', 'pending', 'success', 1, 0]
|
38
38
|
|
39
39
|
CARD_MAPPING = {
|
40
40
|
'visa' => 'vi',
|
@@ -218,7 +218,7 @@ module ActiveMerchant #:nodoc:
|
|
218
218
|
xid: three_d_secure_options[:xid],
|
219
219
|
eci: three_d_secure_options[:eci],
|
220
220
|
version: three_d_secure_options[:version],
|
221
|
-
reference_id: three_d_secure_options[:
|
221
|
+
reference_id: three_d_secure_options[:ds_transaction_id],
|
222
222
|
status: three_d_secure_options[:authentication_response_status] || three_d_secure_options[:directory_response_status]
|
223
223
|
}.compact
|
224
224
|
|
@@ -237,14 +237,14 @@ module ActiveMerchant #:nodoc:
|
|
237
237
|
|
238
238
|
def commit_raw(object, action, parameters)
|
239
239
|
if action == 'inquire'
|
240
|
-
url = "#{
|
240
|
+
url = "#{test? ? test_url : live_url}#{object}/#{parameters}"
|
241
241
|
begin
|
242
242
|
raw_response = ssl_get(url, headers)
|
243
243
|
rescue ResponseError => e
|
244
244
|
raw_response = e.response.body
|
245
245
|
end
|
246
246
|
else
|
247
|
-
url = "#{
|
247
|
+
url = "#{test? ? test_url : live_url}#{object}/#{action}"
|
248
248
|
begin
|
249
249
|
raw_response = ssl_post(url, post_data(parameters), headers)
|
250
250
|
rescue ResponseError => e
|
@@ -262,7 +262,7 @@ module ActiveMerchant #:nodoc:
|
|
262
262
|
def commit_transaction(action, parameters)
|
263
263
|
response = commit_raw('transaction', action, parameters)
|
264
264
|
Response.new(
|
265
|
-
success_from(response),
|
265
|
+
success_from(response, action),
|
266
266
|
message_from(response),
|
267
267
|
response,
|
268
268
|
authorization: authorization_from(response),
|
@@ -290,10 +290,22 @@ module ActiveMerchant #:nodoc:
|
|
290
290
|
}
|
291
291
|
end
|
292
292
|
|
293
|
-
def success_from(response)
|
294
|
-
|
293
|
+
def success_from(response, action = nil)
|
294
|
+
transaction_current_status = response.dig('transaction', 'current_status')
|
295
|
+
request_status = response['status']
|
296
|
+
transaction_status = response.dig('transaction', 'status')
|
297
|
+
default_response = SUCCESS_STATUS.include?(transaction_current_status || request_status || transaction_status)
|
295
298
|
|
296
|
-
|
299
|
+
case action
|
300
|
+
when 'refund'
|
301
|
+
if transaction_current_status && request_status
|
302
|
+
transaction_current_status&.upcase == 'CANCELLED' && request_status&.downcase == 'success'
|
303
|
+
else
|
304
|
+
default_response
|
305
|
+
end
|
306
|
+
else
|
307
|
+
default_response
|
308
|
+
end
|
297
309
|
end
|
298
310
|
|
299
311
|
def card_success_from(response)
|
@@ -314,10 +326,10 @@ module ActiveMerchant #:nodoc:
|
|
314
326
|
end
|
315
327
|
|
316
328
|
def card_message_from(response)
|
317
|
-
if
|
318
|
-
response['message'] || response['card']['message']
|
319
|
-
else
|
329
|
+
if response.include?('error')
|
320
330
|
response['error']['type']
|
331
|
+
else
|
332
|
+
response['message'] || response['card']['message']
|
321
333
|
end
|
322
334
|
end
|
323
335
|
|
@@ -124,12 +124,13 @@ module ActiveMerchant #:nodoc:
|
|
124
124
|
return unless address = options[:billing_address] || options[:address]
|
125
125
|
|
126
126
|
post[:billingDetails] = {}
|
127
|
-
post[:billingDetails][:street] = address[:address1]
|
128
|
-
post[:billingDetails][:
|
129
|
-
post[:billingDetails][:
|
127
|
+
post[:billingDetails][:street] = truncate(address[:address1], 50)
|
128
|
+
post[:billingDetails][:street2] = truncate(address[:address2], 50)
|
129
|
+
post[:billingDetails][:city] = truncate(address[:city], 40)
|
130
|
+
post[:billingDetails][:state] = truncate(address[:state], 40)
|
130
131
|
post[:billingDetails][:country] = address[:country]
|
131
|
-
post[:billingDetails][:zip] = address[:zip]
|
132
|
-
post[:billingDetails][:phone] = address[:phone]
|
132
|
+
post[:billingDetails][:zip] = truncate(address[:zip], 10)
|
133
|
+
post[:billingDetails][:phone] = truncate(address[:phone], 40)
|
133
134
|
end
|
134
135
|
|
135
136
|
# The add_address_for_vaulting method is applicable to the store method, as the APIs address
|
@@ -138,12 +139,12 @@ module ActiveMerchant #:nodoc:
|
|
138
139
|
return unless address = options[:billing_address] || options[:address]
|
139
140
|
|
140
141
|
post[:card][:billingAddress] = {}
|
141
|
-
post[:card][:billingAddress][:street] = address[:address1]
|
142
|
-
post[:card][:billingAddress][:street2] = address[:address2]
|
143
|
-
post[:card][:billingAddress][:city] = address[:city]
|
144
|
-
post[:card][:billingAddress][:zip] = address[:zip]
|
142
|
+
post[:card][:billingAddress][:street] = truncate(address[:address1], 50)
|
143
|
+
post[:card][:billingAddress][:street2] = truncate(address[:address2], 50)
|
144
|
+
post[:card][:billingAddress][:city] = truncate(address[:city], 40)
|
145
|
+
post[:card][:billingAddress][:zip] = truncate(address[:zip], 10)
|
145
146
|
post[:card][:billingAddress][:country] = address[:country]
|
146
|
-
post[:card][:billingAddress][:state] = address[:state] if address[:state]
|
147
|
+
post[:card][:billingAddress][:state] = truncate(address[:state], 40) if address[:state]
|
147
148
|
end
|
148
149
|
|
149
150
|
# This data is specific to creating a profile at the gateway's vault level
|
@@ -401,7 +402,7 @@ module ActiveMerchant #:nodoc:
|
|
401
402
|
def post_data(parameters = {}, options = {})
|
402
403
|
return unless parameters.present?
|
403
404
|
|
404
|
-
parameters[:merchantRefNum] = options[:merchant_ref_num] || SecureRandom.hex(16).to_s
|
405
|
+
parameters[:merchantRefNum] = options[:merchant_ref_num] || options[:order_id] || SecureRandom.hex(16).to_s
|
405
406
|
|
406
407
|
parameters.to_json
|
407
408
|
end
|
@@ -115,12 +115,16 @@ module ActiveMerchant #:nodoc:
|
|
115
115
|
|
116
116
|
message = message_from(response)
|
117
117
|
test_mode = (test? || message =~ /TESTMODE/)
|
118
|
-
Response.new(
|
118
|
+
Response.new(
|
119
|
+
success?(response),
|
120
|
+
message,
|
121
|
+
response,
|
119
122
|
test: test_mode,
|
120
123
|
authorization: response['transactionid'],
|
121
124
|
fraud_review: fraud_review?(response),
|
122
125
|
avs_result: { code: response['avsresponse'] },
|
123
|
-
cvv_result: response['cvvresponse']
|
126
|
+
cvv_result: response['cvvresponse']
|
127
|
+
)
|
124
128
|
end
|
125
129
|
|
126
130
|
def message_from(response)
|
@@ -151,8 +155,7 @@ module ActiveMerchant #:nodoc:
|
|
151
155
|
post[:password] = @options[:password]
|
152
156
|
post[:type] = action
|
153
157
|
|
154
|
-
|
155
|
-
request
|
158
|
+
post.merge(parameters).collect { |key, value| "#{key}=#{CGI.escape(value.to_s)}" }.join('&')
|
156
159
|
end
|
157
160
|
end
|
158
161
|
end
|
@@ -177,9 +177,13 @@ module ActiveMerchant #:nodoc:
|
|
177
177
|
response = parse(data)
|
178
178
|
message = message_from(response)
|
179
179
|
|
180
|
-
PaystationResponse.new(
|
181
|
-
|
182
|
-
|
180
|
+
PaystationResponse.new(
|
181
|
+
success?(response),
|
182
|
+
message,
|
183
|
+
response,
|
184
|
+
test: response[:tm]&.casecmp('t')&.zero?,
|
185
|
+
authorization: response[:paystation_transaction_id]
|
186
|
+
)
|
183
187
|
end
|
184
188
|
|
185
189
|
def success?(response)
|
@@ -192,9 +192,13 @@ module ActiveMerchant
|
|
192
192
|
|
193
193
|
success = (params[:summary_code] ? (params[:summary_code] == '0') : (params[:response_code] == '00'))
|
194
194
|
|
195
|
-
Response.new(
|
195
|
+
Response.new(
|
196
|
+
success,
|
197
|
+
message,
|
198
|
+
params,
|
196
199
|
test: (@options[:merchant].to_s == 'TEST'),
|
197
|
-
authorization: post[:order_number]
|
200
|
+
authorization: post[:order_number]
|
201
|
+
)
|
198
202
|
rescue ActiveMerchant::ResponseError => e
|
199
203
|
raise unless e.response.code == '403'
|
200
204
|
|
@@ -48,7 +48,7 @@ module ActiveMerchant #:nodoc:
|
|
48
48
|
'I5' => 'M', # +4 and Address Match
|
49
49
|
'I6' => 'W', # +4 Match
|
50
50
|
'I7' => 'A', # Address Match
|
51
|
-
'I8' => 'C'
|
51
|
+
'I8' => 'C' # No Match
|
52
52
|
}
|
53
53
|
|
54
54
|
PAYWAY_WS_SUCCESS = '5000'
|
@@ -224,7 +224,7 @@ module ActiveMerchant #:nodoc:
|
|
224
224
|
def error_code_from(response)
|
225
225
|
return '' if success_from(response)
|
226
226
|
|
227
|
-
error =
|
227
|
+
error = STANDARD_ERROR_CODE_MAPPING[response['paywayCode']].nil? ? STANDARD_ERROR_CODE[:processing_error] : STANDARD_ERROR_CODE_MAPPING[response['paywayCode']]
|
228
228
|
return error
|
229
229
|
end
|
230
230
|
|
@@ -31,6 +31,7 @@ module ActiveMerchant #:nodoc:
|
|
31
31
|
add_capture(post, options)
|
32
32
|
add_metadata(post, options)
|
33
33
|
add_3ds(post, options)
|
34
|
+
add_platform_adjustment(post, options)
|
34
35
|
|
35
36
|
commit(:post, 'charges', post, options)
|
36
37
|
end
|
@@ -81,6 +82,11 @@ module ActiveMerchant #:nodoc:
|
|
81
82
|
commit(:put, "charges/#{CGI.escape(token)}/void", {}, options)
|
82
83
|
end
|
83
84
|
|
85
|
+
# Verify a previously authorized charge.
|
86
|
+
def verify_3ds(session_token, options = {})
|
87
|
+
commit(:get, "/charges/verify?session_token=#{session_token}", nil, options)
|
88
|
+
end
|
89
|
+
|
84
90
|
# Updates the credit card for the customer.
|
85
91
|
def update(token, creditcard, options = {})
|
86
92
|
post = {}
|
@@ -175,13 +181,23 @@ module ActiveMerchant #:nodoc:
|
|
175
181
|
post[:metadata] = options[:metadata] if options[:metadata]
|
176
182
|
end
|
177
183
|
|
184
|
+
def add_platform_adjustment(post, options)
|
185
|
+
post[:platform_adjustment] = options[:platform_adjustment] if options[:platform_adjustment]
|
186
|
+
end
|
187
|
+
|
178
188
|
def add_3ds(post, options)
|
179
189
|
if options[:three_d_secure]
|
180
190
|
post[:three_d_secure] = {}
|
181
|
-
|
182
|
-
|
183
|
-
|
184
|
-
|
191
|
+
if options[:three_d_secure][:enabled]
|
192
|
+
post[:three_d_secure][:enabled] = true
|
193
|
+
post[:three_d_secure][:fallback_ok] = options[:three_d_secure][:fallback_ok] unless options[:three_d_secure][:fallback_ok].nil?
|
194
|
+
post[:three_d_secure][:callback_url] = options[:three_d_secure][:callback_url] if options[:three_d_secure][:callback_url]
|
195
|
+
else
|
196
|
+
post[:three_d_secure][:version] = options[:three_d_secure][:version] if options[:three_d_secure][:version]
|
197
|
+
post[:three_d_secure][:eci] = options[:three_d_secure][:eci] if options[:three_d_secure][:eci]
|
198
|
+
post[:three_d_secure][:cavv] = options[:three_d_secure][:cavv] if options[:three_d_secure][:cavv]
|
199
|
+
post[:three_d_secure][:transaction_id] = options[:three_d_secure][:ds_transaction_id] || options[:three_d_secure][:xid]
|
200
|
+
end
|
185
201
|
end
|
186
202
|
end
|
187
203
|
|
@@ -266,6 +282,8 @@ module ActiveMerchant #:nodoc:
|
|
266
282
|
end
|
267
283
|
|
268
284
|
def post_data(parameters = {})
|
285
|
+
return nil unless parameters
|
286
|
+
|
269
287
|
parameters.to_json
|
270
288
|
end
|
271
289
|
end
|