php实现通用的信用卡验证类
这篇文章主要介绍了php实现通用的信用卡验证类,涉及信用卡的规则与php字符串操作的相关技巧,具有一定参考借鉴价值,文中有英文原文注释说明,有助于更直观的了解源码相关信息,需要的朋友可以参考下
本文实例讲述了php实现通用的信用卡验证类。分享给大家供大家参考。
原文说明如下:
- Credit Card Validation Solution (PHP Edition)
- Version 3.5
- 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.
- For more information, please read the comments in the code itself.
- Installation Instructions
- Select the text between the two lines indicated, below.
- Copy the text.
- Open up a text editor.
- Paste the text.
- Save that file. When saving it, make sure to:
- save it in a directory on your webserver, and
- name it with an extension that your server will recognize needs parsing by PHP.
- To see it in action, open up that file in your web browswer.
具体代码如下:
- <?php
- # ------------------------------------------------------------------------
- # 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 info@AnalysisAndSolutions.com
- # ------------------------------------------------------------------------
- #
- # 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.
- function CCValidationSolution ($Number) {
- global $CardName;
- # 1) Get rid of spaces and non-numeric characters.
- $Number = OnlyNumericSolution($Number);
- # 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);
- if ($NumberLeft >= 3000 and $NumberLeft <= 3059) {
- $CardName = "Diners Club";
- $ShouldLength = 14;
- } elseif ($NumberLeft >= 3600 and $NumberLeft <= 3699) {
- $CardName = "Diners Club";
- $ShouldLength = 14;
- } elseif ($NumberLeft >= 3800 and $NumberLeft <= 3889) {
- $CardName = "Diners Club";
- $ShouldLength = 14;
- } elseif ($NumberLeft >= 3400 and $NumberLeft <= 3499) {
- $CardName = "American Express";
- $ShouldLength = 15;
- } elseif ($NumberLeft >= 3700 and $NumberLeft <= 3799) {
- $CardName = "American Express";
- $ShouldLength = 15;
- } elseif ($NumberLeft >= 3528 and $NumberLeft <= 3589) {
- $CardName = "JCB";
- $ShouldLength = 16;
- } elseif ($NumberLeft >= 3890 and $NumberLeft <= 3899) {
- $CardName = "Carte Blache";
- $ShouldLength = 14;
- } elseif ($NumberLeft >= 4000 and $NumberLeft <= 4999) {
- $CardName = "Visa";
- if ($NumberLength > 14) {
- $ShouldLength = 16;
- } elseif ($NumberLength < 14) {
- $ShouldLength = 13;
- } else {
- echo "<br /><em>The Visa number entered, $Number, in is 14 digits long.<br />Visa cards usually have 16 digits, though some have 13.<br />Please check the number and try again.</em><br />n";
- return FALSE;
- }
- } elseif ($NumberLeft >= 5100 and $NumberLeft <= 5599) {
- $CardName = "MasterCard";
- $ShouldLength = 16;
- } elseif ($NumberLeft == 5610) {
- $CardName = "Australian BankCard";
- $ShouldLength = 16;
- } elseif ($NumberLeft == 6011) {
- $CardName = "Discover/Novus";
- $ShouldLength = 16;
- } else {
- echo "<br /><em>The first four digits of the number entered are $NumberLeft. <br />If that's correct, we don't accept that type of credit card.<br />If it's wrong, please try again.</em><br />n";
- return FALSE;
- }
- # 3) Is the number the right length?
- if ($NumberLength <> $ShouldLength) {
- $Missing = $NumberLength - $ShouldLength;
- if ($Missing < 0) {
- echo "<br /><em>The $CardName number entered, $Number, is missing " . abs($Missing) . " digit(s).<br />Please check the number and try again.</em><br />n";
- } else {
- echo "<br /><em>The $CardName number entered, $Number, has $Missing too many digit(s).<br />Please check the number and try again.</em><br />n";
- }
- return FALSE;
- }
- # 4) Does the number pass the Mod 10 Algorithm Checksum?
- if (Mod10Solution($Number) == TRUE) {
- return TRUE;
- } else {
- echo "<br /><em>The $CardName number entered, $Number, is invalid.<br />Please check the number and try again.</em><br />n";
- return FALSE;
- }
- }
- function OnlyNumericSolution ($Number) {
- # Remove any non numeric characters.
- # Ensure number is no more than 19 characters long.
- return substr( ereg_replace( "[^0-9]", "", $Number) , 0, 19);
- }
- function Mod10Solution ($Number) {
- $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);
- }
- # ----------- BEGIN SAMPLE USER INTERFACE SECTION ------------
- #
- # This section provides a simple sample user interface for the
- # Credit Card Validation functions. It generates an HTML form
- # where you enter a card number to check.
- #
- # If a number has been posted by the form, check it.
- if ( isset($Number) ) {
- # Get rid of spaces and non-numeric characters in posted
- # numbers so they display correctly on the input form.
- $Number = OnlyNumericSolution($Number);
- if (CCValidationSolution($Number) == TRUE) {
- echo "<br />The $CardName number entered, $Number, <em>is</em> valid.<br />n";
- }
- } else {
- $Number = "";
- }
- # Setup an input form. Posting it calls this page again.
- echo "<form method="post" action="$REQUEST_URI">n";
- echo "<br />Credit Card Number: <input type="text" name="Number" value="$Number">n";
- echo "<input type="Submit" name="submitr" value="Check its Validity">n";
- echo "</form><br />n";
- #
- # ------------ END SAMPLE USER INTERFACE SECTION -------------
- ?>