CreditCardValidations
Gem adds validator to check whether or not a given number actually falls within the ranges of possible numbers prior to performing such verification, and, as such, CreditCardValidations simply verifies that the credit card number provided is well-formed.
More info about card BIN numbers http://en.wikipedia.org/wiki/Bank_card_number
Installation
Add this line to your application's Gemfile:
gem 'credit_card_validations'
And then execute:
$ bundle
Or install it yourself as:
$ gem install credit_card_validations
Usage
The following issuing institutes are accepted:
name | key |
American Express | :amex |
China UnionPay | :unionpay |
Dankrot | :dankrot |
Diners Club | :diners |
Dinner Club US | :diners_us |
Discover | :discover |
Hipercard | :hipercard |
JCB | :jcb |
Laser | :laser |
Maestro | :maestro |
MasterCard | :mastercard |
Rupay | :rupay |
Solo | :solo |
Switch | :switch |
Visa | :visa |
Examples using string monkey patch
require 'credit_card_validations/string'
'5274 5763 9425 9961'.credit_card_brand #=> :mastercard
'5274 5763 9425 9961'.credit_card_brand_name #=> "MasterCard"
'5274 5763 9425 9961'.valid_credit_card_brand?(:mastercard, :visa) #=> true
'5274 5763 9425 9961'.valid_credit_card_brand?(:amex) #=> false
'5274 5763 9425 9961'.valid_credit_card_brand?('MasterCard') #=> true
ActiveModel support
only for certain brads
class CreditCardModel
attr_accessor :number
include ActiveModel::Validations
validates :number, credit_card_number: {brands: [:amex, :maestro]}
end
for all known brands
validates :number, presence: true, credit_card_number: true
Examples using CreditCardValidations::Detector class
number = "4111111111111111"
detector = CreditCardValidations::Detector.new(number)
detector.brand #:visa
detector.visa? #true
detector.valid?(:mastercard,:maestro) #false
detector.valid?(:visa, :mastercard) #true
detector.issuer_category #"Banking and financial"
Also You can add your own brand rules to detect other credit card brands/types passing name,length(integer/array of integers) and prefix(string/array of strings) Example
CreditCardValidations.add_brand(:voyager, {length: 15, prefixes: '86'})
CreditCardValidations.add_brand(:en_route, {
length: 15,
prefixes: ['2014', '2149']
},{skip_luhn: true}) #skip luhn
voyager_test_card_number = '869926275400212'
CreditCardValidations::Detector.new(voyager_test_card_number).brand #:voyager
CreditCardValidations::Detector.new(voyager_test_card_number).voyager? #true
en_route_test_card_number = '2014-0000-0000-001'
CreditCardValidations::Detector.new(en_route_test_card_number).brand #:en_route
CreditCardValidations::Detector.new(en_route_test_card_number).en_route? #true
Remove brands also supported
CreditCardValidations.delete_brand(:maestro)
Check luhn
CreditCardValidations::Detector.new(@credit_card_number).valid_luhn?
#or
CreditCardValidations::Luhn.valid?(@credit_card_number)
Generate credit card numbers that pass validation
CreditCardValidations::Factory.random(:amex)
# => "348051773827666"
CreditCardValidations::Factory.random(:maestro)
# => "6010430241237266856"
Contributing
- Fork it
- Create your feature branch (
git checkout -b my-new-feature
) - Commit your changes (
git commit -am 'Add some feature'
) - Push to the branch (
git push origin my-new-feature
) - Create new Pull Request