activemerchant 1.133.0 → 1.137.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
@@ -55,6 +55,7 @@ module ActiveMerchant #:nodoc:
|
|
55
55
|
add_invoice(post, money, options)
|
56
56
|
add_transaction_details(post, options, 'capture')
|
57
57
|
add_reference_transaction_details(post, authorization, options, :capture)
|
58
|
+
add_dynamic_descriptors(post, options)
|
58
59
|
|
59
60
|
commit('sale', post, options)
|
60
61
|
end
|
@@ -68,6 +69,15 @@ module ActiveMerchant #:nodoc:
|
|
68
69
|
commit('refund', post, options)
|
69
70
|
end
|
70
71
|
|
72
|
+
def credit(money, payment_method, options = {})
|
73
|
+
post = {}
|
74
|
+
add_invoice(post, money, options)
|
75
|
+
add_transaction_interaction(post, options)
|
76
|
+
add_payment(post, payment_method, options)
|
77
|
+
|
78
|
+
commit('refund', post, options)
|
79
|
+
end
|
80
|
+
|
71
81
|
def void(authorization, options = {})
|
72
82
|
post = {}
|
73
83
|
add_transaction_details(post, options)
|
@@ -102,6 +112,7 @@ module ActiveMerchant #:nodoc:
|
|
102
112
|
transcript.
|
103
113
|
gsub(%r((Authorization: )[a-zA-Z0-9+./=]+), '\1[FILTERED]').
|
104
114
|
gsub(%r((Api-Key: )\w+), '\1[FILTERED]').
|
115
|
+
gsub(%r(("apiKey\\?":\\?")\w+), '\1[FILTERED]').
|
105
116
|
gsub(%r(("cardData\\?":\\?")\d+), '\1[FILTERED]').
|
106
117
|
gsub(%r(("securityCode\\?":\\?")\d+), '\1[FILTERED]').
|
107
118
|
gsub(%r(("cavv\\?":\\?")\w+), '\1[FILTERED]')
|
@@ -109,6 +120,23 @@ module ActiveMerchant #:nodoc:
|
|
109
120
|
|
110
121
|
private
|
111
122
|
|
123
|
+
def add_three_d_secure(post, payment, options)
|
124
|
+
return unless three_d_secure = options[:three_d_secure]
|
125
|
+
|
126
|
+
post[:additionalData3DS] = {
|
127
|
+
dsTransactionId: three_d_secure[:ds_transaction_id],
|
128
|
+
authenticationStatus: three_d_secure[:authentication_response_status],
|
129
|
+
serviceProviderTransactionId: three_d_secure[:three_ds_server_trans_id],
|
130
|
+
acsTransactionId: three_d_secure[:acs_transaction_id],
|
131
|
+
mpiData: {
|
132
|
+
cavv: three_d_secure[:cavv],
|
133
|
+
eci: three_d_secure[:eci],
|
134
|
+
xid: three_d_secure[:xid]
|
135
|
+
}.compact,
|
136
|
+
versionData: { recommendedVersion: three_d_secure[:version] }
|
137
|
+
}.compact
|
138
|
+
end
|
139
|
+
|
112
140
|
def add_transaction_interaction(post, options)
|
113
141
|
post[:transactionInteraction] = {}
|
114
142
|
post[:transactionInteraction][:origin] = options[:origin] || 'ECOM'
|
@@ -144,10 +172,7 @@ module ActiveMerchant #:nodoc:
|
|
144
172
|
return unless billing = options[:billing_address]
|
145
173
|
|
146
174
|
billing_address = {}
|
147
|
-
|
148
|
-
billing_address[:firstName] = payment.first_name if payment.first_name
|
149
|
-
billing_address[:lastName] = payment.last_name if payment.last_name
|
150
|
-
end
|
175
|
+
name_from_address(billing_address, billing) || name_from_payment(billing_address, payment)
|
151
176
|
address = {}
|
152
177
|
address[:street] = billing[:address1] if billing[:address1]
|
153
178
|
address[:houseNumberOrName] = billing[:address2] if billing[:address2]
|
@@ -165,6 +190,22 @@ module ActiveMerchant #:nodoc:
|
|
165
190
|
post[:billingAddress] = billing_address
|
166
191
|
end
|
167
192
|
|
193
|
+
def name_from_payment(billing_address, payment)
|
194
|
+
return unless payment.respond_to?(:first_name) && payment.respond_to?(:last_name)
|
195
|
+
|
196
|
+
billing_address[:firstName] = payment.first_name if payment.first_name
|
197
|
+
billing_address[:lastName] = payment.last_name if payment.last_name
|
198
|
+
end
|
199
|
+
|
200
|
+
def name_from_address(billing_address, billing)
|
201
|
+
return unless address = billing
|
202
|
+
|
203
|
+
first_name, last_name = split_names(address[:name]) if address[:name]
|
204
|
+
|
205
|
+
billing_address[:firstName] = first_name if first_name
|
206
|
+
billing_address[:lastName] = last_name if last_name
|
207
|
+
end
|
208
|
+
|
168
209
|
def add_shipping_address(post, options)
|
169
210
|
return unless shipping = options[:shipping_address]
|
170
211
|
|
@@ -187,12 +228,28 @@ module ActiveMerchant #:nodoc:
|
|
187
228
|
end
|
188
229
|
|
189
230
|
def build_purchase_and_auth_request(post, money, payment, options)
|
231
|
+
add_three_d_secure(post, payment, options)
|
190
232
|
add_invoice(post, money, options)
|
191
233
|
add_payment(post, payment, options)
|
192
234
|
add_stored_credentials(post, options)
|
193
235
|
add_transaction_interaction(post, options)
|
194
236
|
add_billing_address(post, payment, options)
|
195
237
|
add_shipping_address(post, options)
|
238
|
+
add_dynamic_descriptors(post, options)
|
239
|
+
end
|
240
|
+
|
241
|
+
def add_dynamic_descriptors(post, options)
|
242
|
+
dynamic_descriptors_fields = %i[mcc merchant_name customer_service_number service_entitlement dynamic_descriptors_address]
|
243
|
+
return unless dynamic_descriptors_fields.any? { |key| options.include?(key) }
|
244
|
+
|
245
|
+
dynamic_descriptors = {}
|
246
|
+
dynamic_descriptors[:mcc] = options[:mcc] if options[:mcc]
|
247
|
+
dynamic_descriptors[:merchantName] = options[:merchant_name] if options[:merchant_name]
|
248
|
+
dynamic_descriptors[:customerServiceNumber] = options[:customer_service_number] if options[:customer_service_number]
|
249
|
+
dynamic_descriptors[:serviceEntitlement] = options[:service_entitlement] if options[:service_entitlement]
|
250
|
+
dynamic_descriptors[:address] = options[:dynamic_descriptors_address] if options[:dynamic_descriptors_address]
|
251
|
+
|
252
|
+
post[:dynamicDescriptors] = dynamic_descriptors
|
196
253
|
end
|
197
254
|
|
198
255
|
def add_reference_transaction_details(post, authorization, options, action = nil)
|
@@ -282,7 +339,7 @@ module ActiveMerchant #:nodoc:
|
|
282
339
|
raw_signature = @options[:api_key] + client_request_id.to_s + time + request
|
283
340
|
hmac = OpenSSL::HMAC.digest('sha256', @options[:api_secret], raw_signature)
|
284
341
|
signature = Base64.strict_encode64(hmac.to_s).to_s
|
285
|
-
|
342
|
+
custom_headers = options.fetch(:headers_identifiers, {})
|
286
343
|
{
|
287
344
|
'Client-Request-Id' => client_request_id,
|
288
345
|
'Api-Key' => @options[:api_key],
|
@@ -292,7 +349,7 @@ module ActiveMerchant #:nodoc:
|
|
292
349
|
'Content-Type' => 'application/json',
|
293
350
|
'Accept' => 'application/json',
|
294
351
|
'Authorization' => signature
|
295
|
-
}
|
352
|
+
}.merge!(custom_headers)
|
296
353
|
end
|
297
354
|
|
298
355
|
def add_merchant_details(post)
|
@@ -254,9 +254,7 @@ module ActiveMerchant #:nodoc:
|
|
254
254
|
normalized_value = normalize(value)
|
255
255
|
next if normalized_value.nil?
|
256
256
|
|
257
|
-
if key == :'3ds_homephonecountry'
|
258
|
-
next unless options[:billing_address] && options[:billing_address][:phone]
|
259
|
-
end
|
257
|
+
next if key == :'3ds_homephonecountry' && !(options[:billing_address] && options[:billing_address][:phone])
|
260
258
|
|
261
259
|
post[key] = normalized_value unless post[key]
|
262
260
|
end
|
@@ -417,7 +415,7 @@ module ActiveMerchant #:nodoc:
|
|
417
415
|
three_d_secure_options[:eci],
|
418
416
|
three_d_secure_options[:cavv]
|
419
417
|
)
|
420
|
-
post[:'3ds_version'] = three_d_secure_options[:version]
|
418
|
+
post[:'3ds_version'] = three_d_secure_options[:version] == '2' ? '2.0' : three_d_secure_options[:version]
|
421
419
|
post[:'3ds_dstrxid'] = three_d_secure_options[:ds_transaction_id]
|
422
420
|
end
|
423
421
|
|
@@ -507,7 +505,7 @@ module ActiveMerchant #:nodoc:
|
|
507
505
|
end
|
508
506
|
|
509
507
|
def parse(body)
|
510
|
-
|
508
|
+
CGI::parse(body).map { |k, v| [k.upcase, v.first] }.to_h
|
511
509
|
end
|
512
510
|
|
513
511
|
def success_from(response)
|
@@ -33,6 +33,15 @@ module ActiveMerchant #:nodoc:
|
|
33
33
|
discover: 'pb',
|
34
34
|
diners_club: 'pb'
|
35
35
|
}.freeze
|
36
|
+
THREEDS_EXEMPTIONS = {
|
37
|
+
authentication_outage: 'authenticationOutageExemptionIndicator',
|
38
|
+
corporate_card: 'secureCorporatePaymentIndicator',
|
39
|
+
delegated_authentication: 'delegatedAuthenticationExemptionIndicator',
|
40
|
+
low_risk: 'riskAnalysisExemptionIndicator',
|
41
|
+
low_value: 'lowValueExemptionIndicator',
|
42
|
+
stored_credential: 'stored_credential',
|
43
|
+
trusted_merchant: 'trustedMerchantExemptionIndicator'
|
44
|
+
}
|
36
45
|
DEFAULT_COLLECTION_INDICATOR = 2
|
37
46
|
|
38
47
|
self.supported_cardtypes = %i[visa master american_express discover diners_club jcb dankort maestro elo]
|
@@ -53,7 +62,8 @@ module ActiveMerchant #:nodoc:
|
|
53
62
|
jcb: '007',
|
54
63
|
dankort: '034',
|
55
64
|
maestro: '042',
|
56
|
-
elo: '054'
|
65
|
+
elo: '054',
|
66
|
+
carnet: '058'
|
57
67
|
}
|
58
68
|
|
59
69
|
@@decision_codes = {
|
@@ -132,11 +142,16 @@ module ActiveMerchant #:nodoc:
|
|
132
142
|
r703: 'Export hostname_country/ip_country match'
|
133
143
|
}
|
134
144
|
|
135
|
-
@@
|
145
|
+
@@wallet_payment_solution = {
|
136
146
|
apple_pay: '001',
|
137
147
|
google_pay: '012'
|
138
148
|
}
|
139
149
|
|
150
|
+
NT_PAYMENT_SOLUTION = {
|
151
|
+
'master' => '014',
|
152
|
+
'visa' => '015'
|
153
|
+
}
|
154
|
+
|
140
155
|
# These are the options that can be used when creating a new CyberSource
|
141
156
|
# Gateway object.
|
142
157
|
#
|
@@ -161,9 +176,15 @@ module ActiveMerchant #:nodoc:
|
|
161
176
|
super
|
162
177
|
end
|
163
178
|
|
164
|
-
def authorize(money,
|
165
|
-
|
166
|
-
|
179
|
+
def authorize(money, payment_method, options = {})
|
180
|
+
if valid_payment_method?(payment_method)
|
181
|
+
setup_address_hash(options)
|
182
|
+
commit(build_auth_request(money, payment_method, options), :authorize, money, options)
|
183
|
+
else
|
184
|
+
# this is for NetworkToken, ApplePay or GooglePay brands that aren't supported at CyberSource
|
185
|
+
payment_type = payment_method.source.to_s.gsub('_', ' ').titleize.gsub(' ', '')
|
186
|
+
Response.new(false, "#{card_brand(payment_method).capitalize} is not supported by #{payment_type} at CyberSource, check https://developer.cybersource.com/docs/cybs/en-us/payments/developer/all/rest/payments/CreatingOnlineAuth/CreatingAuthReqPNT.html")
|
187
|
+
end
|
167
188
|
end
|
168
189
|
|
169
190
|
def capture(money, authorization, options = {})
|
@@ -171,9 +192,15 @@ module ActiveMerchant #:nodoc:
|
|
171
192
|
commit(build_capture_request(money, authorization, options), :capture, money, options)
|
172
193
|
end
|
173
194
|
|
174
|
-
def purchase(money,
|
175
|
-
|
176
|
-
|
195
|
+
def purchase(money, payment_method, options = {})
|
196
|
+
if valid_payment_method?(payment_method)
|
197
|
+
setup_address_hash(options)
|
198
|
+
commit(build_purchase_request(money, payment_method, options), :purchase, money, options)
|
199
|
+
else
|
200
|
+
# this is for NetworkToken, ApplePay or GooglePay brands that aren't supported at CyberSource
|
201
|
+
payment_type = payment_method.source.to_s.gsub('_', ' ').titleize.gsub(' ', '')
|
202
|
+
Response.new(false, "#{card_brand(payment_method).capitalize} is not supported by #{payment_type} at CyberSource, check https://developer.cybersource.com/docs/cybs/en-us/payments/developer/all/rest/payments/CreatingOnlineAuth/CreatingAuthReqPNT.html")
|
203
|
+
end
|
177
204
|
end
|
178
205
|
|
179
206
|
def void(identification, options = {})
|
@@ -206,8 +233,14 @@ module ActiveMerchant #:nodoc:
|
|
206
233
|
# To charge the card while creating a profile, pass
|
207
234
|
# options[:setup_fee] => money
|
208
235
|
def store(payment_method, options = {})
|
209
|
-
|
210
|
-
|
236
|
+
if valid_payment_method?(payment_method)
|
237
|
+
setup_address_hash(options)
|
238
|
+
commit(build_create_subscription_request(payment_method, options), :store, nil, options)
|
239
|
+
else
|
240
|
+
# this is for NetworkToken, ApplePay or GooglePay brands that aren't supported at CyberSource
|
241
|
+
payment_type = payment_method.source.to_s.gsub('_', ' ').titleize.gsub(' ', '')
|
242
|
+
Response.new(false, "#{card_brand(payment_method).capitalize} is not supported by #{payment_type} at CyberSource, check https://developer.cybersource.com/docs/cybs/en-us/payments/developer/all/rest/payments/CreatingOnlineAuth/CreatingAuthReqPNT.html")
|
243
|
+
end
|
211
244
|
end
|
212
245
|
|
213
246
|
# Updates a customer subscription/profile
|
@@ -272,6 +305,8 @@ module ActiveMerchant #:nodoc:
|
|
272
305
|
gsub(%r((<cvNumber>)[^<]*(</cvNumber>))i, '\1[FILTERED]\2').
|
273
306
|
gsub(%r((<cavv>)[^<]*(</cavv>))i, '\1[FILTERED]\2').
|
274
307
|
gsub(%r((<xid>)[^<]*(</xid>))i, '\1[FILTERED]\2').
|
308
|
+
gsub(%r((<networkTokenCryptogram>)[^<]*(</networkTokenCryptogram>))i, '\1[FILTERED]\2').
|
309
|
+
gsub(%r((<requestorID>)[^<]*(</requestorID>))i, '\1[FILTERED]\2').
|
275
310
|
gsub(%r((<authenticationData>)[^<]*(</authenticationData>))i, '\1[FILTERED]\2')
|
276
311
|
end
|
277
312
|
|
@@ -286,6 +321,12 @@ module ActiveMerchant #:nodoc:
|
|
286
321
|
|
287
322
|
private
|
288
323
|
|
324
|
+
def valid_payment_method?(payment_method)
|
325
|
+
return true unless payment_method.is_a?(NetworkTokenizationCreditCard)
|
326
|
+
|
327
|
+
%w(visa master american_express).include?(card_brand(payment_method))
|
328
|
+
end
|
329
|
+
|
289
330
|
# Create all required address hash key value pairs
|
290
331
|
# If a value of nil is received, that value will be passed on to the gateway and will not be replaced with a default value
|
291
332
|
# Billing address fields received without an override value or with an empty string value will be replaced with the default_address values
|
@@ -317,17 +358,19 @@ module ActiveMerchant #:nodoc:
|
|
317
358
|
xml = Builder::XmlMarkup.new indent: 2
|
318
359
|
add_customer_id(xml, options)
|
319
360
|
add_payment_method_or_subscription(xml, money, creditcard_or_reference, options)
|
320
|
-
add_other_tax(xml, options)
|
321
361
|
add_threeds_2_ucaf_data(xml, creditcard_or_reference, options)
|
362
|
+
add_mastercard_network_tokenization_ucaf_data(xml, creditcard_or_reference, options)
|
322
363
|
add_decision_manager_fields(xml, options)
|
364
|
+
add_other_tax(xml, options)
|
323
365
|
add_mdd_fields(xml, options)
|
324
366
|
add_auth_service(xml, creditcard_or_reference, options)
|
367
|
+
add_capture_service_fields_with_run_false(xml, options)
|
325
368
|
add_threeds_services(xml, options)
|
326
369
|
add_business_rules_data(xml, creditcard_or_reference, options)
|
327
370
|
add_airline_data(xml, options)
|
328
371
|
add_sales_slip_number(xml, options)
|
329
|
-
add_payment_network_token(xml
|
330
|
-
add_payment_solution(xml, creditcard_or_reference
|
372
|
+
add_payment_network_token(xml, creditcard_or_reference, options)
|
373
|
+
add_payment_solution(xml, creditcard_or_reference)
|
331
374
|
add_tax_management_indicator(xml, options)
|
332
375
|
add_stored_credential_subsequent_auth(xml, options)
|
333
376
|
add_issuer_additional_data(xml, options)
|
@@ -380,9 +423,10 @@ module ActiveMerchant #:nodoc:
|
|
380
423
|
xml = Builder::XmlMarkup.new indent: 2
|
381
424
|
add_customer_id(xml, options)
|
382
425
|
add_payment_method_or_subscription(xml, money, payment_method_or_reference, options)
|
383
|
-
add_other_tax(xml, options)
|
384
426
|
add_threeds_2_ucaf_data(xml, payment_method_or_reference, options)
|
427
|
+
add_mastercard_network_tokenization_ucaf_data(xml, payment_method_or_reference, options)
|
385
428
|
add_decision_manager_fields(xml, options)
|
429
|
+
add_other_tax(xml, options)
|
386
430
|
add_mdd_fields(xml, options)
|
387
431
|
if (!payment_method_or_reference.is_a?(String) && card_brand(payment_method_or_reference) == 'check') || reference_is_a_check?(payment_method_or_reference)
|
388
432
|
add_check_service(xml)
|
@@ -398,8 +442,8 @@ module ActiveMerchant #:nodoc:
|
|
398
442
|
add_business_rules_data(xml, payment_method_or_reference, options)
|
399
443
|
add_airline_data(xml, options)
|
400
444
|
add_sales_slip_number(xml, options)
|
401
|
-
add_payment_network_token(xml
|
402
|
-
add_payment_solution(xml, payment_method_or_reference
|
445
|
+
add_payment_network_token(xml, payment_method_or_reference, options)
|
446
|
+
add_payment_solution(xml, payment_method_or_reference)
|
403
447
|
add_tax_management_indicator(xml, options)
|
404
448
|
add_stored_credential_subsequent_auth(xml, options)
|
405
449
|
add_issuer_additional_data(xml, options)
|
@@ -487,7 +531,7 @@ module ActiveMerchant #:nodoc:
|
|
487
531
|
add_check_service(xml)
|
488
532
|
else
|
489
533
|
add_purchase_service(xml, payment_method, options)
|
490
|
-
add_payment_network_token(xml
|
534
|
+
add_payment_network_token(xml, payment_method, options)
|
491
535
|
end
|
492
536
|
end
|
493
537
|
add_subscription_create_service(xml, options)
|
@@ -556,7 +600,7 @@ module ActiveMerchant #:nodoc:
|
|
556
600
|
end
|
557
601
|
|
558
602
|
def add_merchant_data(xml, options)
|
559
|
-
xml.tag! 'merchantID', @options[:login]
|
603
|
+
xml.tag! 'merchantID', options[:merchant_id] || @options[:login]
|
560
604
|
xml.tag! 'merchantReferenceCode', options[:order_id] || generate_unique_id
|
561
605
|
xml.tag! 'clientLibrary', 'Ruby Active Merchant'
|
562
606
|
xml.tag! 'clientLibraryVersion', VERSION
|
@@ -566,12 +610,24 @@ module ActiveMerchant #:nodoc:
|
|
566
610
|
end
|
567
611
|
|
568
612
|
def add_merchant_descriptor(xml, options)
|
569
|
-
return unless options[:merchant_descriptor] ||
|
613
|
+
return unless options[:merchant_descriptor] ||
|
614
|
+
options[:user_po] ||
|
615
|
+
options[:taxable] ||
|
616
|
+
options[:reference_data_code] ||
|
617
|
+
options[:invoice_number] ||
|
618
|
+
options[:merchant_descriptor_city] ||
|
619
|
+
options[:submerchant_id] ||
|
620
|
+
options[:merchant_descriptor_state] ||
|
621
|
+
options[:merchant_descriptor_country]
|
570
622
|
|
571
623
|
xml.tag! 'invoiceHeader' do
|
572
624
|
xml.tag! 'merchantDescriptor', options[:merchant_descriptor] if options[:merchant_descriptor]
|
625
|
+
xml.tag! 'merchantDescriptorCity', options[:merchant_descriptor_city] if options[:merchant_descriptor_city]
|
626
|
+
xml.tag! 'merchantDescriptorState', options[:merchant_descriptor_state] if options[:merchant_descriptor_state]
|
627
|
+
xml.tag! 'merchantDescriptorCountry', options[:merchant_descriptor_country] if options[:merchant_descriptor_country]
|
573
628
|
xml.tag! 'userPO', options[:user_po] if options[:user_po]
|
574
629
|
xml.tag! 'taxable', options[:taxable] if options[:taxable]
|
630
|
+
xml.tag! 'submerchantID', options[:submerchant_id] if options[:submerchant_id]
|
575
631
|
xml.tag! 'referenceDataCode', options[:reference_data_code] if options[:reference_data_code]
|
576
632
|
xml.tag! 'invoiceNumber', options[:invoice_number] if options[:invoice_number]
|
577
633
|
end
|
@@ -677,10 +733,16 @@ module ActiveMerchant #:nodoc:
|
|
677
733
|
end
|
678
734
|
end
|
679
735
|
|
680
|
-
def add_payment_solution(xml,
|
681
|
-
return unless (
|
736
|
+
def add_payment_solution(xml, payment_method)
|
737
|
+
return unless network_tokenization?(payment_method)
|
682
738
|
|
683
|
-
|
739
|
+
case payment_method.source
|
740
|
+
when :network_token
|
741
|
+
payment_solution = NT_PAYMENT_SOLUTION[payment_method.brand]
|
742
|
+
xml.tag! 'paymentSolution', payment_solution if payment_solution
|
743
|
+
when :apple_pay, :google_pay
|
744
|
+
xml.tag! 'paymentSolution', @@wallet_payment_solution[payment_method.source]
|
745
|
+
end
|
684
746
|
end
|
685
747
|
|
686
748
|
def add_issuer_additional_data(xml, options)
|
@@ -692,7 +754,7 @@ module ActiveMerchant #:nodoc:
|
|
692
754
|
end
|
693
755
|
|
694
756
|
def add_other_tax(xml, options)
|
695
|
-
return unless
|
757
|
+
return unless %i[vat_tax_rate local_tax_amount national_tax_amount national_tax_indicator].any? { |gsf| options.include?(gsf) }
|
696
758
|
|
697
759
|
xml.tag! 'otherTax' do
|
698
760
|
xml.tag! 'vatTaxRate', options[:vat_tax_rate] if options[:vat_tax_rate]
|
@@ -731,21 +793,39 @@ module ActiveMerchant #:nodoc:
|
|
731
793
|
|
732
794
|
def add_auth_service(xml, payment_method, options)
|
733
795
|
if network_tokenization?(payment_method)
|
734
|
-
|
796
|
+
if payment_method.source == :network_token
|
797
|
+
add_auth_network_tokenization(xml, payment_method, options)
|
798
|
+
else
|
799
|
+
add_auth_wallet(xml, payment_method, options)
|
800
|
+
end
|
735
801
|
else
|
736
802
|
xml.tag! 'ccAuthService', { 'run' => 'true' } do
|
737
803
|
if options[:three_d_secure]
|
738
804
|
add_normalized_threeds_2_data(xml, payment_method, options)
|
805
|
+
add_threeds_exemption_data(xml, options) if options[:three_ds_exemption_type]
|
739
806
|
else
|
740
807
|
indicator = options[:commerce_indicator] || stored_credential_commerce_indicator(options)
|
741
808
|
xml.tag!('commerceIndicator', indicator) if indicator
|
742
809
|
end
|
810
|
+
xml.tag!('aggregatorID', options[:aggregator_id]) if options[:aggregator_id]
|
743
811
|
xml.tag!('reconciliationID', options[:reconciliation_id]) if options[:reconciliation_id]
|
812
|
+
xml.tag!('firstRecurringPayment', options[:first_recurring_payment]) if options[:first_recurring_payment]
|
744
813
|
xml.tag!('mobileRemotePaymentType', options[:mobile_remote_payment_type]) if options[:mobile_remote_payment_type]
|
745
814
|
end
|
746
815
|
end
|
747
816
|
end
|
748
817
|
|
818
|
+
def add_threeds_exemption_data(xml, options)
|
819
|
+
return unless options[:three_ds_exemption_type]
|
820
|
+
|
821
|
+
exemption = options[:three_ds_exemption_type].to_sym
|
822
|
+
|
823
|
+
case exemption
|
824
|
+
when :authentication_outage, :corporate_card, :delegated_authentication, :low_risk, :low_value, :trusted_merchant
|
825
|
+
xml.tag!(THREEDS_EXEMPTIONS[exemption], '1')
|
826
|
+
end
|
827
|
+
end
|
828
|
+
|
749
829
|
def add_incremental_auth_service(xml, authorization, options)
|
750
830
|
xml.tag! 'ccIncrementalAuthService', { 'run' => 'true' } do
|
751
831
|
xml.tag! 'authRequestID', authorization
|
@@ -793,13 +873,15 @@ module ActiveMerchant #:nodoc:
|
|
793
873
|
end
|
794
874
|
|
795
875
|
def stored_credential_commerce_indicator(options)
|
796
|
-
return unless options
|
876
|
+
return unless (reason_type = options.dig(:stored_credential, :reason_type))
|
797
877
|
|
798
|
-
|
799
|
-
|
800
|
-
|
801
|
-
when '
|
802
|
-
|
878
|
+
case reason_type
|
879
|
+
when 'installment'
|
880
|
+
'install'
|
881
|
+
when 'recurring'
|
882
|
+
'recurring'
|
883
|
+
else
|
884
|
+
'internet'
|
803
885
|
end
|
804
886
|
end
|
805
887
|
|
@@ -807,26 +889,38 @@ module ActiveMerchant #:nodoc:
|
|
807
889
|
payment_method.is_a?(NetworkTokenizationCreditCard)
|
808
890
|
end
|
809
891
|
|
892
|
+
def subsequent_nt_apple_pay_auth(source, options)
|
893
|
+
return unless options[:stored_credential] || options[:stored_credential_overrides]
|
894
|
+
return unless @@wallet_payment_solution[source]
|
895
|
+
|
896
|
+
options.dig(:stored_credential_overrides, :subsequent_auth) || options.dig(:stored_credential, :initiator) == 'merchant'
|
897
|
+
end
|
898
|
+
|
810
899
|
def add_auth_network_tokenization(xml, payment_method, options)
|
811
|
-
|
900
|
+
commerce_indicator = stored_credential_commerce_indicator(options) || 'internet'
|
901
|
+
xml.tag! 'ccAuthService', { 'run' => 'true' } do
|
902
|
+
xml.tag!('networkTokenCryptogram', payment_method.payment_cryptogram)
|
903
|
+
xml.tag!('commerceIndicator', commerce_indicator)
|
904
|
+
xml.tag!('reconciliationID', options[:reconciliation_id]) if options[:reconciliation_id]
|
905
|
+
end
|
906
|
+
end
|
907
|
+
|
908
|
+
def add_auth_wallet(xml, payment_method, options)
|
909
|
+
commerce_indicator = 'internet' if subsequent_nt_apple_pay_auth(payment_method.source, options)
|
812
910
|
|
813
911
|
brand = card_brand(payment_method).to_sym
|
814
912
|
|
815
913
|
case brand
|
816
914
|
when :visa
|
817
915
|
xml.tag! 'ccAuthService', { 'run' => 'true' } do
|
818
|
-
xml.tag!('cavv', payment_method.payment_cryptogram)
|
819
|
-
xml.
|
820
|
-
xml.tag!('xid', payment_method.payment_cryptogram)
|
916
|
+
xml.tag!('cavv', payment_method.payment_cryptogram) unless commerce_indicator
|
917
|
+
xml.commerceIndicator commerce_indicator.nil? ? ECI_BRAND_MAPPING[brand] : commerce_indicator
|
918
|
+
xml.tag!('xid', payment_method.payment_cryptogram) unless commerce_indicator
|
821
919
|
xml.tag!('reconciliationID', options[:reconciliation_id]) if options[:reconciliation_id]
|
822
920
|
end
|
823
921
|
when :master
|
824
|
-
xml.tag! 'ucaf' do
|
825
|
-
xml.tag!('authenticationData', payment_method.payment_cryptogram)
|
826
|
-
xml.tag!('collectionIndicator', DEFAULT_COLLECTION_INDICATOR)
|
827
|
-
end
|
828
922
|
xml.tag! 'ccAuthService', { 'run' => 'true' } do
|
829
|
-
xml.
|
923
|
+
xml.commerceIndicator commerce_indicator.nil? ? ECI_BRAND_MAPPING[brand] : commerce_indicator
|
830
924
|
xml.tag!('reconciliationID', options[:reconciliation_id]) if options[:reconciliation_id]
|
831
925
|
end
|
832
926
|
when :american_express
|
@@ -837,14 +931,28 @@ module ActiveMerchant #:nodoc:
|
|
837
931
|
xml.tag!('xid', Base64.encode64(cryptogram[20...40])) if cryptogram.bytes.count > 20
|
838
932
|
xml.tag!('reconciliationID', options[:reconciliation_id]) if options[:reconciliation_id]
|
839
933
|
end
|
840
|
-
else
|
841
|
-
raise ArgumentError.new("Payment method #{brand} is not supported, check https://developer.cybersource.com/docs/cybs/en-us/payments/developer/all/rest/payments/CreatingOnlineAuth/CreatingAuthReqPNT.html")
|
842
934
|
end
|
843
935
|
end
|
844
936
|
|
845
|
-
def
|
937
|
+
def add_mastercard_network_tokenization_ucaf_data(xml, payment_method, options)
|
938
|
+
return unless network_tokenization?(payment_method) && card_brand(payment_method).to_sym == :master
|
939
|
+
return if payment_method.source == :network_token
|
940
|
+
|
941
|
+
commerce_indicator = 'internet' if subsequent_nt_apple_pay_auth(payment_method.source, options)
|
942
|
+
|
943
|
+
xml.tag! 'ucaf' do
|
944
|
+
xml.tag!('authenticationData', payment_method.payment_cryptogram) unless commerce_indicator
|
945
|
+
xml.tag!('collectionIndicator', DEFAULT_COLLECTION_INDICATOR)
|
946
|
+
end
|
947
|
+
end
|
948
|
+
|
949
|
+
def add_payment_network_token(xml, payment_method, options)
|
950
|
+
return unless network_tokenization?(payment_method)
|
951
|
+
|
952
|
+
transaction_type = payment_method.source == :network_token ? '3' : '1'
|
846
953
|
xml.tag! 'paymentNetworkToken' do
|
847
|
-
xml.tag!('
|
954
|
+
xml.tag!('requestorID', options[:trid]) if transaction_type == '3' && options[:trid]
|
955
|
+
xml.tag!('transactionType', transaction_type)
|
848
956
|
end
|
849
957
|
end
|
850
958
|
|
@@ -857,10 +965,19 @@ module ActiveMerchant #:nodoc:
|
|
857
965
|
end
|
858
966
|
end
|
859
967
|
|
968
|
+
def add_capture_service_fields_with_run_false(xml, options)
|
969
|
+
return unless options[:gratuity_amount]
|
970
|
+
|
971
|
+
xml.tag! 'ccCaptureService', { 'run' => 'false' } do
|
972
|
+
xml.tag! 'gratuityAmount', options[:gratuity_amount]
|
973
|
+
end
|
974
|
+
end
|
975
|
+
|
860
976
|
def add_purchase_service(xml, payment_method, options)
|
861
977
|
add_auth_service(xml, payment_method, options)
|
862
978
|
xml.tag! 'ccCaptureService', { 'run' => 'true' } do
|
863
979
|
xml.tag!('reconciliationID', options[:reconciliation_id]) if options[:reconciliation_id]
|
980
|
+
xml.tag!('gratuityAmount', options[:gratuity_amount]) if options[:gratuity_amount]
|
864
981
|
end
|
865
982
|
end
|
866
983
|
|
@@ -1003,9 +1120,9 @@ module ActiveMerchant #:nodoc:
|
|
1003
1120
|
def add_stored_credential_options(xml, options = {})
|
1004
1121
|
return unless options[:stored_credential] || options[:stored_credential_overrides]
|
1005
1122
|
|
1006
|
-
stored_credential_subsequent_auth_first = 'true' if options
|
1123
|
+
stored_credential_subsequent_auth_first = 'true' if cardholder_or_initiated_transaction?(options)
|
1007
1124
|
stored_credential_transaction_id = options.dig(:stored_credential, :network_transaction_id) if options.dig(:stored_credential, :initiator) == 'merchant'
|
1008
|
-
stored_credential_subsequent_auth_stored_cred = 'true' if options
|
1125
|
+
stored_credential_subsequent_auth_stored_cred = 'true' if subsequent_cardholder_initiated_transaction?(options) || unscheduled_merchant_initiated_transaction?(options) || threeds_stored_credential_exemption?(options)
|
1009
1126
|
|
1010
1127
|
override_subsequent_auth_first = options.dig(:stored_credential_overrides, :subsequent_auth_first)
|
1011
1128
|
override_subsequent_auth_transaction_id = options.dig(:stored_credential_overrides, :subsequent_auth_transaction_id)
|
@@ -1016,6 +1133,22 @@ module ActiveMerchant #:nodoc:
|
|
1016
1133
|
xml.subsequentAuthStoredCredential override_subsequent_auth_stored_cred.nil? ? stored_credential_subsequent_auth_stored_cred : override_subsequent_auth_stored_cred
|
1017
1134
|
end
|
1018
1135
|
|
1136
|
+
def cardholder_or_initiated_transaction?(options)
|
1137
|
+
options.dig(:stored_credential, :initiator) == 'cardholder' || options.dig(:stored_credential, :initial_transaction)
|
1138
|
+
end
|
1139
|
+
|
1140
|
+
def subsequent_cardholder_initiated_transaction?(options)
|
1141
|
+
options.dig(:stored_credential, :initiator) == 'cardholder' && !options.dig(:stored_credential, :initial_transaction)
|
1142
|
+
end
|
1143
|
+
|
1144
|
+
def unscheduled_merchant_initiated_transaction?(options)
|
1145
|
+
options.dig(:stored_credential, :initiator) == 'merchant' && options.dig(:stored_credential, :reason_type) == 'unscheduled'
|
1146
|
+
end
|
1147
|
+
|
1148
|
+
def threeds_stored_credential_exemption?(options)
|
1149
|
+
options[:three_ds_exemption_type] == THREEDS_EXEMPTIONS[:stored_credential]
|
1150
|
+
end
|
1151
|
+
|
1019
1152
|
def add_partner_solution_id(xml)
|
1020
1153
|
return unless application_id
|
1021
1154
|
|
@@ -1068,12 +1201,16 @@ module ActiveMerchant #:nodoc:
|
|
1068
1201
|
|
1069
1202
|
message = auto_void?(authorization_from(response, action, amount, options), response, message, options)
|
1070
1203
|
|
1071
|
-
Response.new(
|
1204
|
+
Response.new(
|
1205
|
+
success,
|
1206
|
+
message,
|
1207
|
+
response,
|
1072
1208
|
test: test?,
|
1073
1209
|
authorization: authorization,
|
1074
1210
|
fraud_review: in_fraud_review?(response),
|
1075
1211
|
avs_result: { code: response[:avsCode] },
|
1076
|
-
cvv_result: response[:cvCode]
|
1212
|
+
cvv_result: response[:cvCode]
|
1213
|
+
)
|
1077
1214
|
end
|
1078
1215
|
|
1079
1216
|
def auto_void?(authorization, response, message, options = {})
|
@@ -1115,6 +1252,7 @@ module ActiveMerchant #:nodoc:
|
|
1115
1252
|
parent += '_' + node.parent.attributes['id'] if node.parent.attributes['id']
|
1116
1253
|
parent += '_'
|
1117
1254
|
end
|
1255
|
+
reply[:reconciliationID2] = node.text if node.name == 'reconciliationID' && reply[:reconciliationID]
|
1118
1256
|
reply["#{parent}#{node.name}".to_sym] ||= node.text
|
1119
1257
|
end
|
1120
1258
|
return reply
|