1 package Business::CreditCard;
4 use vars qw( @ISA $VERSION $Country );
14 C<Business::CreditCard> - Validate/generate credit card checksums/names
18 use Business::CreditCard;
20 print validate("5276 4400 6542 1319");
21 print cardtype("5276 4400 6542 1319");
22 print generate_last_digit("5276 4400 6542 131");
24 Business::CreditCard is available at a CPAN site near you.
28 These subroutines tell you whether a credit card number is
29 self-consistent -- whether the last digit of the number is a valid
30 checksum for the preceding digits.
32 The validate() subroutine returns 1 if the card number provided passes
33 the checksum test, and 0 otherwise.
35 The cardtype() subroutine returns a string containing the type of
36 card. The list of possible return values is more comprehensive than it used
37 to be, but additions are still most welcome.
39 Possible return values are:
55 "Not a credit card" is returned on obviously invalid data values.
57 Versions before 0.31 may also have returned "Diner's Club/Carte Blanche" (these
58 cards are now recognized as "Discover card").
60 As of 0.30, cardtype() will accept a partial card masked with "x", "X', ".",
61 "*" or "_". Only the first 2-6 digits and the length are significant;
62 whitespace and dashes are removed. To recognize just Visa, MasterCard and
63 Amex, you only need the first two digits; to recognize almost all cards
64 except some Switch cards, you need the first four digits, and to recognize
65 all cards including the remaining Switch cards, you need the first six
68 The generate_last_digit() subroutine computes and returns the last
69 digit of the card given the preceding digits. With a 16-digit card,
70 you provide the first 15 digits; the subroutine returns the sixteenth.
72 This module does I<not> tell you whether the number is on an actual
73 card, only whether it might conceivably be on a real card. To verify
74 whether a card is real, or whether it's been stolen, or to actually process
75 charges, you need a Merchant account. See L<Business::OnlinePayment>.
77 These subroutines will also work if you provide the arguments
78 as numbers instead of strings, e.g. C<validate(5276440065421319)>.
80 =head1 PROCESSING AGREEMENTS
82 Credit card issuers have recently been forming agreements to process cards on
83 other networks, in which one type of card is processed as another card type.
85 By default, Business::CreditCard returns the type the card should be treated as
86 in the US and Canada. You can change this to return the type the card should
87 be treated as in a different country by setting
88 C<$Business::CreditCard::Country> to your two-letter country code. This
89 is probably what you want to determine if you accept the card, or which
90 merchant agreement it is processed through.
92 You can also set C<$Business::CreditCard::Country> to a false value such
93 as the empty string to return the "base" card type. This is probably only
94 useful for informational purposes when used along with the default type.
96 Here are the currently known agreements:
100 =item Most Diner's club is now identified as Discover. (This supercedes the earlier identification of some Diner's club cards as MasterCard inside the US and Canada.)
102 =item JCB cards in the 3528-3589 range are identified as Discover inside the US and Canada.
104 =item China Union Pay cards are identified as Discover cards outside China.
108 =head1 NOTE ON INTENDED PURPOSE
110 This module is for verifying I<real world> B<credit cards>. It is B<NOT> a
111 pedantic implementation of the ISO 7812 standard, a general-purpose LUHN
112 implementation, or intended for use with "creditcard-like account numbers".
118 The Perl Journal and MIT Media Lab
122 Current maintainer is Ivan Kohler <ivan-business-creditcard@420.am>.
123 Please don't bother Jon with emails about this module.
125 Lee Lawrence <LeeL@aspin.co.uk>, Neale Banks <neale@lowendale.com.au> and
126 Max Becker <Max.Becker@firstgate.com> contributed support for additional card
127 types. Lee also contributed a working test.pl. Alexandr Ciornii
128 <alexchorny@gmail.com> contributed code cleanups. Jason Terry
129 <jterry@bluehost.com> contributed updates for Discover BIN ranges.
131 =head1 COPYRIGHT AND LICENSE
133 Copyright (C) 1995,1996,1997 Jon Orwant
134 Copyright (C) 2001-2006 Ivan Kohler
135 Copyright (C) 2007-2014 Freeside Internet Services, Inc.
137 This library is free software; you can redistribute it and/or modify
138 it under the same terms as Perl itself, either Perl version 5.8.8 or,
139 at your option, any later version of Perl 5 you may have available.
143 (paraphrasing Neil Bowers) We export all functions by default. It would be
144 better to let the user decide which functions to import. And validate() is
145 a bit of a generic name.
147 The question is, after almost 2 decades with this interface (inherited from
148 the original author, who probably never expected it to live half this long),
149 how to change things to behave in a more modern fashion without breaking
150 existing code? "use Business::CreditCard <some_minimum_version>" turns it off?
151 Explicitly ask to turn it off and list that in the SYNOPSIS?
155 L<Business::CreditCard::Object> is a wrapper around Business::CreditCard
156 providing an OO interface. Assistance integrating this into the base
157 Business::CreditCard distribution is welcome.
159 L<Business::OnlinePayment> is a framework for processing online payments
160 including modules for various payment gateways.
162 http://neilb.org/reviews/luhn.html is an excellent overview of similar modules
163 providing credit card number verification (LUHN checking).
167 @EXPORT = qw(cardtype validate generate_last_digit);
169 ## ref http://neilb.org/reviews/luhn.html#Comparison it looks like
170 ## Business::CCCheck is 2x faster than we are. looking at their implementation
171 ## not entirely a fair comparison, we also do the equivalent of their CC_clean,
172 ## they don't recognize certain cards at all (i.e. Switch) which require
173 ## an expensive check before VISA, Diners doesn't exist anymore, Discover is
174 ## a lot more than just 6011*, they don't handle processing agreements, etc.
177 # Allow use as a class method
178 shift if UNIVERSAL::isa( $_[0], 'Business::CreditCard' );
182 $number =~ s/[\s\-]//go;
183 $number =~ s/[x\*\.\_]/x/gio;
185 return "Not a credit card" if $number =~ /[^\dx]/io;
189 local $^W=0; #no warning at next line
190 return "Not a credit card"
191 unless ( length($number) >= 13
192 || length($number) == 8 || length($number) == 9 #Isracard
197 return "VISA card" if $number =~ /^4[0-8][\dx]{11}([\dx]{3})?$/o;
200 if $number =~ /^5[1-5][\dx]{14}$/o
201 ;# || ( $number =~ /^36[\dx]{12}/ && $Country =~ /^(US|CA)$/oi );
203 return "American Express card" if $number =~ /^3[47][\dx]{13}$/o;
205 return "Discover card"
206 if $number =~ /^30[0-5][\dx]{11}([\dx]{2})?$/o #diner's: 300-305
207 || $number =~ /^3095[\dx]{10}([\dx]{2})?$/o #diner's: 3095
208 || $number =~ /^3[689][\dx]{12}([\dx]{2})?$/o #diner's: 36 38 and 39
209 || $number =~ /^6011[\dx]{12}$/o
210 || $number =~ /^64[4-9][\dx]{13}$/o
211 || $number =~ /^65[\dx]{14}$/o
212 || ( $number =~ /^62[24-68][\dx]{13}$/o && uc($Country) ne 'CN' ) #CUP
213 || ( $number =~ /^35(2[89]|[3-8][\dx])[\dx]{12}$/o && $Country =~ /^(US|CA)$/oi ); #JCB cards in the 3528-3589 range are identified as Discover inside the US and Canada
216 if $number =~ /^49(03(0[2-9]|3[5-9])|11(0[1-2]|7[4-9]|8[1-2])|36[0-9]{2})[\dx]{10}([\dx]{2,3})?$/o
217 || $number =~ /^564182[\dx]{10}([\dx]{2,3})?$/o
218 || $number =~ /^6(3(33[0-4][0-9])|759[0-9]{2})[\dx]{10}([\dx]{2,3})?$/o;
219 #redunant with above, catch 49* that's not Switch
220 return "VISA card" if $number =~ /^4[\dx]{12}([\dx]{3})?$/o;
222 #return "Diner's Club/Carte Blanche"
223 # if $number =~ /^3(0[0-59]|[68][\dx])[\dx]{11}$/o;
225 #"Diners Club enRoute"
226 return "enRoute" if $number =~ /^2(014|149)[\dx]{11}$/o;
228 return "JCB" if $number =~ /^(3[\dx]{4}|2131|1800)[\dx]{11}$/o;
230 return "BankCard" if $number =~ /^56(10[\dx][\dx]|022[1-5])[\dx]{10}$/o;
233 if $number =~ /^6(3(34[5-9][0-9])|767[0-9]{2})[\dx]{10}([\dx]{2,3})?$/o;
235 return "China Union Pay"
236 if $number =~ /^62[24-68][\dx]{13}$/o;
239 if $number =~ /^6(304|7(06|09|71))[\dx]{12,15}$/o;
242 if $number =~ /^[\dx]{8,9}$/;
247 sub generate_last_digit {
248 # Allow use as a class method
249 shift if UNIVERSAL::isa( $_[0], 'Business::CreditCard' );
253 die "invalid operation" if length($number) == 8 || length($number) == 9;
255 my ($i, $sum, $weight);
259 for ($i = 0; $i < length($number); $i++) {
260 $weight = substr($number, -1 * ($i + 1), 1) * (2 - ($i % 2));
261 $sum += (($weight < 10) ? $weight : ($weight - 9));
264 return (10 - $sum % 10) % 10;
268 ## this (GPLed) code from Business::CCCheck is apparantly 4x faster than ours
269 ## ref http://neilb.org/reviews/luhn.html#Comparison
270 ## maybe see if we can spped ours up a bit
271 # my @ccn = split('',$ccn);
274 # for($i=$#ccn;$i >=0;--$i) {
275 # $ccn[$i] *= 2 if $even;
276 # $ccn -= 9 if $ccn[$i] > 9;
280 # $type = '' if $ccn % 10;
283 # Allow use as a class method
284 shift if UNIVERSAL::isa( $_[0], 'Business::CreditCard' );
288 my ($i, $sum, $weight);
290 return 0 if $number =~ /[^\d\s]/;
294 if ( $number =~ /^[\dx]{8,9}$/ ) { # Isracard
295 $number = "0$number" if length($number) == 8;
296 for($i=1;$i<length($number);$i++){
297 $sum += substr($number,9-$i,1) * $i;
299 return 1 if $sum%11 == 0;
303 return 0 unless length($number) >= 13 && 0+$number;
305 for ($i = 0; $i < length($number) - 1; $i++) {
306 $weight = substr($number, -1 * ($i + 2), 1) * (2 - ($i % 2));
307 $sum += (($weight < 10) ? $weight : ($weight - 9));
310 return 1 if substr($number, -1) == (10 - $sum % 10) % 10;