issuer_response_codes 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
data/Rakefile ADDED
@@ -0,0 +1,10 @@
1
+ require "bundler/gem_tasks"
2
+ require "rake/testtask"
3
+
4
+ Rake::TestTask.new(:test) do |t|
5
+ t.libs << "test"
6
+ t.libs << "lib"
7
+ t.test_files = FileList["test/**/*_test.rb"]
8
+ end
9
+
10
+ task :default => :test
data/bin/console ADDED
@@ -0,0 +1,14 @@
1
+ #!/usr/bin/env ruby
2
+
3
+ require "bundler/setup"
4
+ require "issuer_response_codes"
5
+
6
+ # You can add fixtures and/or initialization code here to make experimenting
7
+ # with your gem easier. You can also use a different console, if you like.
8
+
9
+ # (If you use this, don't forget to add pry to your Gemfile!)
10
+ # require "pry"
11
+ # Pry.start
12
+
13
+ require "irb"
14
+ IRB.start(__FILE__)
data/bin/setup ADDED
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ require_relative 'lib/issuer_response_codes/version'
4
+
5
+ Gem::Specification.new do |spec|
6
+ spec.name = "issuer_response_codes"
7
+ spec.version = IssuerResponseCodes::VERSION
8
+ spec.authors = ["Espago", "Mateusz Drewniak"]
9
+ spec.email = ["m.drewniak@espago.com"]
10
+
11
+ spec.summary = "Issuer Response Code descriptions for cardholders and merchants"
12
+ spec.description = "A simple Ruby gem which provides Issuer Response Code descriptions and suggestions for cardholders and merchants"
13
+ spec.homepage = "https://github.com/espago/issuer_response_codes"
14
+ spec.license = "MIT"
15
+ spec.required_ruby_version = Gem::Requirement.new(">= 2.7")
16
+
17
+ spec.metadata["homepage_uri"] = spec.homepage
18
+ spec.metadata["source_code_uri"] = "https://github.com/espago/issuer_response_codes"
19
+
20
+ # Specify which files should be added to the gem when it is released.
21
+ # The `git ls-files -z` loads the files in the RubyGem that have been added into git.
22
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
23
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
24
+ end
25
+ spec.bindir = "exe"
26
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
27
+ spec.require_paths = ["lib"]
28
+
29
+ spec.add_development_dependency 'bundler'
30
+ spec.add_development_dependency 'bundler-audit'
31
+ spec.add_development_dependency 'byebug'
32
+ spec.add_development_dependency 'rubocop'
33
+ spec.add_development_dependency 'solargraph'
34
+ end
@@ -0,0 +1,16 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "issuer_response_codes/version"
4
+ require "issuer_response_codes/locale_library"
5
+ require "issuer_response_codes/context"
6
+ require "issuer_response_codes/code"
7
+
8
+ module IssuerResponseCodes
9
+ class IllegalTarget < StandardError; end
10
+ class IllegalLocale < StandardError; end
11
+
12
+ AVAILABLE_TARGETS = %i[merchant cardholder].freeze
13
+ AVAILABLE_LOCALES = %i[en pl da ee lt lv sv].freeze
14
+
15
+ LOCALE_LIBRARY = LocaleLibrary.new
16
+ end
@@ -0,0 +1,40 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IssuerResponseCodes
4
+ class Code
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 humanize
26
+ "#{reason} #{behaviour}"
27
+ end
28
+
29
+ alias description humanize
30
+
31
+ def reason
32
+ LOCALE_LIBRARY.dig(path: id, scope: "issuer_response_codes.targeted.#{target}", locale: locale, default: :unknown)
33
+ end
34
+
35
+ 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)
38
+ end
39
+ end
40
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IssuerResponseCodes
4
+ class Context
5
+ attr_reader :default_target, :default_locale, :fraud_notice_by_default
6
+
7
+ NOT_PROVIDED = ::Object.new
8
+
9
+ def initialize(default_target: :merchant, default_locale: :en, fraud_notice_by_default: NOT_PROVIDED)
10
+ @default_target = default_target
11
+ @default_locale = default_locale
12
+
13
+ raise IllegalLocale, "No such locale: #{default_locale.inspect}" unless AVAILABLE_LOCALES.include?(default_locale)
14
+ raise IllegalTarget, "No such target: #{default_target.inspect}" unless AVAILABLE_TARGETS.include?(default_target)
15
+
16
+ if fraud_notice_by_default != NOT_PROVIDED
17
+ @fraud_notice_by_default = fraud_notice_by_default
18
+ return
19
+ end
20
+
21
+ @fraud_notice_by_default = default_target == :merchant
22
+ end
23
+
24
+ def code(id:, target: default_target, locale: default_locale, fraud_notice: fraud_notice_by_default)
25
+ Code.new(id: id, target: target, locale: locale, fraud_notice: fraud_notice)
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,65 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'yaml'
4
+ require 'byebug'
5
+
6
+ module IssuerResponseCodes
7
+ class LocaleLibrary
8
+ attr_reader :locale_hash
9
+
10
+ def initialize
11
+ @locale_hash = {}
12
+
13
+ AVAILABLE_LOCALES.each do |locale|
14
+ load_locale(locale)
15
+ end
16
+ end
17
+
18
+ def dig(path:, locale: :en, scope: '', default: nil, substitute: '')
19
+ result = __dig__(path: path, locale: locale, scope: scope, default: default)
20
+ return result unless result
21
+
22
+ result.gsub(/%{substitute}/, substitute)
23
+ end
24
+
25
+ def self.symbolize_keys(hash)
26
+ h = hash.map do |k, v|
27
+ v_sym = if v.instance_of? Hash
28
+ symbolize_keys(v)
29
+ else
30
+ v
31
+ end
32
+
33
+ [k.to_sym, v_sym]
34
+ end
35
+
36
+ h.to_h
37
+ end
38
+
39
+ private
40
+
41
+ def __dig__(path:, locale: :en, scope: '', default: nil)
42
+ result = dig_provided_path(path, scope, locale)
43
+ return result if result || !default
44
+
45
+ return default.to_s if default.is_a?(String) || scope.empty?
46
+
47
+ dig_provided_path(default.to_s, scope, locale)
48
+ end
49
+
50
+ def dig_provided_path(path, scope, locale)
51
+ full_path_array = [locale]
52
+ full_path_array.append(*scope.split('.').map(&:to_sym))
53
+ full_path_array.append(*path.split('.').map(&:to_sym))
54
+
55
+ locale_hash.dig(*full_path_array)
56
+ end
57
+
58
+ def load_locale(name)
59
+ name_str = name.to_s
60
+
61
+ single_locale_hash = self.class.symbolize_keys(::YAML.load_file("lib/locale/#{name_str}.yml")[name_str])
62
+ @locale_hash[name] = single_locale_hash
63
+ end
64
+ end
65
+ end
@@ -0,0 +1,5 @@
1
+ # frozen_string_literal: true
2
+
3
+ module IssuerResponseCodes
4
+ VERSION = '0.1.0'
5
+ end
data/lib/locale/da.yml ADDED
@@ -0,0 +1,89 @@
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."
36
+ issuer_response_codes:
37
+ suggestion: 'Suggestion'
38
+ fraud_notice: 'IMPORTANT NOTICE: It is forbidden to retry transactions that ended with this code. It may be recognized as a fraud attempt!'
39
+ behaviour:
40
+ '00': "Prøv igen senere, kontakt med sælger eller med Espago Support Team."
41
+ '05': "Tjek venligst dine kortindstillinger for disse transaktionstyper eller brug et andet kort."
42
+ '13': "Tjek venligst indstillinger for din konto og konfigurationer af grænser. Kontakt venligst din kortudsteder og prøv igen senere."
43
+ '14': "Kontroller indtastede data og prøv igen."
44
+ 'N7': "Kontroller indtastede data og prøv igen."
45
+ '51': "Tjek venligst penge på din konto og prøv igen senere."
46
+ '54': "Kontrollér dit kort eller prøv et andet."
47
+ '57': "Tjek venligst dine kortindstillinger for disse transaktionstyper eller brug et andet kort."
48
+ '61': "Tjek venligst indstillinger for din konto og konfigurationer af grænser. Kontakt venligst din kortudsteder og prøv igen senere."
49
+ '82': "Kontroller indtastede data og prøv igen."
50
+ # incomplete translations
51
+ unknown: "Please contact our support team."
52
+ '01': "Please contact your card issuer."
53
+ '02': "Please contact your card issuer."
54
+ '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}"
57
+ '12': "Please contact your card issuer to get more details and try again later."
58
+ '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}"
61
+ '58': "Please check your card settings for those transaction types or use another card."
62
+ '59': "Please contact your card issuer to get more details and try again later."
63
+ '62': "Please contact your bank."
64
+ '65': "Change your limits settings or try again later."
65
+ '75': "Please check your CVV/CVC/PIN code on your card."
66
+ '78': "Please activate your card and try again later."
67
+ '91': "Please try again later."
68
+ '92': "Please try again later."
69
+ '94': "Please try again later."
70
+ '96': "Please try again later."
71
+ '98': "Please try again later."
72
+ 'E3': "Please try again later."
73
+ 'E4': "Please try again later or contact your card issuer to get more details"
74
+ 'E5': "Please try again later or contact your card issuer to get more details"
75
+ 'R0': "Please contact your card issuer to get more details and try again later."
76
+ 'R1': "Please contact your card issuer to get more details and try again later."
77
+ targeted:
78
+ merchant:
79
+ <<: *issuer_response_code
80
+ '04': "Pickup card."
81
+ '07': "Pickup card."
82
+ '41': "Lost card."
83
+ '43': "Stolen card."
84
+ cardholder:
85
+ <<: *issuer_response_code
86
+ '04': "Your bank has declined this transaction."
87
+ '07': "Your bank has declined this transaction."
88
+ '41': "Your bank has declined this transaction."
89
+ '43': "Your bank has declined this transaction."
data/lib/locale/ee.yml ADDED
@@ -0,0 +1,89 @@
1
+ ee:
2
+ issuer_response_code: &issuer_response_code
3
+ '00': "Tekkis viga. Tehing lükati Elavoni poolt tagasi sobimatu kaardiliigi, valede kaardiandmete, väljaandja / panga loa puudumise või kaupmehe suletud konto tõttu."
4
+ '05': "Pank lükkas tehingu tagasi, kuna turvalisuskontrollis avastati puudusi (kasutatud kaardiga ei saa teostada korduvtehinguid / makseid ilma CVV-koodita), rahalised vahendid on külmutatud, limiidid ületatud või kaart ei toeta MOTO-/internetitehinguid."
5
+ '13': "MOTO/eCommerce mitteaktiivne või summa limiit ületatud."
6
+ '14': "Kehtetu kaardi number."
7
+ 'N7': "Vale CVV-kood."
8
+ '51': "Puuduvad piisavad vahendid."
9
+ '54': "Kehtivuse kaotanud kaart."
10
+ '57': "Pank lükkas tehingu tagasi, kuna antud krediitkaarti ei saa seda liiki tehingu teostamiseks kasutada (eCommerce, MOTO või korduvtehing)."
11
+ '61': "MOTO/eCommerce mitteaktiivne või summa limiit ületatud."
12
+ '82': "Vale CVV-kood."
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."
36
+ issuer_response_codes:
37
+ suggestion: 'Suggestion'
38
+ fraud_notice: 'IMPORTANT NOTICE: It is forbidden to retry transactions that ended with this code. It may be recognized as a fraud attempt!'
39
+ behaviour:
40
+ '00': "Palun proovige hiljem uuesti, võtke ühendust müüja või Espago klienditoega."
41
+ '05': "Palun kontrollige oma antud liiki tehinguid käsitlevaid kaardi seadeid või kasutage teist kaarti."
42
+ '13': "Palun kontrollige oma konto seadeid ja sätestatud limiite. Palun võtke ühendust oma kaardi väljaandjaga ja proovige hiljem uuesti."
43
+ '14': "Kontrollige sisestatud andmeid ja proovige uuesti."
44
+ 'N7': "Kontrollige sisestatud andmeid ja proovige uuesti."
45
+ '51': "Palun kontrollige oma kontol olevaid vahendeid ja proovige hiljem uuesti."
46
+ '54': "Palun kontrollige oma kaarti või proovige teist kaarti."
47
+ '57': "Palun kontrollige oma antud liiki tehinguid käsitlevaid kaardi seadeid või kasutage teist kaarti."
48
+ '61': "Palun kontrollige oma konto seadeid ja sätestatud limiite. Palun võtke ühendust oma kaardi väljaandjaga ja proovige hiljem uuesti."
49
+ '82': "Kontrollige sisestatud andmeid ja proovige uuesti."
50
+ # incomplete translations
51
+ unknown: "Please contact our support team."
52
+ '01': "Please contact your card issuer."
53
+ '02': "Please contact your card issuer."
54
+ '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}"
57
+ '12': "Please contact your card issuer to get more details and try again later."
58
+ '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}"
61
+ '58': "Please check your card settings for those transaction types or use another card."
62
+ '59': "Please contact your card issuer to get more details and try again later."
63
+ '62': "Please contact your bank."
64
+ '65': "Change your limits settings or try again later."
65
+ '75': "Please check your CVV/CVC/PIN code on your card."
66
+ '78': "Please activate your card and try again later."
67
+ '91': "Please try again later."
68
+ '92': "Please try again later."
69
+ '94': "Please try again later."
70
+ '96': "Please try again later."
71
+ '98': "Please try again later."
72
+ 'E3': "Please try again later."
73
+ 'E4': "Please try again later or contact your card issuer to get more details"
74
+ 'E5': "Please try again later or contact your card issuer to get more details"
75
+ 'R0': "Please contact your card issuer to get more details and try again later."
76
+ 'R1': "Please contact your card issuer to get more details and try again later."
77
+ targeted:
78
+ merchant:
79
+ <<: *issuer_response_code
80
+ '04': "Pickup card."
81
+ '07': "Pickup card."
82
+ '41': "Lost card."
83
+ '43': "Stolen card."
84
+ cardholder:
85
+ <<: *issuer_response_code
86
+ '04': "Your bank has declined this transaction."
87
+ '07': "Your bank has declined this transaction."
88
+ '41': "Your bank has declined this transaction."
89
+ '43': "Your bank has declined this transaction."
data/lib/locale/en.yml ADDED
@@ -0,0 +1,87 @@
1
+ en:
2
+ issuer_response_code: &issuer_response_code
3
+ unknown: "Unknown reason."
4
+ '00': "Transaction rejected due to no response from issuer/bank, inactive Merchant account, used not supported card or incorrect card data."
5
+ '01': "Authorization Error."
6
+ '02': "Authorization Error."
7
+ '03': "Authorization Error."
8
+ '05': "The bank has declined the transaction due to security check (used card doesn't support recurring payments/ payment without CVV code), the funds have been frozen or limit exceeded, or card doesn't support MOTO/internet transactions."
9
+ '12': "No privileges to execute this transaction for your card."
10
+ '13': "Please check settings of your account and configurations of limits."
11
+ '14': "Invalid card number."
12
+ '30': "Your bank has declined this transaction"
13
+ 'N7': "Negative CVV results."
14
+ '51': "Insufficient funds."
15
+ '54': "Expired card."
16
+ '57': "Bank/Issuer has declined the transaction as this credit card cannot be used for this type of transaction (eccommerce, MOTO or recurring)."
17
+ '58': "Your bank has declined this transaction as this credit card cannot be used for this type of transaction (eccommerce, MOTO or recurring)."
18
+ '59': "Your bank has declined this transaction"
19
+ '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."
20
+ '61': "Your bank has declined this transaction"
21
+ '65': "Activity count limit exceeded."
22
+ '75': "Invalid activity count limit exceeded."
23
+ '78': "Inactive card."
24
+ '82': "Negative CVV results."
25
+ '91': "Temporary issuer error."
26
+ '92': "Temporary issuer error."
27
+ '94': "Temporary issuer error."
28
+ '96': "Temporary issuer error."
29
+ '98': "Temporary issuer error."
30
+ 'E3': "Transaction not executed due to a 3D-Secure error."
31
+ 'E4': "Transaction not executed due to a negative 3D-Secure confirmation from your bank."
32
+ 'E5': "Temporary 3D-Secure error."
33
+ 'R0': "Refused by Issuer because Customer requested stop of specific recurring payments."
34
+ 'R1': "Refused by Issuer because Customer requested stop of all recurring payments."
35
+ issuer_response_codes:
36
+ suggestion: 'Suggestion'
37
+ fraud_notice: 'IMPORTANT NOTICE: It is forbidden to retry transactions that ended with this code. It may be recognized as a fraud attempt!'
38
+ behaviour:
39
+ unknown: "Please contact our support team."
40
+ '00': "Check the card's data or please try again later."
41
+ '01': "Please contact your card issuer."
42
+ '02': "Please contact your card issuer."
43
+ '03': "Please contact your card issuer and try again later."
44
+ '04': "Please contact your card issuer and try again later. %{substitute}"
45
+ '05': "Please check your card settings for those transaction types or use another card."
46
+ '07': "Please contact your card issuer and try again later. %{substitute}"
47
+ '12': "Please contact your card issuer to get more details and try again later."
48
+ '13': "Please contact your card issuer and try again later."
49
+ '14': "Check entered data and try again."
50
+ '30': "Please contact your card issuer to get more details and try again later."
51
+ '41': "Please contact your card issuer to get more details and try again later. %{substitute}"
52
+ '43': "Please contact your card issuer to get more details and try again later. %{substitute}"
53
+ 'N7': "Check entered data and try again."
54
+ '51': "Please check funds on your account and try again later."
55
+ '54': "Please check your card or try another."
56
+ '57': "Please check your card settings or use another card."
57
+ '58': "Please check your card settings for those transaction types or use another card."
58
+ '59': "Please contact your card issuer to get more details and try again later."
59
+ '61': "Please check settings of your account and configurations of limits. Please contact your card issuer and try again later."
60
+ '62': "Please contact your bank."
61
+ '65': "Change your limits settings or try again later."
62
+ '75': "Please check your CVV/CVC/PIN code on your card."
63
+ '78': "Please activate your card and try again later."
64
+ '82': "Check entered data and try again."
65
+ '91': "Please try again later."
66
+ '92': "Please try again later."
67
+ '94': "Please try again later."
68
+ '96': "Please try again later."
69
+ '98': "Please try again later."
70
+ 'E3': "Please try again later."
71
+ 'E4': "Please try again later or contact your card issuer to get more details"
72
+ 'E5': "Please try again later or contact your card issuer to get more details"
73
+ 'R0': "Please contact your card issuer to get more details and try again later."
74
+ 'R1': "Please contact your card issuer to get more details and try again later."
75
+ targeted:
76
+ merchant:
77
+ <<: *issuer_response_code
78
+ '04': "Pickup card."
79
+ '07': "Pickup card."
80
+ '41': "Lost card."
81
+ '43': "Stolen card."
82
+ cardholder:
83
+ <<: *issuer_response_code
84
+ '04': "Your bank has declined this transaction."
85
+ '07': "Your bank has declined this transaction."
86
+ '41': "Your bank has declined this transaction."
87
+ '43': "Your bank has declined this transaction."