信用卡类型是否可以仅从信用卡号码确定?
这是推荐还是我们应该总是向客户询问他们使用的信用卡类型?
我用Google搜索并找到了这个算法:http://cuinl.tripod.com/Tips/o-1.htm,这可靠吗?
答案 0 :(得分:32)
是的,您提到的网站是正确的。许多网站,包括Google Checkout我相信,依靠自动检测卡片类型。它很方便,使得UI不那么杂乱(少一个输入框)并节省时间。来吧!
答案 1 :(得分:21)
我听说过一个很好的理由让他们挑选(即使你能搞清楚)。这样他们就知道你接受的信用卡清单。
答案 2 :(得分:11)
作为消费者,我讨厌先选择一张卡片。我想开始输入数字。
Wroblewski的 Web Form Design 在第153-154页讨论了这个问题。它位于“不必要的输入”一章的“删除问题”部分。给出的示例是Paypal,它会在您输入数字时突出显示卡的类型。
答案 3 :(得分:7)
我非常确定至少对于MasterCard,Visa,Discover和American Express来说这是准确的。我从未与其他任何人合作过。
请参阅本页底部: http://www.merchantplus.com/resources/pages/credit-card-logos-and-test-numbers/
答案 4 :(得分:5)
这是我使用的脚本,适用于当前的卡片范围。还会对号码进行有效性检查。
/**
* checks a given string for a valid credit card
* @returns:
* -1 invalid
* 1 mastercard
* 2 visa
* 3 amex
* 4 diners club
* 5 discover
* 6 enRoute
* 7 jcb
*/
function checkCC(val) {
String.prototype.startsWith = function (str) {
return (this.match("^" + str) == str)
}
Array.prototype.has=function(v,i){
for (var j=0;j<this.length;j++){
if (this[j]==v) return (!i ? true : j);
}
return false;
}
// get rid of all non-numbers (space etc)
val = val.replace(/[^0-9]/g, "");
// now get digits
var d = new Array();
var a = 0;
var len = 0;
var cval = val;
while (cval != 0) {
d[a] = cval%10;
cval -= d[a];
cval /= 10;
a++;
len++;
}
if (len < 13)
return -1;
var cType = -1;
// mastercard
if (val.startsWith("5")) {
if (len != 16)
return -1;
cType = 1;
} else
// visa
if (val.startsWith("4")) {
if (len != 16 && len != 13)
return -1;
cType = 2;
} else
// amex
if (val.startsWith("34") || val.startsWith("37")) {
if (len != 15)
return -1;
cType = 3;
} else
// diners
if (val.startsWith("36") || val.startsWith("38") || val.startsWith("300") || val.startsWith("301") || val.startsWith("302") || val.startsWith("303") || val.startsWith("304") || val.startsWith("305")) {
if (len != 14)
return -1;
cType = 4;
} else
// discover
if (val.startsWith("6011")) {
if (len != 15 && len != 16)
return -1;
cType = 5;
} else
// enRoute
if (val.startsWith("2014") || val.startsWith("2149")) {
if (len != 15 && len != 16)
return -1;
// any digit check
return 6;
} else
// jcb
if (val.startsWith("3")) {
if (len != 16)
return -1;
cType = 7;
} else
// jcb
if (val.startsWith("2131") || val.startsWith("1800")) {
if (len != 15)
return -1;
cType = 7;
} else
return - 1;
// invalid cc company
// lets do some calculation
var sum = 0;
var i;
for (i = 1; i < len; i += 2) {
var s = d[i] * 2;
sum += s % 10;
sum += (s - s%10) /10;
}
for (i = 0; i < len; i += 2)
sum += d[i];
// musst be %10
if (sum%10 != 0)
return - 1;
return cType;
}
答案 5 :(得分:5)
这是代码项目的Complete C# or VB code for all kinds of CC related things。
这篇文章已经发表了几年没有负面评论。
答案 6 :(得分:4)
Wikipedia包含大多数卡前缀的列表。您发布的链接中缺少某些卡片。您提供的链接似乎也是有效的。
要求提供卡类型的一个原因是进行额外验证,比较用户提供的数字与此号码。
答案 7 :(得分:3)
这是第一篇文章中提到的相同算法的php版本
<?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;
}
?>
答案 8 :(得分:3)
您链接的代码有一个不完整的BIN /范围列表用于Discover,省略了Diner's club(现在仍然属于Discover),列出了不再存在的卡片类型,应该折叠成其他类型(enRoute,Carte Blanche),并忽略了日益重要的Maestro International推车类型。
正如@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的建议),否则你要放入保持最新的工作,我建议你跳过自动检测。
答案 9 :(得分:2)
这是一种快速的脏方法,可以自动确定卡片类型,并在用户输入时将其显示给用户。
这意味着 a)用户不必选择它 b)他们不会浪费时间寻找不存在的下拉列表。
非常简单的美国运通卡,维萨卡和万事达卡的jQuery版本。 如果你需要其他卡类型,你可以参加
$('[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");
});
这是伴随它的jQuery(ASP.NET MVC):
Card number: <%= Html.TextBox("PaymentDetails.CreditCardDetails.CreditCardNumber")%>
Card Type: <span id="ccCardType" class="unknown">Enter card number above</span>
我有.unknown
的css规则来显示灰显文字。
答案 10 :(得分:2)
Stripe为卡片方案检测提供了这个出色的 javascript 库。让我添加一些代码片段并向您展示如何使用它。
首先将其作为
包含在您的网页中<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.payment/1.2.3/jquery.payment.js " ></script>
其次使用函数cardType来检测卡方案。
$(document).ready(function() {
var type = $.payment.cardType("4242 4242 4242 4242"); //test card number
console.log(type);
});
以下是更多示例和演示的参考链接。
答案 11 :(得分:1)
Python中的这种实现应该适用于AmEx,Discover,Master Card,Visa:
def cardType(number):
number = str(number)
cardtype = "Invalid"
if len(number) == 15:
if number[:2] == "34" or number[:2] == "37":
cardtype = "American Express"
if len(number) == 13:
if number[:1] == "4":
cardtype = "Visa"
if len(number) == 16:
if number[:4] == "6011":
cardtype = "Discover"
if int(number[:2]) >= 51 and int(number[:2]) <= 55:
cardtype = "Master Card"
if number[:1] == "4":
cardtype = "Visa"
return cardtype
答案 12 :(得分:1)
如果您接受的所有信用卡具有相同的属性,则只需让用户输入卡号和其他属性(有效期,CVV等)。但是,某些卡类型需要输入不同的字段(例如,英国Maestro卡的开始日期或发行号)。在这些情况下,您必须拥有所有字段,从而使用户感到困惑,或者某些Javascript隐藏/显示相关字段,再次使用户体验有点奇怪(字段消失/出现,因为他们输入信用卡号) 。在这种情况下,我建议先询问卡片类型。
答案 13 :(得分:1)
我个人首先选择卡片类型没问题。但在我看来,信用卡号输入有两个方面存在问题。
最糟糕的是无法在数字组之间输入空格。包括打印在物理卡上的空格将使用户更容易扫描数字,以验证他们是否正确输入了信息。每当我遇到这种无处不在的缺陷时,我觉得自己被推向了石器时代,用户输入无法被过滤以去除不必要的字符。
第二个是需要在拨打电话订单时听取供应商重复给您的卡号。所有信用卡接收者实际需要的是一个UI,使他们可以访问校验位方案,该方案验证cc号是否有效。根据该算法,前15个(或多个)数字计算最后一个数字 - 实际上不可能“傻瓜”。&#34;对于脂肪指数而言,通过&#34;要求15个数字中至少有两个相互抵消的错误。除非算法受到通过转置相邻数字而不成比例地愚弄的缺陷(常见的输入错误),我怀疑,除了它比任何人类双重检查更可靠。
答案 14 :(得分:0)
https://binlist.net/提供了免费的API。您只需要输入卡号的前6或8位数字-即发行人识别号(IIN),以前称为银行识别号(BIN)。
curl -H "Accept-Version: 3" "https://lookup.binlist.net/45717360"
(来自更具体的问题:How tell the difference between a Debit Card and a Credit Card的帖子)