issuer_response_codes 0.1.3 → 0.2.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 CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: f30e5afe484a09019488f8e4de8d67f26cdde55a35ee0fc129227f726f7b78b6
4
- data.tar.gz: 05d1504748e11ac63423f3107281f746455ff04dc282707d2797c04f1943ac11
3
+ metadata.gz: 0fdf114e3233ad8d9aa121a2c12bc2819e9c110c6671a4e364ae00f5a69987e9
4
+ data.tar.gz: 9e22b8b8973d9577b47623b921ef0e2b2ea470b8175861b836656ec57fe35aac
5
5
  SHA512:
6
- metadata.gz: b91d8309622bdd9f4efea3b50372719b3ccca9cb5b610f3c8dc5da4c0de1175ad72793779d395c74dd6f2b127e1ce88ac1804c537c792a30d2357af4248b88da
7
- data.tar.gz: 13ab508736d7f06877966cfa1a9f84a35e35be8f940678f93b10624e3bfe0e4cc03c1b7bdc65d74817b66ccc89890db6d520518ddbfae54d43a6d3792db9ef43
6
+ metadata.gz: 238de0b95f1203dc1d93855c8badca49bd5792e3ad43c3ffb7d7df078cae4c68bf7bd28ae77204ffdf733d671a4c873e1e43a574169ce9185e720bdc26be44fc
7
+ data.tar.gz: 5d537189d5e4c074ec9fd4b4cbce724f97b9c2d64697a103be37fa1d348ff469d92fd697fe3b3dcaab3b34eca21ff7486ae880a0310297e1f08e1dd5fe7944df
data/Gemfile.lock CHANGED
@@ -1,27 +1,28 @@
1
1
  PATH
2
2
  remote: .
3
3
  specs:
4
- issuer_response_codes (0.1.3)
4
+ issuer_response_codes (0.2.0)
5
5
 
6
6
  GEM
7
7
  remote: https://rubygems.org/
8
8
  specs:
9
9
  ast (2.4.2)
10
- backport (1.1.2)
10
+ backport (1.2.0)
11
11
  benchmark (0.1.1)
12
12
  bundler-audit (0.8.0)
13
13
  bundler (>= 1.2.0, < 3)
14
14
  thor (~> 1.0)
15
15
  byebug (11.1.3)
16
+ diff-lcs (1.4.4)
16
17
  e2mmap (0.1.0)
17
18
  jaro_winkler (1.5.4)
18
19
  kramdown (2.3.1)
19
20
  rexml
20
21
  kramdown-parser-gfm (1.1.0)
21
22
  kramdown (~> 2.0)
22
- mini_portile2 (2.5.1)
23
+ mini_portile2 (2.5.3)
23
24
  minitest (5.14.4)
24
- nokogiri (1.11.3)
25
+ nokogiri (1.11.7)
25
26
  mini_portile2 (~> 2.5.0)
26
27
  racc (~> 1.4)
27
28
  parallel (1.20.1)
@@ -34,22 +35,23 @@ GEM
34
35
  reverse_markdown (2.0.0)
35
36
  nokogiri
36
37
  rexml (3.2.5)
37
- rubocop (1.14.0)
38
+ rubocop (1.18.2)
38
39
  parallel (~> 1.10)
39
40
  parser (>= 3.0.0.0)
40
41
  rainbow (>= 2.2.2, < 4.0)
41
42
  regexp_parser (>= 1.8, < 3.0)
42
43
  rexml
43
- rubocop-ast (>= 1.5.0, < 2.0)
44
+ rubocop-ast (>= 1.7.0, < 2.0)
44
45
  ruby-progressbar (~> 1.7)
45
46
  unicode-display_width (>= 1.4.0, < 3.0)
46
- rubocop-ast (1.5.0)
47
+ rubocop-ast (1.7.0)
47
48
  parser (>= 3.0.1.1)
48
49
  ruby-progressbar (1.11.0)
49
- solargraph (0.40.4)
50
- backport (~> 1.1)
50
+ solargraph (0.42.3)
51
+ backport (~> 1.2)
51
52
  benchmark
52
53
  bundler (>= 1.17.2)
54
+ diff-lcs (~> 1.4)
53
55
  e2mmap
54
56
  jaro_winkler (~> 1.5)
55
57
  kramdown (~> 2.3)
data/README.md CHANGED
@@ -1,9 +1,9 @@
1
1
  # IssuerResponseCodes
2
2
 
3
- This gem provides a quite comprehensive library of Issuer Response Code descriptions (for both cardholders and merchants) with suggested actions in 7 languages:
3
+ This gem provides a quite comprehensive library of Issuer Response Code and 3D-Secure Status Code descriptions (for both cardholders and merchants) with suggested actions in 7 languages:
4
4
  - Complete locales:
5
- - en
6
- - pl
5
+ - en
6
+ - pl
7
7
 
8
8
  - Incomplete locales:
9
9
  - da
@@ -59,11 +59,22 @@ def response_code_description
59
59
  ::ISSUER_RESPONSE_CODES.code(id: '43', locale: :pl).description
60
60
  #=> "Karta oznaczona jako skradziona. Skontaktuj się z Twoim bankiem w celu wyjaśnienia przyczyny problemu."
61
61
  end
62
+
63
+ def tds_code_description
64
+ ::ISSUER_RESPONSE_CODES.tds_code(id: '09').description
65
+ #=> "Security failure"
66
+
67
+ ::ISSUER_RESPONSE_CODES.tds_code(id: '09', target: :cardholder).description
68
+ #=> "Card authentication failed"
69
+
70
+ ::ISSUER_RESPONSE_CODES.tds_code(id: '09', locale: :pl).description
71
+ #=> "Niepowodzenie autoryzacji karty"
72
+ end
62
73
  ```
63
74
 
64
75
  ## Usage
65
76
 
66
- This gem provides an easy way of handling Issuer Response Codes. Whether you need detailed descriptions, short reasons or suggestions of what to do when a certain Code appeared, we've got you covered. Certain more explicit codes like `Stolen card' are masked behind more generic terms when you choose to target cardholders.
77
+ This gem provides an easy way of handling Issuer Response Codes and 3D-Secure Status Codes. Whether you need detailed descriptions, short reasons or suggestions of what to do when a certain Code appeared, we've got you covered. Certain more explicit codes like `Stolen card' are masked behind more generic terms when you choose to target cardholders.
67
78
 
68
79
  ### IssuerResponseCodes::Code
69
80
  #### Creation options
@@ -135,7 +146,7 @@ code.reason #=> "Karta utraciła ważność."
135
146
 
136
147
  #### Methods
137
148
 
138
- ##### Reason
149
+ ##### reason
139
150
 
140
151
  The `reason` method returns a relatively short description of the main reason why the Issuer Response Code appeared in the first place.
141
152
 
@@ -150,7 +161,7 @@ code = ::IssuerResponseCodes::Code.new(id: '59')
150
161
  code.reason #=> "Your bank has declined this transaction"
151
162
  ```
152
163
 
153
- ##### Behaviour
164
+ ##### behaviour
154
165
 
155
166
  The `behaviour` method returns a suggestion of what to do when the Issuer Response Code appeared. Mainly for cardholders.
156
167
 
@@ -165,9 +176,9 @@ code = ::IssuerResponseCodes::Code.new(id: '59')
165
176
  code.behaviour #=> "Please contact your card issuer to get more details and try again later."
166
177
  ```
167
178
 
168
- ##### Description
179
+ ##### description
169
180
 
170
- The `description` method is a combination of both the `reason` and `behaviour` of a Issuer Response Code
181
+ The `description` method (aliased as `humanize`) is a combination of both the `reason` and `behaviour` of a Issuer Response Code
171
182
 
172
183
  ```ruby
173
184
  code = ::IssuerResponseCodes::Code.new(id: '14')
@@ -180,6 +191,91 @@ code = ::IssuerResponseCodes::Code.new(id: '59')
180
191
  code.description #=> "Your bank has declined this transaction. Please contact your card issuer to get more details and try again later."
181
192
  ```
182
193
 
194
+ ##### fraudulent_code?
195
+
196
+ The `fraudulent_code?` method returns `true` when the Code indicates fraud.
197
+
198
+ ```ruby
199
+ code = ::IssuerResponseCodes::Code.new(id: '14')
200
+ code.fraudulent_code? #=> false
201
+
202
+ code = ::IssuerResponseCodes::Code.new(id: '04')
203
+ code.fraudulent_code? #=> true
204
+
205
+ code = ::IssuerResponseCodes::Code.new(id: '43')
206
+ code.fraudulent_code? #=> true
207
+ ```
208
+
209
+ ### IssuerResponseCodes::TdsCode
210
+ #### Creation options
211
+
212
+ ##### Targets
213
+
214
+ You can choose the main target of these descriptions (certain details are hidden for cardholders)
215
+
216
+ ```ruby
217
+ # Default values are as follows:
218
+ # target: :merchant, locale: :en
219
+
220
+ # fraud_notice is set to true by default when target = :merchant
221
+ code = ::IssuerResponseCodes::TdsCode.new(id: '11')
222
+ code.reason #=> "Suspected fraud"
223
+
224
+ code = ::IssuerResponseCodes::TdsCode.new(id: '11', target: :merchant)
225
+ code.reason #=> "Suspected fraud"
226
+
227
+ # fraud_notice is set to false by default when target = :cardholder
228
+ code = ::IssuerResponseCodes::TdsCode.new(id: '11', target: :cardholder)
229
+ code.reason #=> "Card authentication failed"
230
+ ```
231
+
232
+ ##### Locale
233
+
234
+ The default locale is `:en`. There are 7 in total: `%i[en pl da ee lt lv sv]`. Only the first two are complete, the rest are partially in English.
235
+
236
+ ```ruby
237
+ code = ::IssuerResponseCodes::TdsCode.new(id: '11')
238
+ code.reason #=> "Suspected fraud"
239
+
240
+ code = ::IssuerResponseCodes::TdsCode.new(id: '11', locale: :en)
241
+ code.reason #=> "Suspected fraud"
242
+
243
+ code = ::IssuerResponseCodes::TdsCode.new(id: '11', locale: :pl)
244
+ code.reason #=> "Podejrzenie oszustwa"
245
+ ```
246
+
247
+ #### Methods
248
+
249
+ ##### description/reason
250
+
251
+ The `description` (also aliased as `reason`) method returns a relatively short description of the main reason why the Issuer Response Code appeared in the first place.
252
+
253
+ ```ruby
254
+ code = ::IssuerResponseCodes::TdsCode.new(id: '08')
255
+ code.description #=> "No Card record"
256
+
257
+ code = ::IssuerResponseCodes::TdsCode.new(id: '22')
258
+ code.description #=> "ACS technical issue"
259
+
260
+ code = ::IssuerResponseCodes::TdsCode.new(id: '26')
261
+ code.description #=> "Authentication attempted but not performed by the cardholder"
262
+ ```
263
+
264
+ ##### fraudulent_code?
265
+
266
+ The `fraudulent_code?` method returns `true` when the TdsCode indicates fraud.
267
+
268
+ ```ruby
269
+ code = ::IssuerResponseCodes::TdsCode.new(id: '11')
270
+ code.fraudulent_code? #=> true
271
+
272
+ code = ::IssuerResponseCodes::TdsCode.new(id: '22')
273
+ code.fraudulent_code? #=> false
274
+
275
+ code = ::IssuerResponseCodes::TdsCode.new(id: '26')
276
+ code.fraudulent_code? #=> false
277
+ ```
278
+
183
279
  ### Custom default configuration
184
280
 
185
281
  You can make use of the `Context` class to easily create your own default configurations. Contexts work as proxies which create codes for you.
@@ -198,6 +294,9 @@ code = ISSUER_RESPONSE_CODES.code(id: '43')
198
294
  code.reason #=> "Bank odrzucił autoryzację."
199
295
  code.behaviour #=> "Skontaktuj się z Twoim bankiem w celu wyjaśnienia przyczyny problemu. UWAGA: Nie należy powtarzać obciążeń dla tej karty! Może to zostać uznane za próbę oszustwa!"
200
296
 
297
+ tds_code = ISSUER_RESPONSE_CODES.tds_code(id: '11')
298
+ tds_code.reason #=> "Niepowodzenie autoryzacji karty"
299
+
201
300
  # these can always be overridden
202
301
  code = ISSUER_RESPONSE_CODES.code(id: '43', locale: :en, target: :merchant, fraud_notice: false)
203
302
  code.reason #=> "Stolen card."
@@ -4,6 +4,7 @@ require "issuer_response_codes/version"
4
4
  require "issuer_response_codes/locale_library"
5
5
  require "issuer_response_codes/context"
6
6
  require "issuer_response_codes/code"
7
+ require "issuer_response_codes/tds_code"
7
8
 
8
9
  module IssuerResponseCodes
9
10
  class IllegalTarget < StandardError; end
@@ -32,9 +32,15 @@ module IssuerResponseCodes
32
32
  LOCALE_LIBRARY.dig(path: id, scope: "issuer_response_codes.targeted.#{target}", locale: locale, default: :unknown)
33
33
  end
34
34
 
35
+ def fraudulent_code?
36
+ @fraudulent_code ||= LOCALE_LIBRARY.dig(path: id, scope: "issuer_response_codes.fraudulent_codes", locale: locale)
37
+ end
38
+
35
39
  def behaviour
36
- fraud_notice_str = fraud_notice ? LOCALE_LIBRARY.dig(path: 'issuer_response_codes.fraud_notice') : ''
37
- LOCALE_LIBRARY.dig(path: id, substitute: fraud_notice_str, scope: "issuer_response_codes.behaviour", locale: locale, default: :unknown)
40
+ behaviour_str = LOCALE_LIBRARY.dig(path: id, scope: "issuer_response_codes.behaviour", locale: locale, default: :unknown)
41
+ return behaviour_str unless fraud_notice && fraudulent_code?
42
+
43
+ "#{behaviour_str} #{LOCALE_LIBRARY.dig(path: 'issuer_response_codes.fraud_notice')}"
38
44
  end
39
45
  end
40
46
  end
@@ -24,5 +24,9 @@ module IssuerResponseCodes
24
24
  def code(id:, target: default_target, locale: default_locale, fraud_notice: fraud_notice_by_default)
25
25
  Code.new(id: id, target: target, locale: locale, fraud_notice: fraud_notice)
26
26
  end
27
+
28
+ def tds_code(id:, target: default_target, locale: default_locale, fraud_notice: fraud_notice_by_default)
29
+ TdsCode.new(id: id, target: target, locale: locale, fraud_notice: fraud_notice)
30
+ end
27
31
  end
28
32
  end
@@ -18,6 +18,7 @@ module IssuerResponseCodes
18
18
  def dig(path:, locale: :en, scope: '', default: nil, substitute: '')
19
19
  result = __dig__(path: path, locale: locale, scope: scope, default: default)
20
20
  return result unless result
21
+ return result unless result.is_a? ::String
21
22
 
22
23
  result.gsub(/%{substitute}/, substitute)
23
24
  end
@@ -0,0 +1,36 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IssuerResponseCodes
4
+ class TdsCode
5
+ attr_reader :id, :target, :locale, :fraud_notice
6
+
7
+ NOT_PROVIDED = ::Object.new
8
+
9
+ def initialize(id:, target: :merchant, locale: :en, fraud_notice: NOT_PROVIDED)
10
+ @id = id
11
+ @target = target
12
+ @locale = locale
13
+
14
+ raise IllegalLocale, "No such locale: #{locale.inspect}" unless AVAILABLE_LOCALES.include?(locale)
15
+ raise IllegalTarget, "No such target: #{target.inspect}" unless AVAILABLE_TARGETS.include?(target)
16
+
17
+ if fraud_notice != NOT_PROVIDED
18
+ @fraud_notice = fraud_notice
19
+ return
20
+ end
21
+
22
+ @fraud_notice = target == :merchant
23
+ end
24
+
25
+ def reason
26
+ LOCALE_LIBRARY.dig(path: id, scope: "tds_status_codes.targeted.#{target}", locale: locale, default: :unknown)
27
+ end
28
+
29
+ alias humanize reason
30
+ alias description reason
31
+
32
+ def fraudulent_code?
33
+ @fraudulent_code ||= LOCALE_LIBRARY.dig(path: id, scope: "tds_status_codes.fraudulent_codes", locale: locale)
34
+ end
35
+ end
36
+ end
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module IssuerResponseCodes
4
- VERSION = '0.1.3'
4
+ VERSION = '0.2.0'
5
5
  end
data/lib/locale/da.yml CHANGED
@@ -1,41 +1,88 @@
1
1
  da:
2
- issuer_response_code: &issuer_response_code
3
- '00': "En fejl opstod. Transaktionen blev afvist af Elavon på grund af ikke-understøttet korttype eller forkerte kortdata, intet svar fra udsteder / bank eller inaktiv Merchant-konto."
4
- '05': "Banken har afvist transaktionen på grund af sikkerhedskontrol (brugt kort understøtter ikke tilbagebetalinger eller betaling uden CVV-kode), midlerne er blevet frosset eller grænsen overskredet, eller kortet understøtter ikke MOTO / internet-transaktioner."
5
- '13': "MOTO / eCommerce betalinger på kort er inaktive eller beløbsgrænse overstiger."
6
- '14': "Ugyldigt kortnummer."
7
- 'N7': "Negative CVV / CVC resultater."
8
- '51': "Ikke nok penge."
9
- '54': "Udgået kort."
10
- '57': "Banken har afvist transaktionen, da dette kreditkort ikke kan bruges til denne type transaktion (e-handel, MOTO eller tilbagevendende)."
11
- '61': "Banken har afvist transaktionen."
12
- '82': "Negative CVV / CVC resultater."
13
- # incomplete translations
14
- unknown: "Unknown reason."
15
- '01': "Authorization Error."
16
- '02': "Authorization Error."
17
- '03': "Authorization Error."
18
- '12': "No privileges to execute this transaction for your card."
19
- '30': "Your bank has declined this transaction"
20
- '58': "Your bank has declined this transaction as this credit card cannot be used for this type of transaction (eccommerce, MOTO or recurring)."
21
- '59': "Your bank has declined this transaction"
22
- '62': "Your card can be not supported due to restrictions placed on the card or Seller country exclusion (imposition an embargo), or bank blocked a card eg. due to unacceptable debit balance."
23
- '65': "Activity count limit exceeded."
24
- '75': "Invalid activity count limit exceeded."
25
- '78': "Inactive card."
26
- '91': "Temporary issuer error."
27
- '92': "Temporary issuer error."
28
- '94': "Temporary issuer error."
29
- '96': "Temporary issuer error."
30
- '98': "Temporary issuer error."
31
- 'E3': "Transaction not executed due to a 3D-Secure error."
32
- 'E4': "Transaction not executed due to a negative 3D-Secure confirmation from your bank."
33
- 'E5': "Temporary 3D-Secure error."
34
- 'R0': "Refused by Issuer because Customer requested stop of specific recurring payments."
35
- 'R1': "Refused by Issuer because Customer requested stop of all recurring payments."
2
+ tds_status_codes:
3
+ fraudulent_codes:
4
+ '09': true
5
+ '10': true
6
+ '11': true
7
+ universal: &universal_tds_status_codes
8
+ unknown: "Unknown reason."
9
+ '01': Card authentication failed
10
+ '02': Unknown Device
11
+ '03': Unsupported Device
12
+ '04': Exceeds authentication frequency limit
13
+ '05': Expired card
14
+ '06': Invalid card number
15
+ '07': Invalid transaction
16
+ '08': No Card record
17
+ '12': Transaction not permitted to cardholder
18
+ '13': Cardholder not enrolled in service
19
+ '14': Transaction timed out at the ACS
20
+ '15': Low confidence
21
+ '16': Medium confidence
22
+ '17': High confidence
23
+ '18': Very High confidence
24
+ '19': Exceeds ACS maximum challenges
25
+ '20': Non-Payment transaction not supported
26
+ '21': 3RI transaction not supported
27
+ '22': ACS technical issue
28
+ '23': Decoupled Authentication required by ACS but not requested by 3DS Requestor
29
+ '24': 3DS Requestor Decoupled Max Expiry Time exceeded
30
+ '25': Decoupled Authentication was provided insufficient time to authenticate cardholder. ACS will not make attempt
31
+ '26': Authentication attempted but not performed by the cardholder
32
+
33
+ targeted:
34
+ cardholder:
35
+ <<: *universal_tds_status_codes
36
+ '09': Card authentication failed # Security failure
37
+ '10': Card authentication failed # Stolen card
38
+ '11': Card authentication failed # Suspected fraud
39
+ merchant:
40
+ <<: *universal_tds_status_codes
41
+ '09': Security failure
42
+ '10': Stolen card
43
+ '11': Suspected fraud
36
44
  issuer_response_codes:
37
45
  suggestion: 'Suggestion'
38
46
  fraud_notice: 'IMPORTANT NOTICE: It is forbidden to retry transactions that ended with this code. It may be recognized as a fraud attempt!'
47
+ fraudulent_codes:
48
+ '04': true
49
+ '07': true
50
+ '41': true
51
+ '43': true
52
+ universal: &issuer_response_code
53
+ '00': "En fejl opstod. Transaktionen blev afvist af Elavon på grund af ikke-understøttet korttype eller forkerte kortdata, intet svar fra udsteder / bank eller inaktiv Merchant-konto."
54
+ '05': "Banken har afvist transaktionen på grund af sikkerhedskontrol (brugt kort understøtter ikke tilbagebetalinger eller betaling uden CVV-kode), midlerne er blevet frosset eller grænsen overskredet, eller kortet understøtter ikke MOTO / internet-transaktioner."
55
+ '13': "MOTO / eCommerce betalinger på kort er inaktive eller beløbsgrænse overstiger."
56
+ '14': "Ugyldigt kortnummer."
57
+ 'N7': "Negative CVV / CVC resultater."
58
+ '51': "Ikke nok penge."
59
+ '54': "Udgået kort."
60
+ '57': "Banken har afvist transaktionen, da dette kreditkort ikke kan bruges til denne type transaktion (e-handel, MOTO eller tilbagevendende)."
61
+ '61': "Banken har afvist transaktionen."
62
+ '82': "Negative CVV / CVC resultater."
63
+ # incomplete translations
64
+ unknown: "Unknown reason."
65
+ '01': "Authorization Error."
66
+ '02': "Authorization Error."
67
+ '03': "Authorization Error."
68
+ '12': "No privileges to execute this transaction for your card."
69
+ '30': "Your bank has declined this transaction"
70
+ '58': "Your bank has declined this transaction as this credit card cannot be used for this type of transaction (eccommerce, MOTO or recurring)."
71
+ '59': "Your bank has declined this transaction"
72
+ '62': "Your card can be not supported due to restrictions placed on the card or Seller country exclusion (imposition an embargo), or bank blocked a card eg. due to unacceptable debit balance."
73
+ '65': "Activity count limit exceeded."
74
+ '75': "Invalid activity count limit exceeded."
75
+ '78': "Inactive card."
76
+ '91': "Temporary issuer error."
77
+ '92': "Temporary issuer error."
78
+ '94': "Temporary issuer error."
79
+ '96': "Temporary issuer error."
80
+ '98': "Temporary issuer error."
81
+ 'E3': "Transaction not executed due to a 3D-Secure error."
82
+ 'E4': "Transaction not executed due to a negative 3D-Secure confirmation from your bank."
83
+ 'E5': "Temporary 3D-Secure error."
84
+ 'R0': "Refused by Issuer because Customer requested stop of specific recurring payments."
85
+ 'R1': "Refused by Issuer because Customer requested stop of all recurring payments."
39
86
  behaviour:
40
87
  '00': "Prøv igen senere, kontakt med sælger eller med Espago Support Team."
41
88
  '05': "Tjek venligst dine kortindstillinger for disse transaktionstyper eller brug et andet kort."
@@ -52,12 +99,12 @@ da:
52
99
  '01': "Please contact your card issuer."
53
100
  '02': "Please contact your card issuer."
54
101
  '03': "Please contact your card issuer and try again later."
55
- '04': "Please contact your card issuer and try again later. %{substitute}"
56
- '07': "Please contact your card issuer and try again later. %{substitute}"
102
+ '04': "Please contact your card issuer and try again later."
103
+ '07': "Please contact your card issuer and try again later."
57
104
  '12': "Please contact your card issuer to get more details and try again later."
58
105
  '30': "Please contact your card issuer to get more details and try again later."
59
- '41': "Please contact your card issuer to get more details and try again later. %{substitute}"
60
- '43': "Please contact your card issuer to get more details and try again later. %{substitute}"
106
+ '41': "Please contact your card issuer to get more details and try again later."
107
+ '43': "Please contact your card issuer to get more details and try again later."
61
108
  '58': "Please check your card settings for those transaction types or use another card."
62
109
  '59': "Please contact your card issuer to get more details and try again later."
63
110
  '62': "Please contact your bank."