按数字确定信用卡types?
信用卡types是否只能从信用卡号码中确定?
这是build议或总是问客户他们正在使用的信用卡types?
我google了一下,发现这个algorithm: http : //cuinl.tripod.com/Tips/o-1.htm ,这是可靠的吗?
谢谢
是的,您提到的网站是正确的。 许多网站,包括 Google Checkout我相信,依靠卡片types的自动检测。 这很方便,使用户界面不那么混乱(less一个input框),节省了时间。 前进!
我听说有一个很好的理由让他们select(即使你可以弄明白)。 所以他们知道你接受的信用卡清单。
作为一名消费者,我讨厌先select一张卡片。 我想开始input数字。
Wroblewski在第153-154页的Web Form Design中讨论了这个问题。 在“不必要的input”一章的“移除问题”部分。 给出的例子是贝宝,当你input你的号码时,它会突出显示卡的types。
我非常确定,至less对于万事达卡,Visa,Discover和美国运通来说,这是准确的。 我从来没有与其他人合作过。
看到这个页面的最底部: 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
这里是我使用的脚本,适用于当前的卡片范围。 也对号码进行有效性检查。
/** * 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; }
这里有完整的C#或VB代码,用于代码项目中所有与CC有关的事情 。
- IsValidNumber
- GetCardTypeFromNumber
- GetCardTestNumber
- PassesLuhnTest
这篇文章已经过去了几年没有负面的评论。
维基百科包含大多数卡片前缀的列表。 您发布的链接中缺less一些卡片。 它也似乎是你提供的链接是有效的。
要求卡types的一个原因是额外的validation,比较用户提供的数字。
这是第一篇文章中提到的相同algorithm的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; } ?>
您链接的代码有一个不完整的发现BIN /范围列表 ,省略了Diner俱乐部(现在属于Discover),列出了不再存在的卡片types,应该折叠成其他types(enRoute,Carte Blanche),并忽略越来越重要的Maestro国际购物车types。
正如@亚历确认,可以从BIN号码中确定卡的types,而众多的公司都这样做,但这样做一贯而正确不是微不足道的:卡品牌不断变化,跟踪事情变得更加复杂,当你试图处理地区借记卡(爱尔兰的激光,欧洲的Maestro等) – 我还没有find一个免费的,维护(正确)的代码或algorithm的任何地方。
正如@MitMaro所指出的那样, 维基百科包含了一张卡片标识符的高级列表 ,也是一个更具体的BIN列表和范围列表 ,这是一个好的开始,正如gbjbaanb评论的, 巴克莱有一个公开发布的列表它似乎没有包括发现由于某种原因 – 大概他们不处理发现networking?)
看起来微不足道的是,一个正确的卡片识别algorithm/方法/function需要维护,所以除非你的检测程序是非关键/信息性的(例如@ Simon_Weaver的build议),否则你将把工作交给保持最新,我会build议你跳过自动检测。
这里有一个很快的肮脏的方式来自动确定卡的types,并在用户input时显示给用户。
这意味着a)用户不必select它,b)他们不会浪费时间寻找不存在的下拉菜单。
非常简单的Amex,Visa和Mastercard的jQuery版本。 如果您需要其他卡types,您可以采取
$('[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"); });
这是伴随这个(ASP.NET MVC)的jQuery:
Card number: <%= Html.TextBox("PaymentDetails.CreditCardDetails.CreditCardNumber")%> Card Type: <span id="ccCardType" class="unknown">Enter card number above</span>
我有一个css规则.unknown
显示灰色文本。
条纹已经提供了这个梦幻般的JavaScript库检测卡scheme。 让我添加一些代码片段,并告诉你如何使用它。
首先把它包含到你的网页中
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.payment/1.2.3/jquery.payment.js " ></script>
其次,使用cardType函数来检测卡scheme。
$(document).ready(function() { var type = $.payment.cardType("4242 4242 4242 4242"); //test card number console.log(type); });
以下是更多示例和演示的参考链接。
- 条纹博客jquery.payment.js
- Github存储库
这个在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
如果您接受的所有信用卡都具有相同的属性,则只需让用户input卡号和其他属性(失效date,CVV等)。 但是,某些卡types需要input不同的字段(例如,UK Maestro卡的开始date或发行编号)。 在这些情况下,你必须拥有所有的字段,从而混淆了用户,或者一些Javascript来隐藏/显示相关字段,再次使得用户体验有点奇怪(当他们input信用卡号码时字段消失/出现) 。 在这种情况下,我build议首先要求卡的types。
就我个人而言,我没有问题先select卡types。 但是我认为信用卡号码input有两个方面是有问题的。
最糟糕的是无法进入数字组之间的空间。 包括打印在物理卡片上的空格将使得用户进行扫描以确认他们已经正确input信息的数字变得非常容易。 每当我遇到这种无处不在的缺陷时,我觉得我正在被推进到一个石器时代,当用户input无法过滤删除不必要的字符。
第二个是在拨打电话订购聆听供应商时重复卡号的需要。 所有的信用卡收件人实际上需要的是一个用户界面,使他们能够访问校验数字scheme,validationcc号码是否有效。 根据这个algorithm,前15位(或者是很多)数字计算最后一位数字 – 实际上不可能“愚弄”。 对于胖手指编号来说,“通过”要求在15位数中至less有两个相互抵消的错误。 除非algorithm存在被我怀疑的相邻数字(常见的input错误)不相称地愚弄的缺陷,否则我除了比任何人类双重检查更可靠。