<?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>