[interchange] Update credit card type detection

Jon Jensen <[email protected]>
Newsgroups gmane.comp.web.interchange.cvs
Message-ID <[email protected]>
commit cbe37a81e6ddda4f0292a39c79f81b9d9344de6e
Author: Jon Jensen <[email protected]>
Date:   Thu Oct 13 14:51:23 2011 -0600

    Update credit card type detection
    
    Most important are the changes to Discover and Diners Club updates, but
    some other minor ones matter too.
    
    Discover's changes are documented here:
    
    https://www.discovernetworkvar.com/common/pdf/var/10-1_VAR_ALERT_April_2010.pdf
    
    Some code borrowed from Business::CreditCard again.

 lib/Vend/Order.pm |   71 +++++++++++++++++++++++++++++++---------------------
 1 files changed, 42 insertions(+), 29 deletions(-)
---
diff --git a/lib/Vend/Order.pm b/lib/Vend/Order.pm
index b0a47bf..4f9f0a4 100644
--- a/lib/Vend/Order.pm
+++ b/lib/Vend/Order.pm
@@ -455,7 +455,7 @@ sub guess_cc_type {
 	my ($ccnum) = @_;
 	$ccnum =~ s/\D+//g;
 
-	my $country = $::Values->{$::Variable->{MV_COUNTRY_FIELD} || 'country'} || '';
+	my $country = uc($::Values->{$::Variable->{MV_COUNTRY_FIELD} || 'country'} || '');
 
 	if(my $subname = $Vend::Cfg->{SpecialSub}{guess_cc_type}) {
 		my $sub = $Vend::Cfg->{Sub}{$subname} || $Global::GlobalSub->{$subname};
@@ -466,53 +466,66 @@ sub guess_cc_type {
 	}
 
 	# based on logic from Business::CreditCard
-	if ($ccnum eq '')										{ '' }
-	elsif (
-		$ccnum =~ /^4(?:\d{12}|\d{15})$/
-	)			
-	{
-		return 'visa';
-	}
-	elsif (
-		$ccnum =~ /^5[1-5]\d{14}$/
-			or
-		( $ccnum =~ /^36\d{12}/ && $country =~ /^(US|CA)$/oi )
-	)
+	if ($ccnum eq '')
+	{ return '' }
+
+	elsif ($ccnum =~ /^4(?:\d{12}|\d{15})$/)
+	{ return 'visa' }
+
+	elsif ($ccnum =~ /^5[1-5]\d{14}$/)
 	{ return 'mc' }
-	elsif (
-		$ccnum =~ /^6011\d{12}$/
-			or
-		$ccnum =~ /^65\d{14}$/o
-	    or
-		( $ccnum =~ /^622\d{13}$/o && $country !~ /^CN$/i )
 
-		)
+	elsif (
+		$ccnum =~ /^30[0-5]\d{11}(?:\d{2})?$/   # Diners Club: 300-305
+		or $ccnum =~ /^3095\d{10}(?:\d{2})?$/   # Diners Club: 3095
+		or $ccnum =~ /^3[68]\d{12}(?:\d{2})?$/  # Diners Club: 36
+		or $ccnum =~ /^6011\d{12}$/
+		or $ccnum =~ /^64[4-9]\d{13}$/
+		or $ccnum =~ /^65\d{14}$/
+		or ( $ccnum =~ /^62[24-68]\d{13}$/ and $country ne 'CN' )  # China Unionpay
+		or ( $ccnum =~ /^35(?:2[89]|[3-8]\d)\d{10}$/ and $country eq 'US' )  # JCB
+	)
 	{ return 'discover' }
-	elsif ($ccnum =~ /^3[47]\d{10,13}$/)
+
+	elsif ($ccnum =~ /^3[47]\d{13}$/)
 	{ return 'amex' }
+
 	elsif ($ccnum =~ /^3(?:6\d{12}|0[0-5]\d{11})$/)
 	{ return 'dinersclub' }
+
 	elsif ($ccnum =~ /^38\d{12}$/)
 	{ return 'carteblanche' }
+
 	elsif ($ccnum =~ /^2(?:014|149)\d{11}$/)
 	{ return 'enroute' }
+
 	elsif ($ccnum =~ /^(?:3\d{15}|2131\d{11}|1800\d{11})$/)
 	{ return 'jcb' }
-    elsif (
-		$ccnum =~ /^49(03(0[2-9]|3[5-9])|11(0[1-2]|7[4-9]|8[1-2])|36[0-9]{2})\d{10}(\d{2,3})?$/
-      or $ccnum =~ /^564182\d{10}(\d{2,3})?$/
-      or $ccnum =~ /^6(3(33[0-4][0-9])|759[0-9]{2})\d{10}(\d{2,3})?$/) 
+
+	elsif (
+		$ccnum =~ /^49(?:03(?:0[2-9]|3[5-9])|11(?:0[1-2]|7[4-9]|8[1-2])|36[0-9]{2})\d{10}(?:\d{2,3})?$/
+		or $ccnum =~ /^564182\d{10}(?:\d{2,3})?$/
+		or $ccnum =~ /^6(?:3(?:33[0-4][0-9])|759[0-9]{2})\d{10}(?:\d{2,3})?$/
+	)
 	{ return 'switch' }
-	elsif ($ccnum =~ /^56\d{14}$/)
+
+	elsif ($ccnum =~ /^56(?:10\d\d|022[1-5])\d{10}$/)
 	{ return 'bankcard' }
-    elsif ($ccnum =~ /^6(3(34[5-9][0-9])|767[0-9]{2})\d{10}(\d{2,3})?$/)
+
+	elsif ($ccnum =~ /^6(?:3(?:34[5-9][0-9])|767[0-9]{2})\d{10}(?:\d{2,3})?$/)
 	{ return 'solo' }
-    elsif ($ccnum =~ /^622\d{13}$/)
+
+	elsif ($ccnum =~ /^62[24-68]\d{13}$/)
 	{ return 'chinaunionpay' }
 
-	else { return $::Variable->{MV_PAYMENT_OTHER_CARD} || 'other' }
+	elsif ($ccnum =~ /^6(?:304|7(?:06|09|71))\d{12,15}$/)
+	{ return 'laser' }
+
+	else
+	{ return $::Variable->{MV_PAYMENT_OTHER_CARD} || 'other' }
 }
 
+
 # Takes a reference to a hash (usually %CGI::values) that contains
 # the following:
 #
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.