Some helpful people posted a PHP credit card number verify on this
list.  It would verify Visa and MC cards.  I made some modifications
to it so that it would verify other types of cards, and return the
type of card it found.  That way, you could have something like this
on your webpage:

<input type=radio name=cctype value=Visa> Visa<br>
<input type=radio name=cctype value=MasterCard> MasterCard<br>
<input type=radio name=cctype value=AmericanExpress> American
Express<br>
<input type=radio name=cctype value=DinersClub> Diners Club /
CarteBlanche<br>
<input type=radio name=cctype value=Discover> Discover<br>
<input type=radio name=cctype value=EnRoute> EnRoute<br>
<input type=radio name=cctype value=JCB> JCB<br>

and then you could have a call like this:

if(ccverify($Number) != $cctype) { // there's an error

which would catch some user errors

Anyway, here's the revised script:

<?

# ------------------------------------------------------------------------
# Credit Card Validation Solution, version 3.5                 PHP Edition
# 25 May 2000
#
# COPYRIGHT NOTICE:
# a) This code is property of The Analysis and Solutions Company.
# b) It is being distributed free of charge and on an "as is" basis.
# c) Use of this code, or any part thereof, is contingent upon leaving
#     this copyright notice, name and address information in tact.
# d) Written permission must be obtained from us before this code, or any
#     part thereof, is sold or used in a product which is sold.
# e) By using this code, you accept full responsibility for its use
#     and will not hold the Analysis and Solutions Company, its employees
#     or officers liable for damages of any sort.
# f) This code is not to be used for illegal purposes.
# g) Please email us any revisions made to this code.
#
# Copyright 2000                 http://www.AnalysisAndSolutions.com/code/
# The Analysis and Solutions Company         [EMAIL PROTECTED]
# ------------------------------------------------------------------------
#
# DESCRIPTION:
# Credit Card Validation Solution uses a four step process to ensure
# credit card numbers are keyed in correctly.  This procedure accurately
# checks cards from American Express, Australian BankCard, Carte Blache,
# Diners Club, Discover/Novus, JCB, MasterCard and Visa.
#
# CAUTION:
# CCVS uses exact number ranges as part of the validation process. These
# ranges are current as of 20 October 1999.  If presently undefined ranges
# come into use in the future, this program will improperly deject card
# numbers in such ranges, rendering an error message entitled "Potential
# Card Type Discrepancy."  If this happens while entering a card & type
# you KNOW are valid, please contact us so we can update the ranges.
#
# POTENTIAL CUSTOMIZATIONS:
# *  If you don't accept some of these card types, edit Step 2, using pound
# signs "#" to comment out the "elseif," "$CardName" and "$ShouldLength"
# lines in question.
# *  Additional card types can be added by inserting new "elseif,"
# "$CardName" and "$ShouldLength" lines in Step 2.
# *  The three functions here can be called by other PHP documents to check
# any number.
#
# CREDITS:
# We learned of the Mod 10 Algorithm in some Perl code, entitled
# "The Validator," available on Matt's Script Archive,
# http://worldwidemart.com/scripts/readme/ccver.shtml.  That code was
# written by David Paris, who based it on material Melvyn Myers reposted
# from an unknown author.  Paris credits Aries Solis for tracking down the
# data underlying the algorithm.  At the same time, our code bears no
# resemblance to its predecessors.  CCValidationSolution was first written
# for Visual Basic, on which Allen Browne and Rico Zschau assisted.
# Neil Fraser helped prune down the OnlyNumericSolution() for Perl.
// modified by Dr. Evil to handle a bunch of other card types


function getcctype($Number) {

     # 1) Get rid of spaces and non-numeric characters.
     $Number = substr(ereg_replace( "[^0-9]", "", $Number), 0, 19);

        // XXXX
        // for testing purposes, allow this number in
        // turn it off before deploying code
        if($Number == "9999") { return "Test"; }

     # 2) Do the first four digits fit within proper ranges?
     #     If so, who's the card issuer and how long should the number be?
     $NumberLeft = substr($Number, 0, 4);
     $NumberLength = strlen($Number);
        $firstdig = substr($Number, 0, 1);
        $seconddig = substr($Number, 1, 1);

     if ($NumberLeft >= 4000 and $NumberLeft <= 4999) {
         $CardName = "Visa";
         if ($NumberLength == 16) {
             $ShouldLength = 16;
         } else {
             $ShouldLength = 13;
         }
     } elseif ($NumberLeft >= 5100 and $NumberLeft <= 5599) {
         $CardName = "MasterCard";
         $ShouldLength = 16;
     } elseif((($firstdig . $seconddig) == "34") ||
                (($firstdig . $seconddig) == "37")) {
        $CardName = "AmericanExpress";
        $ShouldLength = 15;
     } elseif(($firstdig == "3") &&
      (($seconddig == "0") || ($seconddig == "6") || ($seconddig == "8"))) {
        // note that diners club and carteblanche are the same thing
        $CardName = "DinersClub";
        $ShouldLength = 14;
        } elseif($NumberLeft == "6011") {
                $CardName = "Discover";
                $ShouldLength = 16;
        } elseif(($NumberLeft == "2014") || ($NumberLeft == "2149")) {
                $CardName = "EnRoute";
                $ShouldLength = 15;
        } elseif(
      ($NumberLeft == "3088") ||
       ($NumberLeft == "3096") ||
       ($NumberLeft == "3112") ||
       ($NumberLeft == "3158") ||
       ($NumberLeft == "3337") ||
       ($NumberLeft == "3528")
        ) {
                $CardName = "JCB";
                $ShouldLength = 16;
        } else {
                return "ERROR UNKNOWNCARD";
        }


     # 3) Is the number the right length?
     if ($NumberLength != $ShouldLength) {
         return "ERROR WRONGNUMBERLENGTH";
     }


     # 4) Does the number pass the Mod 10 Algorithm Checksum?
     if (Mod10Solution($Number) == TRUE) {
         return $CardName;
     } else {
         return "ERROR BADCHECKSUM";
     }
}

function Mod10Solution ($Number) {
        $Number = substr( ereg_replace( "[^0-9]", "", $Number) , 0, 19);
     $NumberLength = strlen($Number);
     $Checksum = 0;

     # Add even digits in even length strings
     # or odd digits in odd length strings.
     for ($Location = 1 - ($NumberLength % 2); $Location < $NumberLength; 
$Location += 2) {
         $Checksum += substr($Number, $Location, 1);
     }

     # Analyze odd digits in even length strings
     # or even digits in odd length strings.
     for ($Location = ($NumberLength % 2); $Location < $NumberLength; 
$Location += 2) {
         $Digit = substr($Number, $Location, 1) * 2;
         if ($Digit < 10) {
             $Checksum += $Digit;
         } else {
             $Checksum += $Digit - 9;
         }
     }

     # Is the checksum divisible by ten?
     return ($Checksum % 10 == 0);
}

?>

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]
To contact the list administrators, e-mail: [EMAIL PROTECTED]

Reply via email to