i have noticed that were a lot of discussions on the past about problems of validating visa and mastercard cards using the simple cc module of payment in oscommerce.
for those who seek the answer, i pasted the entire code modified, of cc_validation.php:
<?php
/*
$Id: cc_validation.php,v 1.3 2003/02/12 20:43:41 hpdl Exp $
osCommerce, Open Source E-Commerce Solutions
http://www.oscommerce.com
Copyright (c) 2003 osCommerce
Released under the GNU General Public License
######################################
######################################
#########Serban Gheorghe Ghita########
######webmaster@linux-magazin.ro######
#######################################
??FIX?? - for validation of mastercard and visa cards
*/
class cc_validation {
var $cc_type, $cc_number, $cc_expiry_month, $cc_expiry_year;
function validate($number, $expiry_m, $expiry_y) {
$this->cc_number = ereg_replace('[^0-9]', '', $number);
if (ereg('^4(.{12}|.{15})$', $this->cc_number)) {
$this->cc_type = 'Visa';
} elseif (ereg('^5[1-5].{14}$', $this->cc_number)) {
$this->cc_type = 'Master Card';
} elseif (ereg('^3[47].{13}$', $this->cc_number)) {
$this->cc_type = 'American Express';
} elseif (ereg('^3(0[0-5].{11}|[68].{12})$', $this->cc_number)) {
$this->cc_type = 'Diners Club';
} elseif (ereg('^6011.{12}$', $this->cc_number)) {
$this->cc_type = 'Discover';
} elseif (ereg('^(3.{15}|(2131|1800).{11})$', $this->cc_number)) {
$this->cc_type = 'JCB';
} elseif (ereg('^5610.{12}$', $this->cc_number)) {
$this->cc_type = 'Australian BankCard';
} else {
$this->cc_type = 'Unknown';
}
/* class cc_validation {
var $cc_type, $cc_number, $cc_expiry_month, $cc_expiry_year;
function validate($number, $expiry_m, $expiry_y) {
//$this->cc_number = ereg_replace('[^0-9]', '', $number);
$this->cc_number = ereg_replace('[^[:digit:]]', '', $number);
//if (ereg('^4[0-9]{12}([0-9]{3})?$', $this->cc_number)) {
if (ereg('^4.{15}$|^4.{12}$', $this->cc_number)) {
//^5[1-5].{14}$
//^4.{15}$|^4.{12}$
//[^[:digit:]]
$this->cc_type = 'Visa';
// } elseif (ereg('^5[1-5][0-9]{14}$', $this->cc_number)) {
} elseif (ereg('^5[1-5].{14}$', $this->cc_number)) {
//} elseif (ereg("^5[0-9]{16}$", $this->cc_number) || eregi("^[0-9{2}/+[0-9]{2}", $this->cc_number)) {
$this->cc_type = 'Master Card';
/* } elseif (ereg('^3[47][0-9]{13}$', $this->cc_number)) {
$this->cc_type = 'American Express';
} elseif (ereg('^3(0[0-5]|[68][0-9])[0-9]{11}$', $this->cc_number)) {
$this->cc_type = 'Diners Club';
} elseif (ereg('^6011[0-9]{12}$', $this->cc_number)) {
$this->cc_type = 'Discover';
} elseif (ereg('^(3[0-9]{4}|2131|1800)[0-9]{11}$', $this->cc_number)) {
$this->cc_type = 'JCB';
} elseif (ereg('^5610[0-9]{12}$', $this->cc_number)) {
$this->cc_type = 'Australian BankCard';
} else {
return -1;
}
*/
if (is_numeric($expiry_m) && ($expiry_m > 0) && ($expiry_m < 13)) {
$this->cc_expiry_month = $expiry_m;
} else {
return -2;
}
$current_year = date('Y');
$expiry_y = substr($current_year, 0, 2) . $expiry_y;
if (is_numeric($expiry_y) && ($expiry_y >= $current_year) && ($expiry_y <= ($current_year + 10))) {
$this->cc_expiry_year = $expiry_y;
} else {
return -3;
}
if ($expiry_y == $current_year) {
if ($expiry_m < date('n')) {
return -4;
}
}
//return $this->is_valid();
return true;
}
/* function is_valid() {
$cardNumber = strrev($this->cc_number);
$numSum = 0;
for ($i=0; $i<strlen($cardNumber); $i++) {
$currentNum = substr($cardNumber, $i, 1);
// Double every second digit
if ($i % 2 == 1) {
$currentNum *= 2;
}
// Add digits of 2-digit numbers together
if ($currentNum > 9) {
$firstNum = $currentNum % 10;
$secondNum = ($currentNum - $firstNum) / 10;
$currentNum = $firstNum + $secondNum;
}
$numSum += $currentNum;
}
// If the total has no remainder it's OK
return ($numSum % 10 == 0);
} */
}
?>
i have test it with numerous cc-s, valids and it works, and it doesn;t create any problems that i had in the past.
i really hope this helps for some of you.
serban














