-
-
Save lazymanc/1012475 to your computer and use it in GitHub Desktop.
Credit card validator for Symfony 1.4
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
<?php | |
/* | |
Credit Card Validator | |
Date - Sep 04, 2009 | |
Author - Brent Shaffer | |
Fixed bug with some of the regular expressions not matching | |
(switch, jcb, enroute). | |
- Phil Moorhouse <[email protected]> | |
ABOUT | |
This PHP script will calidate credit cards by checking there length | |
and pattern and checksum using mod 10. | |
Supported credit cards are VISA, MASTERCARD, DISCOVER, AMEX, DINERS, | |
JCB, Australian Bankcard, EnRoute And Switch Solo. | |
Borrows from sfValidatorCCVAL by Oriol Rius ([email protected]) | |
*/ | |
class sfValidatorCreditCardNumber extends sfValidatorBase | |
{ | |
protected $_ccregex = array( | |
"visa" => "/^4\d{3}-?\d{4}-?\d{4}-?\d{4}$/", | |
"mastercard" => "/^5[1-5]\d{2}-?\d{4}-?\d{4}-?\d{4}$/", | |
"discover" => "/^6011-?\d{4}-?\d{4}-?\d{4}$/", | |
"amex" => "/^3[4,7]\d{13}$/", | |
"diners" => "/^3[0,6,8]\d{12}$/", | |
"bankcard" => "/^5610-?\d{4}-?\d{4}-?\d{4}$/", | |
"jcb" => "/^(3088|3096|3112|3158|3337|3528)\d{12}$/", | |
"enroute" => "/^(2014|2149)\d{11}$/", | |
"switch" => "/^(4903|4911|4936|5641|6333|6759|6334|6767)\d{12}$/" | |
); | |
public function configure($options = array(), $messages = array()) | |
{ | |
$this->addOption('card_type', null); | |
$this->addMessage('invalid', 'The credit card number you entered is not valid'); | |
} | |
public function doClean($value) | |
{ | |
if (!$this->_isValidCreditCard($value, $this->options['card_type'])) | |
{ | |
throw new sfValidatorError($this, 'invalid', array('value' => $value)); | |
} | |
return $value; | |
} | |
/** | |
* Testing checksum | |
* | |
* @param integer $ccnum | |
* @return boolean | |
*/ | |
private function _checkSum($ccnum) | |
{ | |
$checksum = 0; | |
for ($i = (2-(strlen($ccnum) % 2)); $i <= strlen($ccnum); $i+=2) | |
{ | |
$checksum += (int)($ccnum{$i-1}); | |
} | |
// Analyze odd digits in even length strings or even digits in odd length strings. | |
for ($i = (strlen($ccnum)% 2) + 1; $i < strlen($ccnum); $i+=2) | |
{ | |
$digit = (int)($ccnum{$i-1}) * 2; | |
if ($digit < 10) | |
{ | |
$checksum += $digit; | |
} | |
else | |
{ | |
$checksum += ($digit-9); | |
} | |
} | |
return (($checksum % 10) == 0); | |
} | |
/** | |
* Launch validation | |
* | |
* @param integer $ccnum | |
* @param string $type | |
* @param boolean $returnobj | |
* @return boolean | |
*/ | |
private function _isValidCreditCard($ccnum, $type = null) | |
{ | |
if(!$type) | |
{ | |
$match = false; | |
foreach($this->_ccregex as $type => $pattern) | |
{ | |
if(preg_match($pattern,$ccnum) == 1) | |
{ | |
$match = true; | |
break; | |
} | |
} | |
return $match ? $this->_checkSum($ccnum) : false; | |
} | |
if(@preg_match($this->_ccregex[strtolower(trim($type))],$ccnum) == 0) | |
{ | |
return false; | |
} | |
return $this->_checkSum($ccnum); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment