67

クレジット カード番号だけでクレジット カードの種類を判断できますか?

これは推奨されますか、それともクライアントが使用しているクレジット カードの種類を常に尋ねる必要がありますか?

私はそれについてグーグルで検索し、このアルゴリズムを見つけました: http://cuinl.tripod.com/Tips/o-1.htm、これは信頼できますか?

4

15 に答える 15

32

はい、あなたが言及したサイトは正しいです。多くのサイトを含む。Google Checkout は、カードの種類の自動検出に依存していると思います。これは便利で、UI がすっきりして (入力ボックスが 1 つ減ります)、時間を節約できます。どうぞ!

于 2009-08-20T19:04:40.917 に答える
21

私は彼らに選ばせる正当な理由を 1 つ聞いたことがあります (たとえあなたがそれを理解できるとしても)。彼らがあなたが受け入れるクレジットカードのリストを知っているように.

于 2009-08-20T19:07:43.250 に答える
11

消費者として、私は最初にカードを選ぶのが嫌いです。番号の入力を開始したいだけです。

この問題は、153 ~ 154 ページの Wroblewski のWeb フォーム デザインで説明されています。「不要な入力」の章の「質問の削除」セクションにあります。例として挙げたのは Paypal で、番号を入力するとカードの種類が強調表示されます。

于 2009-08-20T19:25:57.927 に答える
7

少なくとも MasterCard、Visa、Discover、American Express については、それが正確であると確信しています。私は他の誰とも一緒に仕事をしたことがありません。

このページの一番下を参照してください: 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

于 2009-08-20T19:07:17.277 に答える
5

codeprojectのすべての種類の CC 関連の完全な C# または VB コードを次に示します。

  • IsValidNumber
  • GetCardTypeFromNumber
  • GetCardTestNumber
  • PassesLuhnTest

この記事は、否定的なコメントなしで数年間アップされています。

于 2009-11-22T23:19:00.487 に答える
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;
}
于 2009-08-20T19:10:35.727 に答える
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;
 }
 ?>
于 2011-10-14T12:12:50.383 に答える
4

ウィキペディアには、ほとんどのカード プレフィックスのリストが含まれています。投稿したリンクから一部のカードが欠落しています。また、提供されたリンクは有効であるようです。

カードの種類を尋ねる理由の 1 つは、追加の検証のためです。ユーザーが提供したものと番号を比較します。

于 2009-08-20T19:13:19.497 に答える
3

リンクしたコードには、Discover の不完全な BIN/範囲リストがあり、Diner's club (現在は Discover に属しています) が省略されており、存在しないカード タイプがリストされており、他のタイプ (enRoute、Carte Blanche) に折りたたむ必要があります。ますます重要なマエストロインターナショナルのカートタイプ。

@Alex が確認したように、BIN 番号からカードの種類を判断することは可能であり、多くの企業がそれを行っていますが、一貫して正確に判断することは簡単ではありません。地域のデビットカード (アイルランドのレーザー、ヨーロッパのマエストロなど) - このための無料で維持されている (正しい) コードまたはアルゴリズムをどこにも見つけていません。

@MitMaro が指摘したように、ウィキペディアにはカード識別子の高レベルのリストとBIN 番号と範囲のより具体的なリストが含まれており、これは良いスタートです。何らかの理由で Discover が含まれていないようです。おそらく、Discover ネットワークで処理されていないのでしょうか?)

些細なことのように思えるかもしれませんが、正しいカード識別アルゴリズム/方法/機能を維持するには作業が必要です。そのため、検出ルーチンが重要でない/情報を提供しない限り (@Simon_Weaver の提案など)、または次の作業を行う必要があります。自動検出をスキップすることをお勧めします。

于 2012-07-09T12:15:57.563 に答える
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>

.unknownグレー表示されたテキストを表示するためのcssルールがあります。

于 2009-10-24T05:20:50.757 に答える
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
于 2009-08-20T19:46:45.340 に答える
0

https://binlist.net/は無料の API を提供しています。カード番号の最初の 6 桁または 8 桁、つまり以前は銀行識別番号 (BIN) として知られていた発行者識別番号 (IIN) のみを入力する必要があります。

curl -H "Accept-Version: 3" "https://lookup.binlist.net/45717360"

(より具体的な質問からクロスポスト:デビットカードとクレジットカードの違いをどのように伝えるか

于 2019-02-09T07:40:57.153 に答える