credit_debit_card_number_validator 16.09.4
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/lib/credit_debit_card_number_validator.rb +95 -0
- data/lib/information.rb +34 -0
- data/lib/tests.rb +51 -0
- data/lib/validator.rb +306 -0
- metadata +47 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA1:
|
3
|
+
metadata.gz: 2fe4b1769f2bdf3e475d7488dc2c3754e6a7ed57
|
4
|
+
data.tar.gz: f4f531805de32ab1fdf42401b02f8c3139519e67
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: 94550e6ffaffba5a1c79232a840131ffb2f59ad461db8427a4f2da0c42e08f93d684fd309602f9176cee068cb249a3dff1a4f88e7020a158f9e7a2862fd82b11
|
7
|
+
data.tar.gz: ffa1ec73b5ec3c653ecde3d429cd7dea68c7fd59fd50851998def3536fe8e4af97aef3568cc5e4f4416749ce7b3c04dd06b07e0713672b8541024c659be058c6
|
@@ -0,0 +1,95 @@
|
|
1
|
+
# Suppoerted Companies:
|
2
|
+
# amex | American Express | 15 | Luhn | 34, 37
|
3
|
+
|
4
|
+
# bc4 | Bankcard | 16 | Luhn | 5610
|
5
|
+
# bc6 | Bankcard | 16 | Luhn | 560221 - 560225
|
6
|
+
|
7
|
+
# cebi | CARDGUARD EAD BG ILS | 16 | Luhn | 5392
|
8
|
+
|
9
|
+
# cup | China UnionPay | 16, 17, 18, 19 | Unk | 622, 624 - 626, 628
|
10
|
+
|
11
|
+
# dn | Dancord | 16 | Luhn | 5019
|
12
|
+
|
13
|
+
# dccb | Diners Club Carte Blanche | 14 | Luhn | 300 - 305
|
14
|
+
# dcer | Diners Club enRoute | 15 | No V | 2014, 2149
|
15
|
+
# dcint2 | Diners Club International | 14 | Luhn | 36, 38, 39
|
16
|
+
# dcint3 | Diners Club International | 14 | Luhn | 309
|
17
|
+
|
18
|
+
# disc2 | Discover Card | 16 | Luhn | 65
|
19
|
+
# disc3 | Discover Card | 16 | Luhn | 644 - 649
|
20
|
+
# disc4 | Discover Card | 16 | Luhn | 6011
|
21
|
+
# disc6 | Discover Card | 16 | Luhn | 622126 - 622925
|
22
|
+
|
23
|
+
# hc | Hipercard | 19 | Luhn | 348
|
24
|
+
|
25
|
+
# ipi | InstaPayment | 16 | Luhn | 637 - 639
|
26
|
+
|
27
|
+
# ipr | InterPayment | 16, 17, 18, 19 | Luhn | 636
|
28
|
+
|
29
|
+
# jcb3 | JCB | 15, 16 | Luhn | 353 - 358
|
30
|
+
# jcb4 | JCB | 15, 16 | Luhn | 3528, 3589, 3088, 3112, 3337, 3158, 3096, 1000, 2131
|
31
|
+
# jcb6 | JCB | 15, 16 | Luhn | 357266
|
32
|
+
|
33
|
+
# laser | Laser | 16, 17, 18, 19 | Luhn | 6304, 6706, 6771, 6709
|
34
|
+
|
35
|
+
# maes2 | Maestro | 12 ........ 19 | Luhn | 56 - 59
|
36
|
+
# maes3 | Maestro | 12 ........ 19 | Luhn | 502 - 509, 602 - 605, 671 - 675, 500, 621, 627, 629, 677, 679
|
37
|
+
# maes4 | Maestro | 12 ........ 19 | Luhn | 5010 - 5018, 6010, 6012 - 6019, 6760 - 6766, 6768 - 6771, 6060, 6304, 6390
|
38
|
+
|
39
|
+
# mc2 | Master Card | 16 | Luhn | 51 - 55, 23 - 26
|
40
|
+
# mc3 | Master Card | 16 | Luhn | 223 - 229, 271
|
41
|
+
# mc4 | Master Card | 16 | Luhn | 2221 - 2229, 2720
|
42
|
+
|
43
|
+
# rupay3 | RuPay | 16 | Unk | 607, 608
|
44
|
+
# rupay4 | RuPay | 16 | Unk | 6061 - 6069
|
45
|
+
|
46
|
+
# solo | Solo | 16, 18, 19 | Luhn | 6334, 6767
|
47
|
+
|
48
|
+
# swch4 | Switch | 16, 18, 19 | Luhn | 4903, 4905, 4911, 4936, 6333, 6759
|
49
|
+
# swch6 | Switch | 16, 18, 19 | Luhn | 633312, 633110, 633304, 633303, 633301, 633300
|
50
|
+
|
51
|
+
# uatp | UATP | 15 | Luhn | 1
|
52
|
+
|
53
|
+
# verve | Verve | 16, 19 | Luhn | 506099 - 506198, 650002 - 650027
|
54
|
+
|
55
|
+
# visae4 | Visa Electron | 13, 16 | Luhn | 4026, 4508, 4844, 4913, 4917
|
56
|
+
# visae6 | Visa Electron | 13, 16 | Luhn | 417500
|
57
|
+
|
58
|
+
# visa | Visa | 13, 16 | Luhn | 4
|
59
|
+
|
60
|
+
# voy | Voyager | 15 | Luhn | 8699
|
61
|
+
|
62
|
+
# Supported companies with other brands:
|
63
|
+
# dcuc | Diners Club US and Canada | 16 | Luhn | 54, 55 | Master Card
|
64
|
+
|
65
|
+
# Resources:
|
66
|
+
# http://blog.groundlabs.com/cardholder-data-discovery-anatomy-of-a-credit-card-bin-ranges-luhn-checks
|
67
|
+
# http://en.wikipedia.org/wiki/Payment_card_number
|
68
|
+
# http://www.iinbase.com
|
69
|
+
# http://www.getcreditcardnumbers.com
|
70
|
+
# http://planetcalc.com/2464/
|
71
|
+
|
72
|
+
# require classes files
|
73
|
+
require 'validator'
|
74
|
+
require 'information'
|
75
|
+
|
76
|
+
# CreditDebitCardNumberValidator module
|
77
|
+
# main module containe gem classes
|
78
|
+
# use this module to deal with gem classes,
|
79
|
+
# create objects and work with class methods
|
80
|
+
# to validate your data
|
81
|
+
module CreditDebitCardNumberValidator
|
82
|
+
|
83
|
+
# Validator class
|
84
|
+
# validate and gathering information about card number
|
85
|
+
# 11 methods
|
86
|
+
# it is included using require 'validator'
|
87
|
+
class Validator
|
88
|
+
end
|
89
|
+
|
90
|
+
# Information class
|
91
|
+
# store all card number information
|
92
|
+
# it is included using require 'information'
|
93
|
+
class Information
|
94
|
+
end
|
95
|
+
end
|
data/lib/information.rb
ADDED
@@ -0,0 +1,34 @@
|
|
1
|
+
# CreditDebitCardNumberValidator module
|
2
|
+
# main module containe gem classes
|
3
|
+
# use this module to deal with gem classes,
|
4
|
+
# create objects and work with class methods
|
5
|
+
# to validate your data
|
6
|
+
module CreditDebitCardNumberValidator
|
7
|
+
|
8
|
+
# Information class
|
9
|
+
# store all card number information to return it later
|
10
|
+
class Information
|
11
|
+
|
12
|
+
# make all class variables accessible
|
13
|
+
attr_accessor :card_number, :is_valid, :mod_10_result, :iin, :brand, :check_digit, :length
|
14
|
+
|
15
|
+
# initializer to initialize all class variables
|
16
|
+
# class variables:
|
17
|
+
# @card_number -> store card number
|
18
|
+
# @is_valid -> store luhn algorithm result
|
19
|
+
# @mod_10_result -> store mod 10 result from luhn algorithm
|
20
|
+
# @iin -> store card number IIN Range
|
21
|
+
# @brand -> store card brand
|
22
|
+
# @check_digit -> store the next check digit of card number
|
23
|
+
# @length -> store card number length
|
24
|
+
def initialize
|
25
|
+
@card_number = 0
|
26
|
+
@is_valid = false
|
27
|
+
@mod_10_result = 0
|
28
|
+
@iin = 0
|
29
|
+
@brand = ''
|
30
|
+
@check_digit = ''
|
31
|
+
@length = 0
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
data/lib/tests.rb
ADDED
@@ -0,0 +1,51 @@
|
|
1
|
+
# require gem
|
2
|
+
require 'credit_debit_card_number_validator'
|
3
|
+
|
4
|
+
# test almost brand supported by gem
|
5
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('348998173777802') # American Express
|
6
|
+
puts
|
7
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('6264185212922132067') # China UnionPay
|
8
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('6288997715452584') # China UnionPay
|
9
|
+
puts
|
10
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('5019717010103742') # Dancord
|
11
|
+
puts
|
12
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('30350713037359') # Diners Club Carte Blanche
|
13
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('214914222364956') # Diners Club enRoute
|
14
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('36014781278733') # Diners Club International
|
15
|
+
puts
|
16
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('6011622563605042') # Discover
|
17
|
+
puts
|
18
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('3841005899088180330') # Hipercard
|
19
|
+
puts
|
20
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('6380654534552139') # InstaPayment
|
21
|
+
puts
|
22
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('3572660000000000006') # JCB
|
23
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('3337910604152361') # JCB
|
24
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('180001638277392') # JCB
|
25
|
+
puts
|
26
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('6706020938769058234') # Laser
|
27
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('677180246316181805') # Laser
|
28
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('63049092800799270') # Laser
|
29
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('6304445859171404') # Laser
|
30
|
+
puts
|
31
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('6799990100000000019') # Maestro
|
32
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('639002000000000003') # Maestro
|
33
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('6762470273176461') # Maestro
|
34
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('50339619890917') # Maestro
|
35
|
+
puts
|
36
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('5501943861489569') # Mastercard
|
37
|
+
puts
|
38
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('6076600006199992') # RuPay
|
39
|
+
puts
|
40
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('6767622222222222222') # Solo
|
41
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('633473060000000000') # Solo
|
42
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('6334900000000005') # Solo
|
43
|
+
puts
|
44
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('6331101999990016') # Switch
|
45
|
+
puts
|
46
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('4929334156772439') # Visa
|
47
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('4556462552594') # Visa
|
48
|
+
puts
|
49
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('4913727680252737') # Visa Electron
|
50
|
+
puts
|
51
|
+
p CreditDebitCardNumberValidator::Validator.all_information_about('869973319748289') # Voyager
|
data/lib/validator.rb
ADDED
@@ -0,0 +1,306 @@
|
|
1
|
+
# CreditDebitCardNumberValidator module
|
2
|
+
# main module containe gem classes
|
3
|
+
# use this module to deal with gem classes,
|
4
|
+
# create objects and work with class methods
|
5
|
+
# to validate your data
|
6
|
+
module CreditDebitCardNumberValidator
|
7
|
+
|
8
|
+
# Validator class
|
9
|
+
# validate and gathering information about card number
|
10
|
+
# 11 methods
|
11
|
+
class Validator
|
12
|
+
|
13
|
+
# class method > check
|
14
|
+
# check card_number variable is contain digits on it or not
|
15
|
+
# if there is not digits the method raise ArgumentError
|
16
|
+
# with message 'no card number specified'
|
17
|
+
def self.check card_number
|
18
|
+
raise ArgumentError, "no card number specified" if card_number.to_i == 0
|
19
|
+
end
|
20
|
+
|
21
|
+
# class method > all_info
|
22
|
+
# get every information about card number and
|
23
|
+
# return them in object of type Information class
|
24
|
+
# return example: #<CreditDebitCardNumberValidator::Information:0x2eb4b90 @card_number="4929334156772439", @is_valid=true, @mod_10_result=0, @iin=4, @brand="Visa", @check_digit="9", @length=16>
|
25
|
+
def self.all_information_about card_number
|
26
|
+
|
27
|
+
# check card_number variable
|
28
|
+
check card_number
|
29
|
+
|
30
|
+
# create new object of type Information class
|
31
|
+
# to store information in it
|
32
|
+
info = Information.new
|
33
|
+
|
34
|
+
# validate and gathering information and store them in info object
|
35
|
+
info.card_number = card_number
|
36
|
+
info.is_valid, info.mod_10_result = validate card_number
|
37
|
+
info.iin, info.brand = determine_iin_and_brand card_number
|
38
|
+
info.check_digit = next_check_digit card_number
|
39
|
+
info.length = number_length card_number
|
40
|
+
|
41
|
+
# return info object that contain information about the card number
|
42
|
+
info
|
43
|
+
end
|
44
|
+
|
45
|
+
# class method > validate
|
46
|
+
# validate card number using luhn algorithm and return array contain
|
47
|
+
# true if the number pass the test or false otherwise with mod 10 result
|
48
|
+
# return example: [true, 0]
|
49
|
+
# return example: {'luhn test' => (true), 'mod 10 result' => 0}
|
50
|
+
def self.validate card_number
|
51
|
+
|
52
|
+
# check card_number variable
|
53
|
+
check card_number
|
54
|
+
|
55
|
+
# initialize variable to do the luhn test
|
56
|
+
total = 0
|
57
|
+
|
58
|
+
# apply the test
|
59
|
+
if card_number.size.even?
|
60
|
+
# if card number length is even
|
61
|
+
card_number.split('').each_with_index { |e, i| i.even? ? total += ((e.to_i * 2) > 9 ? (e.to_i * 2) - 9 : (e.to_i * 2)) : total += e.to_i }
|
62
|
+
else
|
63
|
+
# if card number length is odd
|
64
|
+
card_number.split('').each_with_index { |e, i| i.odd? ? total += ((e.to_i * 2) > 9 ? (e.to_i * 2) - 9 : (e.to_i * 2)) : total += e.to_i }
|
65
|
+
end
|
66
|
+
|
67
|
+
# return the result
|
68
|
+
[total % 10 == 0, total % 10]
|
69
|
+
end
|
70
|
+
|
71
|
+
# class method > luhn_test
|
72
|
+
# validate card number using luhn algorithm and return
|
73
|
+
# true if the number pass the test or false otherwise
|
74
|
+
# return example: true
|
75
|
+
def self.luhn_test card_number
|
76
|
+
|
77
|
+
# check card_number variable
|
78
|
+
check card_number
|
79
|
+
|
80
|
+
(validate card_number)[0]
|
81
|
+
end
|
82
|
+
|
83
|
+
# class method > mod_10_result
|
84
|
+
# validate card number using luhn algorithm and return mod 10 result
|
85
|
+
# return example: 0
|
86
|
+
def self.mod_10_result card_number
|
87
|
+
|
88
|
+
# check card_number variable
|
89
|
+
check card_number
|
90
|
+
|
91
|
+
(validate card_number)[1]
|
92
|
+
end
|
93
|
+
|
94
|
+
# class method > determine_iin_and_brand
|
95
|
+
# determine card brand using IIN Ranges and return array contain
|
96
|
+
# the IIN of the card number and the brand name
|
97
|
+
# return example: [37, 'American Express']
|
98
|
+
# return example: {'IIN' => 37, 'Brand Name' => 'American Express'}
|
99
|
+
def self.determine_iin_and_brand card_number
|
100
|
+
|
101
|
+
# check card_number variable
|
102
|
+
check card_number
|
103
|
+
|
104
|
+
# calculate card number length
|
105
|
+
length = card_number.size
|
106
|
+
|
107
|
+
# preparation IIN Ranges from card number
|
108
|
+
iin1 = card_number[0]
|
109
|
+
iin2 = card_number[0..1]
|
110
|
+
iin3 = card_number[0..2]
|
111
|
+
iin4 = card_number[0..3]
|
112
|
+
iin6 = card_number[0..5]
|
113
|
+
|
114
|
+
# test all IIN Ranges of supported brands
|
115
|
+
if (['34', '37'].include? (iin2)) && length == 15
|
116
|
+
[iin2.to_i, 'American Express']
|
117
|
+
# {'IIN' => iin2.to_i, 'Company Name' => 'American Express'}
|
118
|
+
elsif iin4 == '5610' && length == 16
|
119
|
+
[iin4.to_i, 'Bankcard']
|
120
|
+
# {'IIN' => iin4.to_i, 'Company Name' => 'Bankcard'}
|
121
|
+
elsif (('560221'..'560225').include? (iin6)) && length == 16
|
122
|
+
[iin6.to_i, 'Bankcard']
|
123
|
+
# {'IIN' => iin6.to_i, 'Company Name' => 'Bankcard'}
|
124
|
+
elsif iin4 == '5392' && length == 16
|
125
|
+
[iin4.to_i, 'CARDGUARD EAD BG ILS']
|
126
|
+
# {'IIN' => iin4.to_i, 'Company Name' => 'CARDGUARD EAD BG ILS'}
|
127
|
+
elsif (['622', '624', '625', '626', '628'].include? (iin3)) && (length >= 16 && length <= 19)
|
128
|
+
[iin3.to_i, 'China UnionPay']
|
129
|
+
# {'IIN' => iin3.to_i, 'Company Name' => 'China UnionPay'}
|
130
|
+
elsif iin4 == '5019' && length == 16
|
131
|
+
[iin4.to_i, 'Dankort']
|
132
|
+
# {'IIN' => iin4.to_i, 'Company Name' => 'Dankort'}
|
133
|
+
elsif (('301'..'305').include? (iin3)) && length == 14
|
134
|
+
[iin3.to_i, 'Diners Club Carte Blanche']
|
135
|
+
# {'IIN' => iin3.to_i, 'Company Name' => 'Diners Club Carte Blanche'}
|
136
|
+
elsif (['2014', '2149'].include? (iin4)) && length == 15
|
137
|
+
[iin4.to_i, 'Diners Club Carte enRoute']
|
138
|
+
# {'IIN' => iin4.to_i, 'Company Name' => 'Diners Club Carte enRoute'}
|
139
|
+
elsif (['36', '38', '39'].include? (iin2)) && length == 14
|
140
|
+
[iin2.to_i, 'Diners Club International']
|
141
|
+
# {'IIN' => iin2.to_i, 'Company Name' => 'Diners Club International'}
|
142
|
+
elsif iin3 == '309' && length == 14
|
143
|
+
[iin3.to_i, 'Diners Club International']
|
144
|
+
# {'IIN' => iin3.to_i, 'Company Name' => 'Diners Club International'}
|
145
|
+
elsif iin2 == '65' && length == 16
|
146
|
+
[iin2.to_i, 'Discover Card']
|
147
|
+
# {'IIN' => iin2.to_i, 'Company Name' => 'Discover Card'}
|
148
|
+
elsif (('644'..'649').include? (iin3)) && length == 16
|
149
|
+
[iin3.to_i, 'Discover Card']
|
150
|
+
# {'IIN' => iin3.to_i, 'Company Name' => 'Discover Card'}
|
151
|
+
elsif iin4 == '6011' && length == 16
|
152
|
+
[iin4.to_i, 'Discover Card']
|
153
|
+
# {'IIN' => iin4.to_i, 'Company Name' => 'Discover Card'}
|
154
|
+
elsif (('622126'..'622925').include? (iin6)) && length == 16
|
155
|
+
[iin6.to_i, 'Discover Card']
|
156
|
+
# {'IIN' => iin6.to_i, 'Company Name' => 'Discover Card'}
|
157
|
+
elsif iin3 == '384' && length == 19
|
158
|
+
[iin3.to_i, 'Hipercard']
|
159
|
+
# {'IIN' => iin3.to_i, 'Company Name' => 'Hipercard'}
|
160
|
+
elsif (('637'..'639').include? (iin3)) && length == 16
|
161
|
+
[iin3.to_i, 'InstaPayment']
|
162
|
+
# {'IIN' => iin3.to_i, 'Company Name' => 'InstaPayment'}
|
163
|
+
elsif iin3 == '636' && (length >= 16 && length <= 19)
|
164
|
+
[iin3.to_i, 'InterPayment']
|
165
|
+
# {'IIN' => iin3.to_i, 'Company Name' => 'InterPayment'}
|
166
|
+
elsif (('353'..'358').include? (iin3)) && (length == 15 || length == 16)
|
167
|
+
[iin3.to_i, 'JCB']
|
168
|
+
# {'IIN' => iin3.to_i, 'Company Name' => 'JCB'}
|
169
|
+
elsif ((('3528'..'3589').include? (iin4)) || (['3088', '3096', '3112', '3158', '3337'].include? (iin4))) && (length == 15 || length == 16)
|
170
|
+
[iin4.to_i, 'JCB']
|
171
|
+
# {'IIN' => iin4.to_i, 'Company Name' => 'JCB'}
|
172
|
+
elsif (['1800', '2131'].include? (iin4)) && length == 15
|
173
|
+
[iin4.to_i, 'JCB']
|
174
|
+
# {'IIN' => iin4.to_i, 'Company Name' => 'JCB'}
|
175
|
+
elsif iin6 == '357266' && length == 19
|
176
|
+
[iin6.to_i, 'JCB']
|
177
|
+
# {'IIN' => iin6.to_i, 'Company Name' => 'JCB'}
|
178
|
+
elsif (['6304', '6706', '6771', '6709'].include? (iin4)) && (length >= 16 && length <= 19)
|
179
|
+
[iin4.to_i, 'Laser']
|
180
|
+
# {'IIN' => iin4.to_i, 'Company Name' => 'Laser'}
|
181
|
+
elsif (('56'..'59').include? (iin2)) && (length >= 12 && length <= 19)
|
182
|
+
[iin2.to_i, 'Maestro']
|
183
|
+
# {'IIN' => iin2.to_i, 'Company Name' => 'Maestro'}
|
184
|
+
elsif ((('502'..'509').include? (iin3)) || (('602'..'605').include? (iin3)) || (('671'..'675').include? (iin3)) || (['500', '621', '627', '629', '677', '679'].include? (iin3))) && (length >= 12 && length <= 19)
|
185
|
+
[iin3.to_i, 'Maestro']
|
186
|
+
# {'IIN' => iin3.to_i, 'Company Name' => 'Maestro'}
|
187
|
+
elsif ((('5010'..'5018').include? (iin4)) || (('6012'..'6019').include? (iin4)) || (('6760'..'6766').include? (iin4)) || (('6768'..'6771').include? (iin4)) || (['6060', '6304', '6390', '6010'].include? (iin4))) && (length >= 12 && length <= 19)
|
188
|
+
[iin4.to_i, 'Maestro']
|
189
|
+
# {'IIN' => iin4.to_i, 'Company Name' => 'Maestro'}
|
190
|
+
elsif ((('51'..'55').include? (iin2)) || (('23'..'26').include? (iin2))) && length == 16
|
191
|
+
[iin2.to_i, 'Master Card']
|
192
|
+
# {'IIN' => iin2.to_i, 'Company Name' => 'Master Card'}
|
193
|
+
elsif ((('223'..'229').include? (iin3)) || iin3 == '271') && length == 16
|
194
|
+
[iin3.to_i, 'Master Card']
|
195
|
+
# {'IIN' => iin3.to_i, 'Company Name' => 'Master Card'}
|
196
|
+
elsif ((('2221'..'2229').include? (iin4)) || iin4 == '2720') && length == 16
|
197
|
+
[iin4.to_i, 'Master Card']
|
198
|
+
# {'IIN' => iin4.to_i, 'Company Name' => 'Master Card'}
|
199
|
+
elsif (['607', '608'].include? (iin3)) && length == 16
|
200
|
+
[iin3.to_i, 'RuPay']
|
201
|
+
# {'IIN' => iin3.to_i, 'Company Name' => 'RuPay'}
|
202
|
+
elsif (('6061'..'6069').include? (iin4)) && length == 16
|
203
|
+
[iin4.to_i, 'RuPay']
|
204
|
+
# {'IIN' => iin4.to_i, 'Company Name' => 'RuPay'}
|
205
|
+
elsif (['6334', '6767'].include? (iin4)) && (length == 16 || length == 18 || length == 19)
|
206
|
+
[iin4.to_i, 'Solo']
|
207
|
+
# {'IIN' => iin4.to_i, 'Company Name' => 'Solo'}
|
208
|
+
elsif (['4903', '4905', '4911', '4936', '6333', '6759'].include? (iin4)) && (length == 16 || length == 18 || length == 19)
|
209
|
+
[iin4.to_i, 'Switch']
|
210
|
+
# {'IIN' => iin4.to_i, 'Company Name' => 'Switch'}
|
211
|
+
elsif (['633312', '633110', '633304', '633303', '633301', '633300'].include? (iin6)) && (length == 16 || length == 18 || length == 19)
|
212
|
+
[iin6.to_i, 'Switch']
|
213
|
+
# {'IIN' => iin6.to_i, 'Company Name' => 'Switch'}
|
214
|
+
elsif iin1 == '1' && length == 15
|
215
|
+
[iin1.to_i, 'UATP']
|
216
|
+
# {'IIN' => iin1.to_i, 'Company Name' => 'UATP'}
|
217
|
+
elsif (('506099'..'506198').include? (iin6)) || (('650002'..'650027').include? (iin6)) && (length == 16 || length == 19)
|
218
|
+
[iin6.to_i, 'Verve']
|
219
|
+
# {'IIN' => iin6.to_i, 'Company Name' => 'Verve'}
|
220
|
+
elsif (['4026', '4508', '4844', '4913', '4917'].include? (iin4)) && (length == 13 || length == 16)
|
221
|
+
[iin4.to_i, 'Visa Electron']
|
222
|
+
# {'IIN' => iin4.to_i, 'Company Name' => 'Visa Electron'}
|
223
|
+
elsif iin6 == '417500' && (length == 13 || length == 16)
|
224
|
+
[iin6.to_i, 'Visa Electron']
|
225
|
+
# {'IIN' => iin6.to_i, 'Company Name' => 'Visa Electron'}
|
226
|
+
elsif iin1 == '4' && (length == 13 || length == 16)
|
227
|
+
[iin1.to_i, 'Visa']
|
228
|
+
# {'IIN' => iin1.to_i, 'Company Name' => 'Visa'}
|
229
|
+
elsif iin4 == '8699' && length == 15
|
230
|
+
[iin4.to_i, 'Voyager']
|
231
|
+
# {'IIN' => iin4.to_i, 'Company Name' => 'Voyager'}
|
232
|
+
else
|
233
|
+
# return 0 as IIN Range and Unknown as brand name if card number is not determined
|
234
|
+
[0, 'Unknown']
|
235
|
+
# {'IIN' => 0, 'Brand Name' => 'Unknown'}
|
236
|
+
end
|
237
|
+
end
|
238
|
+
|
239
|
+
# class method > determine_iin
|
240
|
+
# determine card IIN Ranges and return it
|
241
|
+
# return example: 37
|
242
|
+
def self.determine_iin card_number
|
243
|
+
|
244
|
+
# check card_number variable
|
245
|
+
check card_number
|
246
|
+
|
247
|
+
(determine_iin_and_company card_number)[0]
|
248
|
+
end
|
249
|
+
|
250
|
+
# class method > determine_brand
|
251
|
+
# determine card brand using IIN Ranges and return it
|
252
|
+
# return example: 'Visa'
|
253
|
+
def self.determine_brand card_number
|
254
|
+
|
255
|
+
# check card_number variable
|
256
|
+
check card_number
|
257
|
+
|
258
|
+
(determine_iin_and_brand card_number)[1]
|
259
|
+
end
|
260
|
+
|
261
|
+
# class method > next_check_digit
|
262
|
+
# calculate the next check digit of card number and return it
|
263
|
+
# return example: '3'
|
264
|
+
def self.next_check_digit card_number
|
265
|
+
|
266
|
+
# check card_number variable
|
267
|
+
check card_number
|
268
|
+
|
269
|
+
# calculate mod 10 result by applying luhn algorithm
|
270
|
+
tmp = (validate (card_number + '0'))[1]
|
271
|
+
|
272
|
+
# if mod 10 result equal to 0 return 0 else subtract the result from 10 and return
|
273
|
+
tmp == 0 ? '0' : (10 - tmp).to_s
|
274
|
+
end
|
275
|
+
|
276
|
+
# class method > next_check_digits
|
277
|
+
# calculate the next check digits of card number and return them
|
278
|
+
# return example: '91834'
|
279
|
+
def self.next_check_digits card_number, number
|
280
|
+
|
281
|
+
# check card_number variable
|
282
|
+
check card_number
|
283
|
+
|
284
|
+
# initialize variable to return it
|
285
|
+
tmp = ''
|
286
|
+
|
287
|
+
# add next check digits
|
288
|
+
number.times { tmp += (card_number += next_check_digit card_number)[-1] }
|
289
|
+
|
290
|
+
# return next check digits
|
291
|
+
tmp
|
292
|
+
end
|
293
|
+
|
294
|
+
# class method > number_length
|
295
|
+
# calculate and return card number length
|
296
|
+
# return example: 16
|
297
|
+
def self.number_length card_number
|
298
|
+
|
299
|
+
# check card_number variable
|
300
|
+
check card_number
|
301
|
+
|
302
|
+
# return card number length
|
303
|
+
card_number.size
|
304
|
+
end
|
305
|
+
end
|
306
|
+
end
|
metadata
ADDED
@@ -0,0 +1,47 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: credit_debit_card_number_validator
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 16.09.4
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Ali Osm
|
8
|
+
autorequire:
|
9
|
+
bindir: bin
|
10
|
+
cert_chain: []
|
11
|
+
date: 2016-08-13 00:00:00.000000000 Z
|
12
|
+
dependencies: []
|
13
|
+
description: A simple way to validate credit/debit card number uring ruby
|
14
|
+
email: aliosm1997@gmail.com
|
15
|
+
executables: []
|
16
|
+
extensions: []
|
17
|
+
extra_rdoc_files: []
|
18
|
+
files:
|
19
|
+
- lib/credit_debit_card_number_validator.rb
|
20
|
+
- lib/validator.rb
|
21
|
+
- lib/information.rb
|
22
|
+
- lib/tests.rb
|
23
|
+
homepage: https://github.com/AliOsm/credit_debit_card_number_validator
|
24
|
+
licenses:
|
25
|
+
- MIT
|
26
|
+
metadata: {}
|
27
|
+
post_install_message:
|
28
|
+
rdoc_options: []
|
29
|
+
require_paths:
|
30
|
+
- lib
|
31
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
32
|
+
requirements:
|
33
|
+
- - '>='
|
34
|
+
- !ruby/object:Gem::Version
|
35
|
+
version: '0'
|
36
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - '>='
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0'
|
41
|
+
requirements: []
|
42
|
+
rubyforge_project:
|
43
|
+
rubygems_version: 2.0.14.1
|
44
|
+
signing_key:
|
45
|
+
specification_version: 4
|
46
|
+
summary: Validator
|
47
|
+
test_files: []
|