>   Hi, how i can check credit card or magnetic card number for
> a site of
> electronic commerce that i have to design.
>
> Sorry for my english.
>
> Pedro.
>

I think this should work for you, but it's not production tested yet.

-Craig

function verifyCC($name='', $type='', $number='', $expmonth='',
$expyear='') {
   //make sure all fields are filled in
   if (empty($name) || empty($type) || empty($number) || empty($expyear)
|| empty($expmonth)) {
      return FALSE;
   }

   //verify month makes sense
   if(!is_numeric($expmonth) || $expmonth < 1 || $expmonth > 12) {
      return FALSE;
   }

   // Get the current year
   $currentYear = date('Y');
   expyear = '20' . $expyear;
   settype($currentYear, 'integer');

   //verify year makes sense
   if (!is_numeric($expyear) || $expyear < $currentYear || $expyear >
$currentYear + 10) {
      return FALSE;
   }

   //strip out non-numeric numbers from number
   $number = preg_replace('/[^0-9]/', '', $number);
   $type = strtolower($type);

   //check length and prefix of number
   if ($type == 'mastercard' || $type == 'mc') {
      $validFormat = ereg("^5[1-5][0-9]{14}$", $number);
   }
   elseif ($type == 'visa') {
      $validFormat = ereg("^4[0-9]{12}([0-9]{3})?$", $number);
   }
   elseif ($type == 'amex' || $type == 'american express') {
      $validFormat = ereg("^3[47][0-9]{13}$", $number);
   }
   elseif ($type == 'diners club' || $type == 'dc' || $type = 'diners')
{
      $validFormat = ereg("^3(0[0-5]|[68][0-9])[0-9]{11}$", $number);
   }
   elseif ($type == 'discover' || $type == 'disc') {
      $validFormat = ereg("^6011[0-9]{12}$", $number);
   }
   elseif ($type == 'jcb') {
      $validFormat = ereg("^(3[0-9]{4}|2131|1800)[0-9]{11}$", $number);
   }
   else {
      return FALSE;
   }

   if (!$validFormat) {
      return FALSE;
   }

   //do mod 10 algorithm
   $revNum = strrev($number);
   $sum = 0;

   for($i = 0; $i < strlen($revNum); $i++) {
      $currentNum = substr($revNum, $i, 1);

      //double every second digit
      if($i % 2 == 1) {
         $currentNum *= 2;
      }

      //add digits of 2-digit numbers together
      if($currentNum > 9) {
         $firstNum = $currentNum % 10;
         $secondNum = ($currentNum - $firstNum) / 10;
         $currentNum = $firstNum + $secondNum;
      }

      $sum += $currentNum;
   }

   //check if there's a remainder
   if ($sum % 10 <> 0) {
      return FALSE;
   }

   return TRUE;
}

-- 
PHP General Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to