0

我需要有关此代码的帮助,是信用卡验证,我一直试图让它在我的代码中工作,但我不能,我只需要获取 2 个变量,卡是否工作它应该返回 true 工作,但是如果不是,它会显示一条错误消息,但我还需要返回 false,这是代码:

    <?php
    $cardnumber = $_POST['CardNumber']; 
    $cardname = $_POST['CardType'];

    $cards = array (  array ('name' => 'American Express', 
    'length' => '15', 
    'prefixes' => '34,37',
    'checkdigit' => true
    ),
    array ('name' => 'Diners Club Carte Blanche', 
    'length' => '14', 
    'prefixes' => '300,301,302,303,304,305',
    'checkdigit' => true
    ),
    array ('name' => 'Diners Club', 
    'length' => '14,16',
    'prefixes' => '36,38,54,55',
    'checkdigit' => true
    ),
    array ('name' => 'Discover', 
    'length' => '16', 
    'prefixes' => '6011,622,64,65',
    'checkdigit' => true
    ),
    array ('name' => 'Diners Club Enroute', 
    'length' => '15', 
    'prefixes' => '2014,2149',
    'checkdigit' => true
    ),
    array ('name' => 'JCB', 
    'length' => '16', 
    'prefixes' => '35',
    'checkdigit' => true
    ),
    array ('name' => 'Maestro', 
    'length' => '12,13,14,15,16,18,19', 
    'prefixes' => '5018,5020,5038,6304,6759,6761,6762,6763',
    'checkdigit' => true
    ),
                       array ('name' => 'MasterCard', 
    'length' => '16', 
    'prefixes' => '51,52,53,54,55',
    'checkdigit' => true
    ),
    array ('name' => 'Solo', 
    'length' => '16,18,19', 
    'prefixes' => '6334,6767',
    'checkdigit' => true
    ),
                       array ('name' => 'Switch', 
    'length' => '16,18,19', 
    'prefixes' => '4903,4905,4911,4936,564182,633110,6333,6759',
    'checkdigit' => true
    ),
    array ('name' => 'VISA', 
    'length' => '16', 
    'prefixes' => '4',
    'checkdigit' => true
    ),
    array ('name' => 'VISA Electron', 
    'length' => '16', 
    'prefixes' => '417500,4917,4913,4508,4844',
    'checkdigit' => true
    ),
    array ('name' => 'LaserCard', 
    'length' => '16,17,18,19', 
    'prefixes' => '6304,6706,6771,6709',
    'checkdigit' => true
    )
    );

      $ccErrorNo = 0;

      $ccErrors [0] = "Unknown card type";
      $ccErrors [1] = "No card number provided";
      $ccErrors [2] = "Credit card number has invalid format";
      $ccErrors [3] = "Credit card number is invalid";
      $ccErrors [4] = "Credit card number is wrong length";

      // Establish card type
      $cardType = -1;
      for ($i=0; $i<sizeof($cards); $i++) {

        // See if it is this card (ignoring the case of the string)
        if (strtolower($cardname) == strtolower($cards[$i]['name'])) {
          $cardType = $i;
          break;
        }
      }

      // If card type not found, report an error
      if ($cardType == -1) {
         $errornumber = 0;     
         $errortext = $ccErrors [$errornumber];
         return true; 
      }

      // Ensure that the user has provided a credit card number
      if (strlen($cardnumber) == 0)  {
         $errornumber = 1;     
         $errortext = $ccErrors [$errornumber];
         return true; 
      }

      // Remove any spaces from the credit card number
      $cardNo = str_replace (' ', '', $cardnumber);  

      // Check that the number is numeric and of the right sort of length.
      if (!preg_match("/^[0-9]{13,19}$/",$cardNo))  {
         $errornumber = 2;     
         $errortext = $ccErrors [$errornumber];
         return true; 
      }

      // Now check the modulus 10 check digit - if required
      if ($cards[$cardType]['checkdigit']) {
        $checksum = 0;        // running checksum total
        $mychar = "";         // next char to process
        $j = 1;               // takes value of 1 or 2

        // Process each digit one by one starting at the right
        for ($i = strlen($cardNo) - 1; $i >= 0; $i--) {

          // Extract the next digit and multiply by 1 or 2 on alternative digits.      
          $calc = $cardNo{$i} * $j;

          // If the result is in two digits add 1 to the checksum total
          if ($calc > 9) {
            $checksum = $checksum + 1;
            $calc = $calc - 10;
          }

          // Add the units element to the checksum total
          $checksum = $checksum + $calc;

          // Switch the value of j
          if ($j ==1) {$j = 2;} else {$j = 1;};
        } 

        // All done - if checksum is divisible by 10, it is a valid modulus 10.
        // If not, report an error.
        if ($checksum % 10 != 0) {
         $errornumber = 3;     
         $errortext = $ccErrors [$errornumber];
         return true; 
        }
      }  

      // The following are the card-specific checks we undertake.

      // Load an array with the valid prefixes for this card
      $prefix = explode(',',$cards[$cardType]['prefixes']);

      // Now see if any of them match what we have in the card number  
      $PrefixValid = false; 
      for ($i=0; $i<sizeof($prefix); $i++) {
        $exp = '/^' . $prefix[$i] . '/';
        if (preg_match($exp,$cardNo)) {
          $PrefixValid = true;
          break;
        }
      }

      // If it isn't a valid prefix there's no point at looking at the length
      if (!$PrefixValid) {
         $errornumber = 3;     
         $errortext = $ccErrors [$errornumber];
         return true; 
      }

      // See if the length is valid for this card
      $LengthValid = false;
      $lengths = explode(',',$cards[$cardType]['length']);
      for ($j=0; $j<sizeof($lengths); $j++) {
        if (strlen($cardNo) == $lengths[$j]) {
          $LengthValid = true;
          break;
        }
      }

      // See if all is OK by seeing if the length was valid. 
      if (!$LengthValid) {
         $errornumber = 4;     
         $errortext = $ccErrors [$errornumber];
         return true; 
      };   

      // The credit card is in the required format.
      return true;

echo $errortext;
?>

您可以看到返回 true,但我还需要在卡未验证时将其更改为 false,以便我可以进行其他验证,感谢您的帮助。

我发现其他代码可以满足我的需要,更简单一点,可以将这个新代码的 $verified 变量添加到第一个代码中吗?这是代码:

<?php

$cc_number = $_POST['CardNumber']; 
$type = $_POST['CardType'];

$cc_num = str_replace (' ', '', $cc_number);  

    if($type == "AX") {
    $denum = "American Express";
    } elseif($type == "DC") {
    $denum = "Diner's Club";
    } elseif($type == "DS") {
    $denum = "Discover";
    } elseif($type == "MC") {
    $denum = "Master Card";
    } elseif($type == "VI") {
    $denum = "Visa";
    }

    if($type == "AX") {
    $pattern = "/^([34|37]{2})([0-9]{13})$/";//American Express
    if (preg_match($pattern,$cc_num)) {
    $verified = true;
    } else {
    $verified = false;
    }


    } elseif($type == "DC") {
    $pattern = "/^([30|36|38]{2})([0-9]{12})$/";//Diner's Club
    if (preg_match($pattern,$cc_num)) {
    $verified = true;
    } else {
    $verified = false;
    }


    } elseif($type == "DS") {
    $pattern = "/^([6011]{4})([0-9]{12})$/";//Discover Card
    if (preg_match($pattern,$cc_num)) {
    $verified = true;
    } else {
    $verified = false;
    }


    } elseif($type == "MC") {
    $pattern = "/^([51|52|53|54|55]{2})([0-9]{14})$/";//Mastercard
    if (preg_match($pattern,$cc_num)) {
    $verified = true;
    } else {
    $verified = false;
    }


    } elseif($type == "VI") {
    $pattern = "/^([4]{1})([0-9]{12,15})$/";//Visa
    if (preg_match($pattern,$cc_num)) {
    $verified = true;
    } else {
    $verified = false;
    }

    }

    if($verified == false) {
    //Do something here in case the validation fails
    echo "Credit card invalid. Please make sure that you entered a valid <em>" . $denum . "</em> credit card ";

    } else { //if it will pass...do something
    echo "Your <em>" . $denum . "</em> credit card is valid";
    }

?>
4

3 回答 3

1

在函数顶部声明一个变量:

$invalid = false;

然后在您的代码中您将return true;其更改为的任何地方:$invalid = true;.

然后你可以return $invalid;在你的函数结束时做。true如果出现错误,它将返回。如果没有错误,它将返回false

于 2013-05-27T23:41:57.593 回答
0

感谢您的帮助,这是最终代码,我只是做了一些更改并且效果很好:

  $cards = array (  array ('name' => 'American Express', 
                          'length' => '15', 
                          'prefixes' => '34,37',
                          'checkdigit' => true
                         ),
                   array ('name' => 'Diners Club Carte Blanche', 
                          'length' => '14', 
                          'prefixes' => '300,301,302,303,304,305',
                          'checkdigit' => true
                         ),
                   array ('name' => 'Diners Club', 
                          'length' => '14,16',
                          'prefixes' => '36,38,54,55',
                          'checkdigit' => true
                         ),
                   array ('name' => 'Discover', 
                          'length' => '16', 
                          'prefixes' => '6011,622,64,65',
                          'checkdigit' => true
                         ),
                   array ('name' => 'Diners Club Enroute', 
                          'length' => '15', 
                          'prefixes' => '2014,2149',
                          'checkdigit' => true
                         ),
                   array ('name' => 'JCB', 
                          'length' => '16', 
                          'prefixes' => '35',
                          'checkdigit' => true
                         ),
                   array ('name' => 'Maestro', 
                          'length' => '12,13,14,15,16,18,19', 
                          'prefixes' => '5018,5020,5038,6304,6759,6761,6762,6763',
                          'checkdigit' => true
                         ),
                   array ('name' => 'MasterCard', 
                          'length' => '16', 
                          'prefixes' => '51,52,53,54,55',
                          'checkdigit' => true
                         ),
                   array ('name' => 'Solo', 
                          'length' => '16,18,19', 
                          'prefixes' => '6334,6767',
                          'checkdigit' => true
                         ),
                   array ('name' => 'Switch', 
                          'length' => '16,18,19', 
                          'prefixes' => '4903,4905,4911,4936,564182,633110,6333,6759',
                          'checkdigit' => true
                         ),
                   array ('name' => 'VISA', 
                          'length' => '16', 
                          'prefixes' => '4',
                          'checkdigit' => true
                         ),
                   array ('name' => 'VISA Electron', 
                          'length' => '16', 
                          'prefixes' => '417500,4917,4913,4508,4844',
                          'checkdigit' => true
                         ),
                   array ('name' => 'LaserCard', 
                          'length' => '16,17,18,19', 
                          'prefixes' => '6304,6706,6771,6709',
                          'checkdigit' => true
                         )
                );

  $ccErrorNo = 0;

  $ccErrors [0] = "Unknown card type";
  $ccErrors [1] = "No card number provided";
  $ccErrors [2] = "Credit card number has invalid format";
  $ccErrors [3] = "Credit card number is invalid";
  $ccErrors [4] = "Credit card number is wrong length";

  // Establish card type
  $cardType = -1;
  for ($i=0; $i<sizeof($cards); $i++) {

    // See if it is this card (ignoring the case of the string)
    if (strtolower($cardname) == strtolower($cards[$i]['name'])) {
      $cardType = $i;
      $response = true;
      break;
    }
  }

  // If card type not found, report an error
  if ($cardType == -1) {
     $errornumber = 0;     
     $errortext = $ccErrors [$errornumber];
     $response = false;
     return false; 
  }

  // Ensure that the user has provided a credit card number
  if (strlen($cardnumber) == 0)  {
     $errornumber = 1;     
     $errortext = $ccErrors [$errornumber];
     $response = false;
     return false; 
  }

  // Remove any spaces from the credit card number
  $cardNo = str_replace (' ', '', $cardnumber);  

  // Check that the number is numeric and of the right sort of length.
  if (!preg_match("/^[0-9]{13,19}$/",$cardNo))  {
     $errornumber = 2;     
     $errortext = $ccErrors [$errornumber];
     $response = false;
     return false; 
  }

  // Now check the modulus 10 check digit - if required
  if ($cards[$cardType]['checkdigit']) {
    $checksum = 0;                                  // running checksum total
    $mychar = "";                                   // next char to process
    $j = 1;                                         // takes value of 1 or 2

    // Process each digit one by one starting at the right
    for ($i = strlen($cardNo) - 1; $i >= 0; $i--) {

      // Extract the next digit and multiply by 1 or 2 on alternative digits.      
      $calc = $cardNo{$i} * $j;

      // If the result is in two digits add 1 to the checksum total
      if ($calc > 9) {
        $checksum = $checksum + 1;
        $calc = $calc - 10;
      }

      // Add the units element to the checksum total
      $checksum = $checksum + $calc;

      // Switch the value of j
      if ($j ==1) {$j = 2;} else {$j = 1;};
    } 

    // All done - if checksum is divisible by 10, it is a valid modulus 10.
    // If not, report an error.
    if ($checksum % 10 != 0) {
     $errornumber = 3;     
     $errortext = $ccErrors [$errornumber];
     $response = false;
     return false; 
    }
  }  

  // The following are the card-specific checks we undertake.

  // Load an array with the valid prefixes for this card
  $prefix = explode(',',$cards[$cardType]['prefixes']);

  // Now see if any of them match what we have in the card number  
  $PrefixValid = false; 
  for ($i=0; $i<sizeof($prefix); $i++) {
    $exp = '/^' . $prefix[$i] . '/';
    if (preg_match($exp,$cardNo)) {
      $PrefixValid = true;
      $response = true;
      break;
    }
  }

  // If it isn't a valid prefix there's no point at looking at the length
  if (!$PrefixValid) {
     $errornumber = 3;     
     $errortext = $ccErrors [$errornumber];
     $response = false;
     return false; 
  }

  // See if the length is valid for this card
  $LengthValid = false;
  $lengths = explode(',',$cards[$cardType]['length']);
  for ($j=0; $j<sizeof($lengths); $j++) {
    if (strlen($cardNo) == $lengths[$j]) {
      $LengthValid = true;
      $response = true;
      break;
    }
  }

  // See if all is OK by seeing if the length was valid. 
  if (!$LengthValid) {
     $errornumber = 4;     
     $errortext = $ccErrors [$errornumber];
     $response = false;
     return false; 
  };   

  // The credit card is in the required format.
  return $response;

在另一页:

$cardnumber = $_POST['CardNumber']; 
$cardname = $_POST['CardType'];

require('phpcreditcard.php');



  if ($response == true) {
      echo 'works';
  }
  elseif ($response == false) {
    echo $errortext;
  }
于 2013-05-28T01:55:52.770 回答
0

查看所有如下所示的if语句:

$errornumber = whateverNumber;
$errortext = $ccErrors [$errornumber];
return true;

这些是true出现错误时返回的内容。只需将 return 语句更改为return false;在那些地方使脚本返回 false。

唯一的return true;应该在你的函数的末尾。

于 2013-05-27T23:43:15.770 回答