首页 文章

按编号确定信用卡类型?

提问于
浏览
67

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

这是推荐还是总是向客户询问他们使用的信用卡类型?

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

谢谢

15 回答

  • 32

    是的,您提到的网站是正确的 . 许多网站,包括Google Checkout我相信,依靠自动检测卡片类型 . 它很方便,使得UI不那么杂乱(少一个输入框)并节省时间 . 前进!

  • 4

    我听说过一个很好的理由让他们选择(即使你可以搞清楚) . 这样他们就知道你接受的信用卡清单 .

  • 5

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

    Wroblewski的第25-154页的Web Form Design讨论了这个问题 . 它输入了你的电话号码.2526305_ .

  • 2

    我非常肯定,至少对于万事达卡,维萨卡,发现版和美国运通卡而言,这是准确的 . 我从未与其他任何人合作过 .

    请参见本页底部: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

  • 0

    这是我使用的脚本,适用于当前的卡片范围 . 还会对号码进行有效性检查 .

    /**
    * 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;
    }
    
  • 2

    这是codeproject上的Complete C# or VB code for all kinds of CC related things .

    • IsValidNumber

    • GetCardTypeFromNumber

    • GetCardTestNumber

    • PassesLuhnTest

    这篇文章已经发表了几年没有负面评论 .

  • 5

    Wikipedia包含大多数卡前缀的列表 . 您发布的链接中缺少某些卡片 . 您提供的链接似乎也是有效的 .

    要求卡类型的一个原因是进行额外验证,比较用户提供的数字与数字 .

  • 1

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

    您链接的代码有一个 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的建议),否则你将把工作付诸实践保持最新,我建议你跳过自动检测 .

  • 1

    这是一种快速的脏方法,可以自动确定卡片类型,并在用户输入时将其显示给用户 .

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

    非常简单的jQuery版本适用于Amex,Visa和Mastercard . 如果你需要其他卡类型,你可以采取

    $('[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规则来显示灰色文本 .

  • 11

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

    以下是更多示例和演示的参考链接 .

  • 3

    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
    
  • 1

    如果您接受的所有信用卡具有相同的属性,则只需让用户输入卡号和其他属性(有效期,CVV等) . 但是,某些卡类型需要输入不同的字段(例如,英国Maestro卡的开始日期或发行号) . 在这些情况下,您必须拥有所有字段,从而混淆用户,或一些Javascript来隐藏/显示相关字段,再次使用户体验有点奇怪(字段消失/出现,因为他们输入信用卡号码) . 在这些情况下,我建议先询问卡片类型 .

  • 3

    就个人而言,我首先选择卡片类型没有问题 . 但在我看来,信用卡号输入有两个方面存在问题 .

    最糟糕的是无法在数字组之间输入空格 . 包括打印在物理卡上的空格将使用户更容易扫描数字,以验证他们是否正确输入了信息 . 每当我遇到这种无处不在的缺陷时,我觉得当用户输入无法过滤以删除不必要的字符时,我被推向了一个石器时代 .

    第二个是需要在拨打电话订单时听取供应商重复给您的卡号 . 所有信用卡接收者实际需要的是一个UI,使他们能够访问校验数字方案,该方案验证cc号码是否有效 . 根据该算法,前15个(或多个)数字计算最后一个数字 - 实际上不可能“傻瓜” . 对于“通过”的胖指数,需要在15位数中至少有两个相互抵消的错误 . 除非算法受到通过转置相邻数字(一个常见的输入错误)而不成比例地愚弄的缺点,我怀疑,除了它比任何人类双重检查更可靠 .

  • 7

    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

相关问题