Implementasi Algoritma Luhn untuk Otentikasi Nomor Kartu Kredit pada Sistem Transaksi Online
{
$this->arrCardInfo['failure'] = 'format'; $this->arrCardInfo['status'] = 'invalid'; return false;
}
if(($strCardType !== null) && !in_array($strCardType, $this> arrCardTypes))
{
$this->arrCardInfo['failure'] = 'cardtype'; $this->arrCardInfo['status'] = 'invalid'; return false;
}
// Cek algoritma Luhn
if(!$this->CheckLuhn($strCardNumber)) {
$this->arrCardInfo['failure'] = 'algorithm'; $this->arrCardInfo['status'] = 'invalid'; return false;
}
$this->arrCardInfo['status'] = 'valid';
>arrCardInfo['substring'] = $this->GetCardSubstring($strCardNumber);
return true; }
(5)
{
return preg_replace('/[^0-9]/', '', $strCardNumber); }
private function GetCardSubstring($strCardNumber=null) {
if(strstr($strCardNumber, '*') && (substr($strCardNumber) < 10)) return $strCardNumber;
$strCardNumber = $this->CleanCardNumber($strCardNumber); return $strCardNumber ? '***'.substr($strCardNumber, (strlen($strCardNumber) - 4), 4) : '';
} /**
* MII Digit Value Issuer Category
* 0 : ISO/TC 68 and other industry assignments
* 1 : Airlines
* 2 : Airlines and other industry assignments * 3 : Travel and entertainment
* 4 : Banking and financial
* 5 : Banking and financial
* 6 : Merchandizing and banking
* 7 : Petroleum
* 8 : Telecommunications and other industry assignments
* 9 : National assignment
*/
private function CheckMII($strCardNumber=null) {
$strCardNumber = $this->CleanCardNumber($strCardNumber); if(!$strCardNumber)
return false;
$intFirstDigit = (int) substr($strCardNumber, 0, 1); if(!in_array($intFirstDigit, $this->arrAcceptedMII))
return false; return true; }
private function CheckLuhn($strCardNumber=null) {
$strCardNumber = (string) $this->CleanCardNumber($strCardNumber);
(6)
$strCheckDigit = substr($strCardNumber, (strlen($strCardNumber) - 1), 1)
$strCardNumberReverse = strrev($strCardNumber);
$intTotal = 0;
for($i = 1; $i <= strlen($strCardNumberReverse); $i++) {
// jumlahkan
$intVal = (int) ($i % 2) ?
$strCardNumberReverse[$i-1] : ($strCardNumberReverse[$i-1] * 2);
if($intVal > 9) {
$strVal = (string) $intVal;
$intVal = (int) ($strVal[0] + $strVal[1]); }
$intTotal += $intVal; }
// proses modulo mod 10 == 0
return (($intTotal % 10) == 0) ? true : false;