Kredi Kartı Tanıma

<?php
error_reporting(4);
if(!defined(PHP_CREDITCARD_CLASS))
{

define(PHP_CREDITCARD_CLASS, 1);

define(UNKNOWN, 0);
define(MASTERCARD, 1);
define(VISA, 2);
define(AMEX, 3);
define(DINNERS, 4);
define(DISCOVER, 5);
define(ENROUTE, 6);
define(JCB, 7);

define(CC_OK, 0);
define(CC_ECALL, 1);
define(CC_EARG, 2);
define(CC_ETYPE, 3);
define(CC_ENUMBER, 4);
define(CC_EFORMAT, 5);
define(CC_ECANTYPE, 6);

class creditcard
{
  var $number;
  var $type;
  var $errno;

  function creditcard()
  {
    $this->number = 0;
    $this->type = UNKNOWN;
    $this->errno = CC_OK;
  }
  function check($cardnum)
  {
    $this->number = $this->_strtonum($cardnum);

    if(!$this->detectType($this->number))
    {
      $this->errno = CC_ETYPE;
      return false;
    }

    if($this->mod10($this->number))
    {
      $this->errno = CC_ENUMBER;
      return false;
    }

    return true;
  }
  function detectType($cardnum = 0)
  {
    if($cardnum)
      $this->number = $this->_strtonum($cardnum);
    if(!$this->number)
    {
      $this->errno = CC_ECALL;
      return UNKNOWN;
    }

    if(preg_match("/^5[1-5]d{14}$/", $this->number))
      $this->type = MASTERCARD;

    else if(preg_match("/^4(d{12}|d{15})$/", $this->number))
      $this->type = VISA;

    else if(preg_match("/^3[47]d{13}$/", $this->number))
      $this->type = AMEX;

    else if(preg_match("/^[300-305]d{11}$/", $this->number) ||
      preg_match("/^3[68]d{12}$/", $this->number))
      $this->type = DINNERS;

    else if(preg_match("/^6011d{12}$/", $this->number))
      $this->type = DISCOVER;

    else if(preg_match("/^2(014|149)d{11}$/", $this->number))
      $this->type = ENROUTE;

    else if(preg_match("/^3d{15}$/", $this->number) ||
      preg_match("/^(2131|1800)d{11}$/", $this->number))
      $this->type = JCB;

    if(!$this->type)
    {
      $this->errno = CC_ECANTYPE;
      return UNKNOWN;
    }

    return $this->type;
  }
  function detectTypeString($cardnum = 0)
  {
    if(!$cardnum)
    {
      if(!$this->type)
        $this->errno = CC_EARG;
    }
    else
      $this->type = $this->detectType($cardnum);

    if(!$this->type)
    {
      $this->errno = CC_ETYPE;
      return NULL;
    }

    switch($this->type)
    {
      case MASTERCARD:
        return "MASTERCARD";
      case VISA:
        return "VISA";
      case AMEX:
        return "AMEX";
      case DINNERS:
        return "DINNERS";
      case DISCOVER:
        return "DISCOVER";
      case ENROUTE:
        return "ENROUTE";
      case JCB:
        return "JCB";
      default:
        $this->errno = CC_ECANTYPE;
        return NULL;
    }
  }

  function getCardNumber()
  {
    if(!$this->number)
    {
      $this->errno = CC_ECALL;
      return 0;
    }

    return $this->number;
  }
  function errno()
  {
    return $this->errno;
  }

  function mod10($cardnum)
  {
    for($sum=0, $i=strlen($cardnum)-1; $i >= 0; $i--)
    {
      $sum += $cardnum[$i];
      $doubdigit = "".(2 * $cardnum[--$i]);
      for($j = strlen($doubdigit)-1; $j >= 0; $j--)
        $sum += $doubdigit[$j];
    }
    return $sum % 10;
  }

  function resetCard()
  {
    $this->number = 0;
    $this->type = 0;
  }

  function strError()
  {
    switch($this->errno)
    {
      case CC_ECALL:
        return "Geçersiz Arama";
      case CC_ETYPE:
        return "Bilinmeyen Kart Tipi";
      case CC_ENUMBER:
        return "Geçersiz Kart Numarası";
      case CC_EFORMAT:
        return "Geçersiz Format";
      case CC_ECANTYPE:
        return "Kart tipi taranamadı";
      case CC_OK:
        return "Başarılı";
    }
  }

  function _strtonum($string)
  {
    for($i=0; $i< strlen($string); $i++)
    {
      if(!is_numeric($string[$i]))
        continue;
      $nstr = "$nstr".$string[$i];
    }
    return $nstr;
  }

}


}

//ÖRNEK 
$cc = new creditcard;
$card=$_GET[card];
if($card)
{
  printf("%s  nolu kart %s <br>n", $card,
    (($ccret = $cc->check($card))?" gecerli":"gecersiz"));

  if($ccret)
  {
    printf("Kart Tipi: %s veya %d<br>n", $cc->detectTypeString(),
      $cc->detectType());
    printf("Kart Numarasi: %s<br>n", $cc->getCardNumber());
  }
  else
    printf("%s<br>n", $cc->strError());

}

?>

<form action="" method=get>
<input type=text name=card size=20><p>
<input type=submit value="Hesapla">
</form>

</body>