【发布时间】:2011-12-25 19:09:46
【问题描述】:
我需要有关信用卡验证脚本的帮助。我已经弄清楚如何确定信用卡是否有效/无效,但我需要的是:
如果有人输入了无效的信用卡号,有没有办法确定哪个号码无效?
这是我当前确定卡是否有效/无效的代码:
function validateCreditcard_number($credit_card_number) {
//Get the first digit
$firstnumber = substr($credit_card_number, 0, 1);
//Make sure it is the correct amount of digits. Account for dashes being present.
switch ($firstnumber) {
case 3:
if (!preg_match('/^3\d{3}[ \-]?\d{6}[ \-]?\d{5}$/', $credit_card_number)) {
return '<li>This is not a valid American Express card number. Please use a different credit/debit card or re-enter your credit/debit card details.</li>';
}
break;
case 4:
if (!preg_match('/^4\d{3}[ \-]?\d{4}[ \-]?\d{4}[ \-]?\d{4}$/', $credit_card_number)) {
return '<li>This is not a valid Visa card number. Please use a different credit/debit card or re-enter your credit/debit card details.</li>';
}
break;
case 5:
if (!preg_match('/^5\d{3}[ \-]?\d{4}[ \-]?\d{4}[ \-]?\d{4}$/', $credit_card_number)) {
return '<li>This is not a valid MasterCard card number. Please use a different credit/debit card or re-enter your credit/debit card details.</li>';
}
break;
case 6:
if (!preg_match('/^6011[ \-]?\d{4}[ \-]?\d{4}[ \-]?\d{4}$/', $credit_card_number)) {
return '<li>This is not a valid Discover card number. Please use a different credit/debit card or re-enter your credit/debit card details.</li>';
}
break;
default:
return '<li>This is not a valid credit card number. Please use a different credit/debit card or re-enter your credit/debit card details.</li>';
} //END Switch statement
//Luhn Algorithm
$credit_card_number = str_replace('.', '', $credit_card_number);
$credit_card_number = str_replace('-', '', $credit_card_number);
$credit_card_number = str_replace(' ', '', $credit_card_number);
$map = array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
0, 2, 4, 6, 8, 1, 3, 5, 7, 9);
$sum = 0;
$last = strlen($credit_card_number) - 1;
for ($i = 0; $i <= $last; $i++) {
$sum += $map[$credit_card_number[$last - $i] + ($i & 1) * 10];
}
if ($sum % 10 != 0) {
return '<li>This is not a valid credit card number. Please use a different credit/debit card or re-enter your credit/debit card details.</li>';
} else {
//If we made it this far the credit card number is in a valid format
return 'This is a valid credit card number' ;
}
} //END validateCreditcard_number
【问题讨论】:
-
就个人而言,我永远不会去向用户解释为什么信用卡无效。信用卡的真正拥有者会自己意识到自己的错误。有人试图获得免费的东西,只会被你的精确指示所怂恿,说明什么是不正确的。
-
即使可以,为什么要这样做?
-
@three3,符合有效信用卡格式的号码和实际有效的信用卡号码之间存在很大差异。我同意 Kai - 您最好使用支付网关或其他提供商来确定帐户是否有效。 stackoverflow.com/questions/174730/… 有一些很好的正则表达式和其他提示(尽管在 PHP 中)。
-
@KenWhite 你完全错了,这不是 CC # 的工作方式。很多cmets认为这是不安全的。这是一个简单的校验和,用于判断 CC 是否可能有效。 如果卡不是真的,那没关系。 CC 仍然需要点击支付网关,名称/到期/CSC 值仍然必须匹配。生成“有效”的信用卡号码非常容易。不可猜测的数字不是 CC 安全性的一部分,否则上述算法会使它们完全失效。想想人们,别再评论这种做法的安全性了,说这话很傻。
-
后续评论。不,不可能知道哪个号码导致验证失败,因为任何后续号码都可能改变 CC # 的有效性。 IE,如果第 8 位“不正确”,则可以更改第 12 位以进行补偿。没有“一个”数字负责使 CC 无效,它是所有数字的总和。这就是重点。
标签: php javascript validation credit-card