<?php
function CreditCardType($CardNo)
{
/*
'*CARD TYPES *PREFIX *WIDTH
'American Express 34, 37 15
'Diners Club 300 to 305, 36 14
'Carte Blanche 38 14
'Discover 6011 16
'EnRoute 2014, 2149 15
'JCB 3 16
'JCB 2131, 1800 15
'Master Card 51 to 55 16
'Visa 4 13, 16
*/
//Just in case nothing is found
$CreditCardType = "Unknown";
//Remove all spaces and dashes from the passed string
$CardNo = str_replace("-", "",str_replace(" ", "",$CardNo));
//Check that the minimum length of the string isn't less
//than fourteen characters and -is- numeric
If(strlen($CardNo) < 14 || !is_numeric($CardNo))
return false;
//Check the first two digits first
switch(substr($CardNo,0, 2))
{
Case 34: Case 37:
$CreditCardType = "American Express";
break;
Case 36:
$CreditCardType = "Diners Club";
break;
Case 38:
$CreditCardType = "Carte Blanche";
break;
Case 51: Case 52: Case 53: Case 54: Case 55:
$CreditCardType = "Master Card";
break;
}
//None of the above - so check the
if($CreditCardType == "Unknown")
{
//first four digits collectively
switch(substr($CardNo,0, 4))
{
Case 2014:Case 2149:
$CreditCardType = "EnRoute";
break;
Case 2131:Case 1800:
$CreditCardType = "JCB";
break;
Case 6011:
$CreditCardType = "Discover";
break;
}
}
//None of the above - so check the
if($CreditCardType == "Unknown")
{
//first three digits collectively
if(substr($CardNo,0, 3) >= 300 && substr($CardNo,0, 3) <= 305)
{
$CreditCardType = "American Diners Club";
}
}
//None of the above -
if($CreditCardType == "Unknown")
{
//So simply check the first digit
switch(substr($CardNo,0, 1))
{
Case 3:
$CreditCardType = "JCB";
break;
Case 4:
$CreditCardType = "Visa";
break;
}
}
return $CreditCardType;
}
?>
21
您链接的代码有一个 incomplete BIN/range list for Discover,省略了Diner's club(现在无论如何都属于Discover),列出了不再存在的卡片类型,应该折叠成其他类型(enRoute,Carte Blanche),并忽略了越来越重要的Maestro国际购物车类型 .
$('[id$=CreditCardNumber]').assertOne().keyup(function(){
// rules taken from http://en.wikipedia.org/wiki/Credit_card_number#cite_note-GenCardFeatures-0
var value = $(this).val();
$('#ccCardType').removeClass("unknown");
if ((/^4/).test(value)) {
$('#ccCardType').html("Visa");
return;
}
if ((/^5[1-5]/).test(value)) {
$('#ccCardType').html("Mastercard");
return;
}
if ((/^3[47]/).test(value)) {
$('#ccCardType').html("Mastercard");
return;
}
$('#ccCardType').html("Enter card number above");
$('#ccCardType').addClass("unknown");
});
15 回答
是的,您提到的网站是正确的 . 许多网站,包括Google Checkout我相信,依靠自动检测卡片类型 . 它很方便,使得UI不那么杂乱(少一个输入框)并节省时间 . 前进!
我听说过一个很好的理由让他们选择(即使你可以搞清楚) . 这样他们就知道你接受的信用卡清单 .
作为消费者,我讨厌先选择一张卡片 . 我想开始输入数字 .
Wroblewski的第25-154页的Web Form Design讨论了这个问题 . 它输入了你的电话号码.2526305_ .
我非常肯定,至少对于万事达卡,维萨卡,发现版和美国运通卡而言,这是准确的 . 我从未与其他任何人合作过 .
请参见本页底部:http://www.merchantplus.com/resources/pages/credit-card-logos-and-test-numbers/
这也许对你有用“http://www.beachnet.com/~hstiles/cardtype.html
这非常有趣:http://en.wikipedia.org/wiki/Bank_card_number
这是我使用的脚本,适用于当前的卡片范围 . 还会对号码进行有效性检查 .
这是codeproject上的Complete C# or VB code for all kinds of CC related things .
IsValidNumber
GetCardTypeFromNumber
GetCardTestNumber
PassesLuhnTest
这篇文章已经发表了几年没有负面评论 .
Wikipedia包含大多数卡前缀的列表 . 您发布的链接中缺少某些卡片 . 您提供的链接似乎也是有效的 .
要求卡类型的一个原因是进行额外验证,比较用户提供的数字与数字 .
这是第一篇文章中提到的相同算法的php版本
您链接的代码有一个 incomplete BIN/range list for Discover,省略了Diner's club(现在无论如何都属于Discover),列出了不再存在的卡片类型,应该折叠成其他类型(enRoute,Carte Blanche),并忽略了越来越重要的Maestro国际购物车类型 .
正如@Alex确认的那样,可以从BIN号码中确定卡片类型,并且许多公司都会这样做但是这样做一致且正确并非易事:卡片品牌不断变化,并且当你试图处理时,跟踪事情变得更加复杂区域借记卡(爱尔兰的激光,欧洲的Maestro等) - 我还没有在任何地方找到免费和维护(正确)的代码或算法 .
正如@MitMaro一样,Wikipedia contains a high-level list of card identifiers,也是a more-specific list of BIN numbers and ranges,这是一个良好的开端,正如gbjbaanb评论的那样,Barclays has a publically-published list(但由于某些原因它似乎不包括Discover--可能他们不会在Discover网络上处理?)
看起来很简单,一个正确的卡识别算法/方法/功能需要维护工作,所以除非你的检测程序是非关键/信息的(例如@ Simon_Weaver的建议),否则你将把工作付诸实践保持最新,我建议你跳过自动检测 .
这是一种快速的脏方法,可以自动确定卡片类型,并在用户输入时将其显示给用户 .
这意味着a)用户不必选择它并且b)他们不会浪费时间寻找不存在的下拉列表 .
非常简单的jQuery版本适用于Amex,Visa和Mastercard . 如果你需要其他卡类型,你可以采取
这是伴随它的jQuery(ASP.NET MVC):
我有
.unknown
的CSS规则来显示灰色文本 .Stripe为卡片方案检测提供了这个梦幻般的 javascript 库 . 让我添加一些代码片段并向您展示如何使用它 .
首先将其包含在您的网页中
其次使用函数cardType来检测卡方案 .
以下是更多示例和演示的参考链接 .
Stripe blog for jquery.payment.js
Github repository
Python中的这种实现应该适用于AmEx,Discover,Master Card,Visa:
如果您接受的所有信用卡具有相同的属性,则只需让用户输入卡号和其他属性(有效期,CVV等) . 但是,某些卡类型需要输入不同的字段(例如,英国Maestro卡的开始日期或发行号) . 在这些情况下,您必须拥有所有字段,从而混淆用户,或一些Javascript来隐藏/显示相关字段,再次使用户体验有点奇怪(字段消失/出现,因为他们输入信用卡号码) . 在这些情况下,我建议先询问卡片类型 .
就个人而言,我首先选择卡片类型没有问题 . 但在我看来,信用卡号输入有两个方面存在问题 .
最糟糕的是无法在数字组之间输入空格 . 包括打印在物理卡上的空格将使用户更容易扫描数字,以验证他们是否正确输入了信息 . 每当我遇到这种无处不在的缺陷时,我觉得当用户输入无法过滤以删除不必要的字符时,我被推向了一个石器时代 .
第二个是需要在拨打电话订单时听取供应商重复给您的卡号 . 所有信用卡接收者实际需要的是一个UI,使他们能够访问校验数字方案,该方案验证cc号码是否有效 . 根据该算法,前15个(或多个)数字计算最后一个数字 - 实际上不可能“傻瓜” . 对于“通过”的胖指数,需要在15位数中至少有两个相互抵消的错误 . 除非算法受到通过转置相邻数字(一个常见的输入错误)而不成比例地愚弄的缺点,我怀疑,除了它比任何人类双重检查更可靠 .
https://binlist.net/提供免费的API . 您只需要输入卡号的前6位或8位数 - 即发卡行标识号(IIN),以前称为银行识别号码(BIN) .
curl -H "Accept-Version: 3" "https://lookup.binlist.net/45717360"
NPM:https://www.npmjs.com/package/binlookup
来源:https://github.com/paylike/binlookup
(从更具体的问题交叉发布:How tell the difference between a Debit Card and a Credit Card)