通过数字确定信用卡类型?


67

可以仅通过信用卡号确定信用卡类型吗?

是否建议这样做?还是我们应该总是向客户询问他们使用的信用卡类型?

我在Google上搜索了一下,并找到了以下算法:http : //cuinl.tripod.com/Tips/o-1.htm,这可靠吗?


+1-一直想知道贝宝(Paypal)的光滑卡输入表单是如何工作的。
Billy ONeal 2010年

Answers:


32

是的,您提到的网站是正确的。许多网站,包括 我相信Google Checkout依靠自动检测卡类型。它很方便,使UI更加整洁(减少了一个输入框)并节省了时间。前进!


9
+1可能为卡类型提供下拉框的唯一原因是作为错误检查的方法。
Will Bickford

3
图标下拉或列表仍然是有用的-因为它可以让你看到你进入之前,该公司接受什么类型的卡-例如,有些人可能不采取AMEX,食客,大师等等
Simon_Weaver

21

我听说有一个很好的理由选择他们(尽管您可以弄清楚)。使他们知道您接受的信用卡清单。


另外,可以检查是一件好事。
马特·鲍尔

20
有趣的理由,但我不同意。您可以用很少的图标或文字轻松地用户显示您接受的卡片,而无需让他们进行任何额外的工作。
EMP 2010年

11

作为消费者,我讨厌首先选择一张卡。我只想开始输入数字。

Wroblewski的Web窗体设计在第153-154页中讨论了此问题。在“不必要的输入”一章的“删除问题”部分中。给出的示例是Paypal,当您输入数字时,它会突出显示卡的类型。


如果他们不接受美国运通卡(经常发生)怎么办?您列出不接受的卡片了吗?
布赖恩·阿格纽

6
贝宝(Paypal)具有显示的所有允许的卡类型的图形表示,但均已重影。当您键入数字时,匹配的卡会变亮至全强度。
Nosredna,2009年

7

我可以肯定,至少对于万事达卡,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


1
barclaycardbusiness.co.uk/docs/binranges.pdf具有来自英国银行的卡的BIN范围,因此它的准确性。
gbjbaanb


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;
}

是我的坏事...我只是记得使用该功能并且由于客户的抱怨而不得不更新一些异常(某些有效的cc#没有通过)-但这实际上是由于长度检查所致
Niko

大多数卡的长度为16#(英国),Maestro最多可以为19,因此长度检查成为PITA。
克里斯·麦基


4

维基百科包含大多数卡前缀的列表。您发布的链接中缺少某些卡片。您提供的链接也似乎有效。

要求输入卡类型的原因之一是需要进行额外的验证,将用户提供的卡号与卡号进行比较。


4

这是第一篇文章中提到的相同算法的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;
 }
 ?>

3

您所链接的代码的Discover BIN /范围列表不完整,忽略了Diner的俱乐部(现在仍属于Discover),列出了不再存在的卡类型,应将其折叠为其他类型(enRoute,Carte Blanche),并忽略越来越重要的Maestro International购物车类型。

正如@Alex所确认的那样,可以从BIN号码确定卡类型,许多公司都这样做,但始终如一地正确进行并非易事:卡品牌不断变化,当您尝试处理时,跟踪事情变得更加复杂区域借记卡(爱尔兰的激光,欧洲的Maestro等)-我在任何地方都找不到免费且维护(正确)的代码或算法。

正如@MitMaro所说的那样,Wikipedia包含一个高级的卡标识符列表,以及一个更具体的BIN编号和范围列表,这是一个很好的开始。正如gbjbaanb所说,Barclays有一个公开发布的列表(由于某种原因,它似乎不包括“发现”-大概是它们未在“发现”网络上处理?)

看起来很琐碎,正确的卡识别算法/方法/功能需要维护,因此,除非您的检测例程是非关键/信息性的(例如,@ Simon_Weaver的建议),否则您将投入工作保持最新状态,我建议您跳过自动检测。


3

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);                                   
}); 

这是更多示例和演示的参考链接。

  1. jquery.payment.js的条纹博客
  2. Github仓库

2

这是一种快速肮脏的方法,可自动确定卡类型并在用户键入时向用户显示。

这意味着a)用户不必选择它,b)他们不会浪费时间寻找不存在的下拉列表。

适用于Amex,Visa和Mastercard的非常简单的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>

我有一个CSS规则.unknown来显示变灰的文本。


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

信用卡没有遵循一套规则,太糟糕了;我们有Maestro卡,它们会导致所有问题,因为它们使用的起始代码与信用卡生产商相同,并且超过16位。
克里斯·麦基

1

如果您接受的所有信用卡都具有相同的属性,则只需让用户输入卡号和其他属性(有效期,CVV等)即可。但是,某些卡类型要求输入不同的字段(例如UK Maestro卡的开始日期或发行编号)。在这种情况下,您要么必须拥有所有字段,从而使用户感到困惑,要么必须使用一些Javascript隐藏/显示相关字段,这再次使用户感到有点奇怪(字段在输入信用卡号时消失/出现)。 。在这种情况下,建议您先询问卡类型。


1

就我个人而言,我首先选择卡片类型没有问题。但是我认为信用卡号码输入有两个方面的问题。

最糟糕的是无法在数字组之间输入空格。包括印在物理卡上的空格将使数字更容易让用户扫描以验证他们是否正确输入了信息。每次遇到这种普遍存在的缺陷时,我都会感觉自己被退回石器时代,因为无法过滤用户输入以删除不必要的字符。

第二个是在下电话订单以聆听供应商向您重复卡号时的需求。信用卡接收者实际需要的只是一个UI,使他们可以访问校验数字方案,以验证抄送号是否有效。根据该算法,前15位(或许多)将计算最后一位-实际上是不可能“傻瓜”的。要使胖手指“通过”,就需要在15位数之间至少有两个相互抵消的错误。除非算法遭受因转置相邻数字而引起不成比例的欺骗(常见的输入错误)的缺陷(我对此表示怀疑),否则我会比其他任何人为的双重检查更为可靠。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.