从卡号识别卡类型

26

我有一个卡牌类型的数组,看起来像这样

var cards = new Array();

cards [0] = {name: "VISA", length: "13,16", prefixes: "4", checkdigit: true};
cards [1] = {name: "VISA_DELTA/ELECTRON", length: "16", prefixes: "417500,4917,4913",     checkdigit: true};
然而,我希望能够根据输入的卡号查找卡类型。例如,如果他们从下拉列表中选择了他们的卡类型,即Visa,则信用卡号码应该以4开头;否则,在提交表单时,应该显示某种消息,说明这是什么(任何卡类型),请更改卡类型。 感谢任何帮助。
信用卡号文本字段的ID为CardNumber。我不确定是否需要其他信息,我有一个名为Validate的函数,用于验证表单的其余部分,并调用一个名为Calculate的函数来执行Luhn检查。
4个回答

72

我认为你可能正在寻找类似于以下内容:

<script type="text/javascript">
function GetCardType(number)
{
    // visa
    var re = new RegExp("^4");
    if (number.match(re) != null)
        return "Visa";

    // Mastercard 
    // Updated for Mastercard 2017 BINs expansion
     if (/^(5[1-5][0-9]{14}|2(22[1-9][0-9]{12}|2[3-9][0-9]{13}|[3-6][0-9]{14}|7[0-1][0-9]{13}|720[0-9]{12}))$/.test(number)) 
        return "Mastercard";

    // AMEX
    re = new RegExp("^3[47]");
    if (number.match(re) != null)
        return "AMEX";

    // Discover
    re = new RegExp("^(6011|622(12[6-9]|1[3-9][0-9]|[2-8][0-9]{2}|9[0-1][0-9]|92[0-5]|64[4-9])|65)");
    if (number.match(re) != null)
        return "Discover";

    // Diners
    re = new RegExp("^36");
    if (number.match(re) != null)
        return "Diners";

    // Diners - Carte Blanche
    re = new RegExp("^30[0-5]");
    if (number.match(re) != null)
        return "Diners - Carte Blanche";

    // JCB
    re = new RegExp("^35(2[89]|[3-8][0-9])");
    if (number.match(re) != null)
        return "JCB";

    // Visa Electron
    re = new RegExp("^(4026|417500|4508|4844|491(3|7))");
    if (number.match(re) != null)
        return "Visa Electron";

    return "";
}
</script>

原帖发布于 http://mel-green.com/2008/11/determine-credit-card-type-with-javascript/


2
虽然这可能回答了问题,但仅包含链接的答案是不被鼓励的。如果链接失效(链接腐败),这个答案将不包含任何信息。考虑编辑此答案以包括链接中的相关细节。 - Chris Baker
3
谢谢- 不过我在3年前就已经回答过这个问题了。感谢你的负评。 - Russ Clarke
3
我不想就此展开辩论,因为这对网站并不有益,也不是新成员体验友好的环境,但在过去几年中,S/O的文化发生了很大变化。曾经有一段时间,发布链接通常被认为是可以接受的,特别是如果我仅仅贴出别人文章的内容,会让人感觉像在窃取别人的东西。我同意现在的做法,但我认为对几年前的某些事情进行反向投票并没有帮助。这只是我的看法。 - Russ Clarke
8
顺便提一下,你需要先输入 Visa electron,然后才是 visa,否则它会捕捉到 visa 并退出。Amex/Diners 也是同理。 - Shanimal
2
注意对于任何其他遇到此问题的人; Mastercard已经添加了一个新的BIN系列(222100-272099),因此正则表达式必须进行修改以考虑这一点。回答此问题的重复内容已经解释了这一点。 - k3davis
显示剩余5条评论

3

2
信用卡公司有一份相对明确的前缀列表,这些前缀与信用卡类型相关。这些前缀从一个数字开始(所有以'5'开头的都是万事达卡),到一些长达六七位数的字符串,适用于更为不常见的卡类型,也适用于主流卡,但能够识别发卡银行,因此能够识别卡类型和发卡银行。下面是我找到的资源之一:http://www.beachnet.com/~hstiles/cardtype.html你可能还想看看维基百科:http://en.wikipedia.org/wiki/Credit_card_numbers不利之处在于,虽然现在在流通的前缀几乎是固定的,但他们始终需要提供更多的前缀,因此如果您使用它来检查较长的前缀范围,则需要确保将任何前缀列表保持最新状态。

1
偶尔他们也会取消某些范围,或将它们标记为仅限ATM/无电子商务/无CNP等。 - Alex K.

1

卡片前缀方案在BIN(银行标识号码)列表中详细说明并定期更改,我建议您不要根据PAN的全部前6位进行验证,除非您计划定期更新,并且仅对前几位数字进行粗略检查(例如,忽略Visa / Electon的前两位 48 *,而Visa的长度可以跨越16-19个数字)。

如果您在英国; http://www.barclaycard.co.uk/business/documents/pdfs/bin_rules.pdf


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接