Implementasi Algoritma Luhn untuk Otentikasi Nomor Kartu Kredit pada Sistem Transaksi Online

null)

{

$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;