activemerchant 1.118.0 → 1.119.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG +16 -0
- data/lib/active_merchant/billing/credit_card.rb +1 -0
- data/lib/active_merchant/billing/credit_card_methods.rb +16 -4
- data/lib/active_merchant/billing/gateways/decidir.rb +8 -2
- data/lib/active_merchant/billing/gateways/elavon.rb +9 -0
- data/lib/active_merchant/billing/gateways/eway_rapid.rb +13 -0
- data/lib/active_merchant/billing/gateways/global_collect.rb +6 -6
- data/lib/active_merchant/billing/gateways/hps.rb +9 -0
- data/lib/active_merchant/billing/gateways/litle.rb +3 -3
- data/lib/active_merchant/billing/gateways/netbanx.rb +11 -0
- data/lib/active_merchant/billing/gateways/orbital.rb +32 -8
- data/lib/active_merchant/billing/gateways/payment_express.rb +7 -2
- data/lib/active_merchant/billing/gateways/redsys.rb +2 -1
- data/lib/active_merchant/billing/gateways/worldpay.rb +1 -1
- data/lib/active_merchant/version.rb +1 -1
- metadata +2 -2
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 93f6306f4daee82e8458586cf10ba23a4b1cfa085c912430821bf583c789aded
|
4
|
+
data.tar.gz: a943a31836368d69faf7c731dbc4c81d8b1a302b0fddd5cb4960c6714a88f11a
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: cb33c86a0b9f3be8186a69fe170656684a98f74dcd9597df7f70792e23050235a9774c4192f25a1700110315dd6a98afa4ef0c3b74e8ea495814146594c2746a
|
7
|
+
data.tar.gz: 68729586be8247575dd96b6351db94f5b726338b92229cb49ddb82d6652ed93300049dd1edc18929a01850ec161cbe7574b0ceda0f1f233941019b7dfbca74f4
|
data/CHANGELOG
CHANGED
@@ -2,6 +2,22 @@
|
|
2
2
|
|
3
3
|
== HEAD
|
4
4
|
|
5
|
+
== Version 1.119.0 (February 9th, 2021)
|
6
|
+
* Payment Express: support verify/validate [therufs] #3874
|
7
|
+
* GlobalCollect: Truncate address fields [meagabeth] #3878
|
8
|
+
* Litle: Truncate address fields [meagabeth] #3877
|
9
|
+
* Netbanx: Add-customer-information(name,email,IP)-to-a-transaction [rockyhakjoong] #3754
|
10
|
+
* Decidir: Improve error mapping [meagabeth] #3875
|
11
|
+
* Worldpay: support `skip_capture` [therufs] #3879
|
12
|
+
* Redsys: Add new response code text [britth] #3880
|
13
|
+
* Orbital: Update ECP details to use payment source [jessiagee] #3881
|
14
|
+
* Alelo: Add additional BIN ranges [meagabeth] #3882
|
15
|
+
* HPS: Update Add support for general credit [naashton] #3885
|
16
|
+
* Elavon: Fix issue with encoding data sent in the request [naashton] #3865
|
17
|
+
* Orbital: Update ECP to use EWS verification [jessiagee] #3886
|
18
|
+
* Eway: Add 3ds field when do direct payment [GavinSun9527] #3860
|
19
|
+
* Support Creditel cardtype [therufs] #3883
|
20
|
+
|
5
21
|
== Version 1.118.0 (January 22nd, 2021)
|
6
22
|
* Worldpay: Add support for challengeWindowSize [carrigan] #3823
|
7
23
|
* Adyen: Update capitalization on subMerchantId field [cdmackeyfree] #3824
|
@@ -31,7 +31,8 @@ module ActiveMerchant #:nodoc:
|
|
31
31
|
CARNET_BINS.any? { |bin| num.slice(0, bin.size) == bin }
|
32
32
|
)
|
33
33
|
},
|
34
|
-
'olimpica' => ->(num) { num =~ /^636853\d{10}$/ }
|
34
|
+
'olimpica' => ->(num) { num =~ /^636853\d{10}$/ },
|
35
|
+
'creditel' => ->(num) { num =~ /^601933\d{10}$/ }
|
35
36
|
}
|
36
37
|
|
37
38
|
# http://www.barclaycard.co.uk/business/files/bin_rules.pdf
|
@@ -167,8 +168,9 @@ module ActiveMerchant #:nodoc:
|
|
167
168
|
402588..402588, 404347..404347, 405876..405876, 405882..405882, 405884..405884,
|
168
169
|
405886..405886, 430471..430471, 438061..438061, 438064..438064, 470063..470066,
|
169
170
|
496067..496067, 506699..506704, 506706..506706, 506713..506714, 506716..506716,
|
170
|
-
506749..506750, 506752..506752, 506754..506756, 506758..
|
171
|
-
|
171
|
+
506749..506750, 506752..506752, 506754..506756, 506758..506767, 506770..506771,
|
172
|
+
506773..506773, 509015..509019, 509880..509882, 509884..509885, 509887..509887,
|
173
|
+
509987..509992
|
172
174
|
]
|
173
175
|
|
174
176
|
CABAL_RANGES = [
|
@@ -345,6 +347,8 @@ module ActiveMerchant #:nodoc:
|
|
345
347
|
case brand
|
346
348
|
when 'naranja'
|
347
349
|
valid_naranja_algo?(numbers)
|
350
|
+
when 'creditel'
|
351
|
+
valid_creditel_algo?(numbers)
|
348
352
|
when 'alia'
|
349
353
|
true
|
350
354
|
else
|
@@ -399,7 +403,7 @@ module ActiveMerchant #:nodoc:
|
|
399
403
|
sum % 10 == 0
|
400
404
|
end
|
401
405
|
|
402
|
-
# Checks the validity of a card number by use of
|
406
|
+
# Checks the validity of a card number by use of specific algorithms
|
403
407
|
def valid_naranja_algo?(numbers) #:nodoc:
|
404
408
|
num_array = numbers.to_s.chars.map(&:to_i)
|
405
409
|
multipliers = [4, 3, 2, 7, 6, 5, 4, 3, 2, 7, 6, 5, 4, 3, 2]
|
@@ -408,6 +412,14 @@ module ActiveMerchant #:nodoc:
|
|
408
412
|
final_num = intermediate > 9 ? 0 : intermediate
|
409
413
|
final_num == num_array[15]
|
410
414
|
end
|
415
|
+
|
416
|
+
def valid_creditel_algo?(numbers) #:nodoc:
|
417
|
+
num_array = numbers.to_s.chars.map(&:to_i)
|
418
|
+
multipliers = [5, 4, 3, 2, 1, 9, 8, 7, 6, 5, 4, 3, 2, 1, 9]
|
419
|
+
num_sum = num_array[0..14].zip(multipliers).map { |a, b| a * b }.reduce(:+)
|
420
|
+
final_num = num_sum % 10
|
421
|
+
final_num == num_array[15]
|
422
|
+
end
|
411
423
|
end
|
412
424
|
end
|
413
425
|
end
|
@@ -301,15 +301,21 @@ module ActiveMerchant #:nodoc:
|
|
301
301
|
error_code = nil
|
302
302
|
if error = response.dig('status_details', 'error')
|
303
303
|
code = error.dig('reason', 'id')
|
304
|
-
|
304
|
+
standard_error_code = STANDARD_ERROR_CODE_MAPPING[code]
|
305
|
+
error_code = "#{code}, #{standard_error_code}"
|
305
306
|
error_code ||= error['type']
|
306
307
|
elsif response['error_type']
|
307
308
|
error_code = response['error_type'] if response['validation_errors']
|
308
|
-
elsif
|
309
|
+
elsif response.dig('error', 'validation_errors')
|
310
|
+
error = response.dig('error')
|
309
311
|
validation_errors = error.dig('validation_errors', 0)
|
310
312
|
code = validation_errors['code'] if validation_errors && validation_errors['code']
|
311
313
|
param = validation_errors['param'] if validation_errors && validation_errors['param']
|
312
314
|
error_code = "#{error['error_type']} | #{code} | #{param}" if error['error_type']
|
315
|
+
elsif error = response.dig('error')
|
316
|
+
code = error.dig('reason', 'id')
|
317
|
+
standard_error_code = STANDARD_ERROR_CODE_MAPPING[code]
|
318
|
+
error_code = "#{code}, #{standard_error_code}"
|
313
319
|
end
|
314
320
|
|
315
321
|
error_code || STANDARD_ERROR_CODE[:processing_error]
|
@@ -380,6 +380,7 @@ module ActiveMerchant #:nodoc:
|
|
380
380
|
|
381
381
|
def commit(request)
|
382
382
|
request = "xmldata=#{request}".delete('&')
|
383
|
+
|
383
384
|
response = parse(ssl_post(test? ? self.test_url : self.live_url, request, headers))
|
384
385
|
|
385
386
|
Response.new(
|
@@ -416,6 +417,14 @@ module ActiveMerchant #:nodoc:
|
|
416
417
|
def authorization_from(response)
|
417
418
|
[response[:approval_code], response[:txn_id]].join(';')
|
418
419
|
end
|
420
|
+
|
421
|
+
def truncate(value, size)
|
422
|
+
return nil unless value
|
423
|
+
|
424
|
+
difference = value.force_encoding('iso-8859-1').length - value.length
|
425
|
+
|
426
|
+
return value.to_s[0, (size - difference)]
|
427
|
+
end
|
419
428
|
end
|
420
429
|
end
|
421
430
|
end
|
@@ -53,6 +53,7 @@ module ActiveMerchant #:nodoc:
|
|
53
53
|
add_invoice(params, amount, options)
|
54
54
|
add_customer_data(params, options, payment_method)
|
55
55
|
add_credit_card(params, payment_method, options)
|
56
|
+
add_3ds_authenticated_data(params, options) if options[:three_d_secure]
|
56
57
|
params['Method'] = payment_method.respond_to?(:number) ? 'ProcessPayment' : 'TokenPayment'
|
57
58
|
commit(url_for('Transaction'), params)
|
58
59
|
end
|
@@ -197,6 +198,18 @@ module ActiveMerchant #:nodoc:
|
|
197
198
|
params
|
198
199
|
end
|
199
200
|
|
201
|
+
def add_3ds_authenticated_data(params, options)
|
202
|
+
three_d_secure_options = options[:three_d_secure]
|
203
|
+
params['PaymentInstrument'] ||= {} if params['PaymentInstrument'].nil?
|
204
|
+
threed_secure_auth = params['PaymentInstrument']['ThreeDSecureAuth'] = {}
|
205
|
+
threed_secure_auth['Cryptogram'] = three_d_secure_options[:cavv]
|
206
|
+
threed_secure_auth['ECI'] = three_d_secure_options[:eci]
|
207
|
+
threed_secure_auth['XID'] = three_d_secure_options[:xid]
|
208
|
+
threed_secure_auth['AuthStatus'] = three_d_secure_options[:authentication_response_status]
|
209
|
+
threed_secure_auth['dsTransactionId'] = three_d_secure_options[:ds_transaction_id]
|
210
|
+
threed_secure_auth['Version'] = three_d_secure_options[:version]
|
211
|
+
end
|
212
|
+
|
200
213
|
def add_invoice(params, money, options, key = 'Payment')
|
201
214
|
currency_code = options[:currency] || currency(money)
|
202
215
|
params[key] = {
|
@@ -201,21 +201,21 @@ module ActiveMerchant #:nodoc:
|
|
201
201
|
shipping_address = options[:shipping_address]
|
202
202
|
if billing_address = options[:billing_address] || options[:address]
|
203
203
|
post['order']['customer']['billingAddress'] = {
|
204
|
-
'street' => billing_address[:address1],
|
205
|
-
'additionalInfo' => billing_address[:address2],
|
204
|
+
'street' => truncate(billing_address[:address1], 50),
|
205
|
+
'additionalInfo' => truncate(billing_address[:address2], 50),
|
206
206
|
'zip' => billing_address[:zip],
|
207
207
|
'city' => billing_address[:city],
|
208
|
-
'state' => billing_address[:state],
|
208
|
+
'state' => truncate(billing_address[:state], 35),
|
209
209
|
'countryCode' => billing_address[:country]
|
210
210
|
}
|
211
211
|
end
|
212
212
|
if shipping_address
|
213
213
|
post['order']['customer']['shippingAddress'] = {
|
214
|
-
'street' => shipping_address[:address1],
|
215
|
-
'additionalInfo' => shipping_address[:address2],
|
214
|
+
'street' => truncate(shipping_address[:address1], 50),
|
215
|
+
'additionalInfo' => truncate(shipping_address[:address2], 50),
|
216
216
|
'zip' => shipping_address[:zip],
|
217
217
|
'city' => shipping_address[:city],
|
218
|
-
'state' => shipping_address[:state],
|
218
|
+
'state' => truncate(shipping_address[:state], 35),
|
219
219
|
'countryCode' => shipping_address[:country]
|
220
220
|
}
|
221
221
|
post['order']['customer']['shippingAddress']['name'] = {
|
@@ -67,6 +67,15 @@ module ActiveMerchant #:nodoc:
|
|
67
67
|
end
|
68
68
|
end
|
69
69
|
|
70
|
+
def credit(money, payment_method, options = {})
|
71
|
+
commit('CreditReturn') do |xml|
|
72
|
+
add_amount(xml, money)
|
73
|
+
add_allow_dup(xml)
|
74
|
+
add_card_or_token_payment(xml, payment_method, options)
|
75
|
+
add_details(xml, options)
|
76
|
+
end
|
77
|
+
end
|
78
|
+
|
70
79
|
def verify(card_or_token, options = {})
|
71
80
|
commit('CreditAccountVerify') do |xml|
|
72
81
|
add_card_or_token_customer_data(xml, card_or_token, options)
|
@@ -371,9 +371,9 @@ module ActiveMerchant #:nodoc:
|
|
371
371
|
return unless address
|
372
372
|
|
373
373
|
doc.companyName(address[:company]) unless address[:company].blank?
|
374
|
-
doc.addressLine1(address[:address1]) unless address[:address1].blank?
|
375
|
-
doc.addressLine2(address[:address2]) unless address[:address2].blank?
|
376
|
-
doc.city(address[:city]) unless address[:city].blank?
|
374
|
+
doc.addressLine1(truncate(address[:address1], 35)) unless address[:address1].blank?
|
375
|
+
doc.addressLine2(truncate(address[:address2], 35)) unless address[:address2].blank?
|
376
|
+
doc.city(truncate(address[:city], 35)) unless address[:city].blank?
|
377
377
|
doc.state(address[:state]) unless address[:state].blank?
|
378
378
|
doc.zip(address[:zip]) unless address[:zip].blank?
|
379
379
|
doc.country(address[:country]) unless address[:country].blank?
|
@@ -36,6 +36,7 @@ module ActiveMerchant #:nodoc:
|
|
36
36
|
add_invoice(post, money, options)
|
37
37
|
add_settle_with_auth(post)
|
38
38
|
add_payment(post, payment, options)
|
39
|
+
add_customer_detail_data(post, options)
|
39
40
|
|
40
41
|
commit(:post, 'auths', post)
|
41
42
|
end
|
@@ -48,6 +49,7 @@ module ActiveMerchant #:nodoc:
|
|
48
49
|
post = {}
|
49
50
|
add_invoice(post, money, options)
|
50
51
|
add_payment(post, payment, options)
|
52
|
+
add_customer_detail_data(post, options)
|
51
53
|
|
52
54
|
commit(:post, 'auths', post)
|
53
55
|
end
|
@@ -147,6 +149,15 @@ module ActiveMerchant #:nodoc:
|
|
147
149
|
post[:locale] = options[:locale]
|
148
150
|
end
|
149
151
|
|
152
|
+
def add_customer_detail_data(post, options)
|
153
|
+
post[:profile] ||= {}
|
154
|
+
post[:profile][:email] = options[:email] if options[:email]
|
155
|
+
post[:customerIp] = options[:ip] if options[:ip]
|
156
|
+
if (billing_address = options[:billing_address])
|
157
|
+
post[:profile][:firstName], post[:profile][:lastName] = split_names(billing_address[:name])
|
158
|
+
end
|
159
|
+
end
|
160
|
+
|
150
161
|
def add_credit_card(post, credit_card, options = {})
|
151
162
|
post[:card] ||= {}
|
152
163
|
post[:card][:cardNum] = credit_card.number
|
@@ -60,7 +60,8 @@ module ActiveMerchant #:nodoc:
|
|
60
60
|
'93', # Approved high fraud
|
61
61
|
'94', # Approved fraud service unavailable
|
62
62
|
'E7', # Stored
|
63
|
-
'PA'
|
63
|
+
'PA', # Partial approval
|
64
|
+
'P1' # ECP - AVS - Account Status Verification and/or AOA data is in a positive status.
|
64
65
|
]
|
65
66
|
|
66
67
|
class_attribute :secondary_test_url, :secondary_live_url
|
@@ -341,7 +342,8 @@ module ActiveMerchant #:nodoc:
|
|
341
342
|
gsub(%r((<CCAccountNum>).+(</CC)), '\1[FILTERED]\2').
|
342
343
|
gsub(%r((<CardSecVal>).+(</CardSecVal>)), '\1[FILTERED]\2').
|
343
344
|
gsub(%r((<MerchantID>).+(</MerchantID>)), '\1[FILTERED]\2').
|
344
|
-
gsub(%r((<CustomerMerchantID>).+(</CustomerMerchantID>)), '\1[FILTERED]\2')
|
345
|
+
gsub(%r((<CustomerMerchantID>).+(</CustomerMerchantID>)), '\1[FILTERED]\2').
|
346
|
+
gsub(%r((<CustomerProfileMessage>).+(</CustomerProfileMessage>)), '\1[FILTERED]\2')
|
345
347
|
end
|
346
348
|
|
347
349
|
private
|
@@ -511,7 +513,7 @@ module ActiveMerchant #:nodoc:
|
|
511
513
|
|
512
514
|
# Payment can be done through either Credit Card or Electronic Check
|
513
515
|
def add_payment_source(xml, payment_source, options = {})
|
514
|
-
if payment_source.
|
516
|
+
if payment_source.is_a?(Check)
|
515
517
|
add_echeck(xml, payment_source, options)
|
516
518
|
else
|
517
519
|
add_creditcard(xml, payment_source, options[:currency])
|
@@ -661,16 +663,38 @@ module ActiveMerchant #:nodoc:
|
|
661
663
|
end
|
662
664
|
end
|
663
665
|
|
666
|
+
def add_ews_details(xml, payment_source, parameters = {})
|
667
|
+
xml.tag! :EWSFirstName, payment_source.first_name
|
668
|
+
xml.tag! :EWSLastName, payment_source.last_name
|
669
|
+
xml.tag! :EWSBusinessName, parameters[:company] if payment_source.first_name.empty? && payment_source.last_name.empty?
|
670
|
+
|
671
|
+
if (address = (parameters[:billing_address] || parameters[:address]))
|
672
|
+
xml.tag! :EWSAddressLine1, byte_limit(format_address_field(address[:address1]), 30)
|
673
|
+
xml.tag! :EWSAddressLine2, byte_limit(format_address_field(address[:address2]), 30)
|
674
|
+
xml.tag! :EWSCity, byte_limit(format_address_field(address[:city]), 20)
|
675
|
+
xml.tag! :EWSState, byte_limit(format_address_field(address[:state]), 2)
|
676
|
+
xml.tag! :EWSZip, byte_limit(format_address_field(address[:zip]), 10)
|
677
|
+
end
|
678
|
+
|
679
|
+
xml.tag! :EWSPhoneType, parameters[:phone_type]
|
680
|
+
xml.tag! :EWSPhoneNumber, parameters[:phone_number]
|
681
|
+
xml.tag! :EWSCheckSerialNumber, payment_source.account_number unless parameters[:auth_method].eql?('I')
|
682
|
+
end
|
683
|
+
|
664
684
|
# Adds ECP conditional attributes depending on other attribute values
|
665
|
-
def add_ecp_details(xml, parameters = {})
|
666
|
-
requires!(
|
685
|
+
def add_ecp_details(xml, payment_source, parameters = {})
|
686
|
+
requires!(payment_source.account_number) if parameters[:auth_method]&.eql?('A') || parameters[:auth_method]&.eql?('P')
|
667
687
|
xml.tag! :ECPActionCode, parameters[:action_code] if parameters[:action_code] && ECP_ACTION_CODES.include?(parameters[:action_code])
|
668
|
-
xml.tag! :ECPCheckSerialNumber,
|
688
|
+
xml.tag! :ECPCheckSerialNumber, payment_source.account_number if parameters[:auth_method]&.eql?('A') || parameters[:auth_method]&.eql?('P')
|
669
689
|
if parameters[:auth_method]&.eql?('P')
|
670
690
|
xml.tag! :ECPTerminalCity, parameters[:terminal_city] if parameters[:terminal_city]
|
671
691
|
xml.tag! :ECPTerminalState, parameters[:terminal_state] if parameters[:terminal_state]
|
672
692
|
xml.tag! :ECPImageReferenceNumber, parameters[:image_reference_number] if parameters[:image_reference_number]
|
673
693
|
end
|
694
|
+
if parameters[:action_code]&.eql?('W3') || parameters[:action_code]&.eql?('W5') ||
|
695
|
+
parameters[:action_code]&.eql?('W7') || parameters[:action_code]&.eql?('W9')
|
696
|
+
add_ews_details(xml, payment_source, parameters)
|
697
|
+
end
|
674
698
|
end
|
675
699
|
|
676
700
|
def add_stored_credentials(xml, parameters)
|
@@ -830,7 +854,7 @@ module ActiveMerchant #:nodoc:
|
|
830
854
|
add_aevv(xml, payment_source, three_d_secure)
|
831
855
|
add_digital_token_cryptogram(xml, payment_source)
|
832
856
|
|
833
|
-
xml.tag! :ECPSameDayInd, parameters[:same_day] if parameters[:same_day] && ECP_SAME_DAY.include?(parameters[:same_day]) && payment_source.
|
857
|
+
xml.tag! :ECPSameDayInd, parameters[:same_day] if parameters[:same_day] && ECP_SAME_DAY.include?(parameters[:same_day]) && payment_source.is_a?(Check)
|
834
858
|
|
835
859
|
set_recurring_ind(xml, parameters)
|
836
860
|
|
@@ -844,7 +868,7 @@ module ActiveMerchant #:nodoc:
|
|
844
868
|
add_level3_purchase(xml, parameters)
|
845
869
|
add_level3_tax(xml, parameters)
|
846
870
|
add_line_items(xml, parameters) if parameters[:line_items]
|
847
|
-
add_ecp_details(xml, parameters) if payment_source.
|
871
|
+
add_ecp_details(xml, payment_source, parameters) if payment_source.is_a?(Check)
|
848
872
|
add_card_indicators(xml, parameters)
|
849
873
|
add_stored_credentials(xml, parameters)
|
850
874
|
add_pymt_brand_program_code(xml, payment_source, three_d_secure)
|
@@ -86,6 +86,11 @@ module ActiveMerchant #:nodoc:
|
|
86
86
|
refund(money, identification, options)
|
87
87
|
end
|
88
88
|
|
89
|
+
def verify(money, payment_source, options = {})
|
90
|
+
request = build_purchase_or_authorization_request(money, payment_source, options)
|
91
|
+
commit(:validate, request)
|
92
|
+
end
|
93
|
+
|
89
94
|
# Token Based Billing
|
90
95
|
#
|
91
96
|
# Instead of storing the credit card details locally, you can store them inside the
|
@@ -334,7 +339,7 @@ module ActiveMerchant #:nodoc:
|
|
334
339
|
def authorization_from(action, response)
|
335
340
|
case action
|
336
341
|
when :validate
|
337
|
-
(response[:billing_id] || response[:dps_billing_id])
|
342
|
+
(response[:billing_id] || response[:dps_billing_id] || response[:dps_txn_ref])
|
338
343
|
else
|
339
344
|
response[:dps_txn_ref]
|
340
345
|
end
|
@@ -361,7 +366,7 @@ module ActiveMerchant #:nodoc:
|
|
361
366
|
# add a method to response so we can easily get the token
|
362
367
|
# for Validate transactions
|
363
368
|
def token
|
364
|
-
@params['billing_id'] || @params['dps_billing_id']
|
369
|
+
@params['billing_id'] || @params['dps_billing_id'] || @params['dps_txn_ref']
|
365
370
|
end
|
366
371
|
end
|
367
372
|
end
|
@@ -126,6 +126,7 @@ module ActiveMerchant #:nodoc:
|
|
126
126
|
184 => 'Authentication error',
|
127
127
|
190 => 'Refusal with no specific reason',
|
128
128
|
191 => 'Expiry date incorrect',
|
129
|
+
195 => 'Requires SCA authentication',
|
129
130
|
|
130
131
|
201 => 'Card expired',
|
131
132
|
202 => 'Card blocked temporarily or under suspicion of fraud',
|
@@ -622,7 +623,7 @@ module ActiveMerchant #:nodoc:
|
|
622
623
|
def response_text(code)
|
623
624
|
code = code.to_i
|
624
625
|
code = 0 if code < 100
|
625
|
-
RESPONSE_TEXTS[code] || '
|
626
|
+
RESPONSE_TEXTS[code] || 'Unknown code, please check in manual'
|
626
627
|
end
|
627
628
|
|
628
629
|
def response_text_3ds(xml, params)
|
@@ -58,7 +58,7 @@ module ActiveMerchant #:nodoc:
|
|
58
58
|
def purchase(money, payment_method, options = {})
|
59
59
|
MultiResponse.run do |r|
|
60
60
|
r.process { authorize(money, payment_method, options) }
|
61
|
-
r.process { capture(money, r.authorization, options.merge(authorization_validated: true)) }
|
61
|
+
r.process { capture(money, r.authorization, options.merge(authorization_validated: true)) } unless options[:skip_capture]
|
62
62
|
end
|
63
63
|
end
|
64
64
|
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: activemerchant
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 1.
|
4
|
+
version: 1.119.0
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Tobias Luetke
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2021-
|
11
|
+
date: 2021-02-10 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: activesupport
|