wake-up-neo.com

Kreditkartentyp nach Nummer bestimmen?

Kann der Kreditkartentyp ausschließlich anhand der Kreditkartennummer ermittelt werden?

Wird dies empfohlen oder fragen Sie den Kunden immer nach der Art der verwendeten Kreditkarte?

Ich habe gegoogelt und diesen Algorithmus gefunden: http://cuinl.tripod.com/Tips/o-1.htm , ist das zuverlässig?

Vielen Dank

67
Henry

Ja, die von Ihnen erwähnte Site ist korrekt. Viele Standorte inkl. Ich glaube, Google Checkout setzt auf die automatische Erkennung des Kartentyps. Es ist praktisch, macht die Benutzeroberfläche weniger unübersichtlich (ein Eingabefeld weniger) und spart Zeit. Gehen Sie geradeaus!

32
Alex

Ich habe einen guten Grund gehört, sie dazu zu bringen, sie auszuwählen (obwohl Sie es herausfinden können). Damit sie die Liste der von Ihnen akzeptierten Kreditkarten kennen.

21
Lou Franco

Als Verbraucher hasse ich es, zuerst eine Karte auszuwählen. Ich möchte einfach die Nummer eingeben.

Dieses Problem wird in Wroblewskis Web Form Design auf den Seiten 153-154 erörtert. Es befindet sich im Abschnitt "Entfernen von Fragen" des Kapitels "Unnötige Eingaben". Das angegebene Beispiel ist Paypal, das den Kartentyp angibt, wenn Sie Ihre Nummer eingeben.

11
Nosredna

Ich bin mir ziemlich sicher, dass dies zumindest für MasterCard, Visa, Discover und American Express zutreffend ist. Ich habe noch nie mit einem der anderen gearbeitet.

Siehe am Ende dieser Seite: http://www.merchantplus.com/resources/pages/credit-card-logos-and-test-numbers/

Dies könnte auch für Sie nützlich sein. " http://www.beachnet.com/~hstiles/cardtype.html

Das ist ziemlich interessant für: http://en.wikipedia.org/wiki/Bank_card_number

7
AaronLS

hier ist das Skript, das ich verwende, das mit aktuellen Kartenbereichen funktioniert. führt auch eine Gültigkeitsprüfung der Nummer durch. 

/**
* 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;
}
5
Niko

Hier ist Complete C # oder VB Code für alle Arten von CC-bezogenen Dingen im Codeprojekt.

  • IsValidNumber
  • GetCardTypeFromNumber
  • GetCardTestNumber
  • PassesLuhnTest

Dieser Artikel ist seit ein paar Jahren ohne negative Kommentare.

5
Simon_Weaver

Wikipedia enthält eine Liste der meisten Kartenpräfixe. Einige Karten fehlen in dem Link, den Sie gepostet haben. Es scheint auch, dass der von Ihnen angegebene Link gültig ist.

Ein Grund, nach dem Kartentyp zu fragen, ist die zusätzliche Validierung. Vergleichen Sie die Angaben des Benutzers mit der Nummer.

4
MitMaro

Der Code, den Sie verknüpfen, enthält eine unvollständige BIN/Bereichsliste für Discover, lässt Diner's Club (der jetzt ohnehin zu Discover gehört) weg, listet Kartentypen auf, die nicht mehr vorhanden sind und in andere Typen (enRoute, Carte Blanche) zusammengefasst werden sollten. und ignoriert den immer wichtiger werdenden Kartentyp von Maestro International. 

Wie @Alex bestätigt hat, ist es möglich, den Kartentyp anhand der BIN-Nummer zu bestimmen. Dies ist bei zahlreichen Unternehmen nicht der Fall. Konsequente und korrekte Vorgehensweise ist nicht trivial: Kartenmarken ändern sich ständig, und das Nachverfolgen der Dinge wird schwieriger, wenn Sie versuchen, damit umzugehen Regionale Debitkarten (Laser in Irland, Maestro in Europa usw.) - Ich habe dafür nirgendwo einen freien und gepflegten (korrekten) Code oder Algorithmus gefunden.

Wie @MitMaro outed, enthält Wikipedia eine übergeordnete Liste von Kartenbezeichnern und außerdem eine spezifischere Liste von BIN-Nummern und -Bereichen , was ein guter Anfang ist, und wie gbjbaanb kommentiert, Barclays hat eine öffentlich veröffentlichte Liste (scheint jedoch aus irgendeinem Grund nicht Discover zu enthalten - vermutlich wird diese nicht im Discover-Netzwerk verarbeitet?)

So einfach es auch erscheinen mag, ein korrekter Kartenidentifikationsalgorithmus/-methode/-funktion muss gewartet werden, es sei denn, Ihre Erkennungsroutine ist nicht kritisch/informativ (z. B. der Vorschlag von @ Simon_Weaver), OR Um es auf dem neuesten Stand zu halten, würde ich empfehlen, die automatische Erkennung zu überspringen.

3
Tao

Dies ist die PHP-Version desselben Algorithmus, der im 1. Beitrag erwähnt wird

<?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
Shahzad Malik

Hier können Sie den Kartentyp schnell und einfach ermitteln und dem Benutzer während der Eingabe zeigen.

Das bedeutet A) Der Benutzer muss es nicht auswählen und B) Sie verschwenden keine Zeit mit der Suche nach einem Dropdown, das nicht vorhanden ist.

Sehr einfache jQuery-Version für Amex, Visa und Mastercard. Falls Sie andere Kartentypen benötigen, können Sie die 

 $('[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");
     });

Dies ist die jQuery (ASP.NET-MVC):

  Card number: <%= Html.TextBox("PaymentDetails.CreditCardDetails.CreditCardNumber")%>
  Card Type: <span id="ccCardType" class="unknown">Enter card number above</span>

Ich habe eine CSS-Regel für .unknown, um ausgegrauten Text anzuzeigen.

2
Simon_Weaver

Stripe hat diese fantastische javascript - Bibliothek zur Erkennung von Kartenschemata bereitgestellt. Lassen Sie mich einige Codeausschnitte hinzufügen und Ihnen zeigen, wie Sie diese verwenden. 

Fügen Sie es als erstes in Ihre Webseite ein

<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.payment/1.2.3/jquery.payment.js " ></script>

Verwenden Sie zweitens die Funktion cardType zur Erkennung des Kartenschemas.

$(document).ready(function() {              
            var type = $.payment.cardType("4242 4242 4242 4242"); //test card number
            console.log(type);                                   
}); 

Hier finden Sie die Referenzlinks für weitere Beispiele und Demos.

  1. Streifen-Blog für jquery.payment.js
  2. Github-Repository
2
Naina

Ich persönlich habe kein Problem damit, zuerst den Kartentyp zu wählen. Allerdings gibt es zwei Aspekte der Kreditkartennummerierung, die aus meiner Sicht problematisch sind. 

Das Schlimmste ist die Unfähigkeit, Leerzeichen zwischen Zahlengruppen einzugeben. Wenn Sie die auf den physischen Karten aufgedruckten Felder einschließen, werden die Ziffern für den Benutzer erheblich einfacher, um zu prüfen, ob die Informationen richtig eingegeben wurden. Jedes Mal, wenn ich auf diesen allgegenwärtigen Mangel stoße, habe ich das Gefühl, ich werde in eine Steinzeit rückwärts getrieben, wenn die Benutzereingaben nicht gefiltert werden könnten, um unnötige Zeichen zu entfernen. 

Die zweite ist die Notwendigkeit, bei einer telefonischen Bestellung dem Verkäufer zuzuhören, die Kartennummer erneut zu wiederholen. Der Kreditkartenempfänger benötigt lediglich eine Benutzeroberfläche, über die er Zugriff auf das Prüfziffernschema erhält, das die Gültigkeit einer CC-Nummer überprüft. Gemäß diesem Algorithmus berechnen die ersten 15 (oder auch viele) Ziffern die letzte Ziffer - und es ist praktisch unmöglich, "zu täuschen". Damit eine Nummer mit einem dicken Finger "durchgehen" kann, müssen mindestens zwei sich gegenseitig aufhebende Fehler zwischen den 15 Ziffern bestehen. Wenn der Algorithmus nicht unter dem Defekt leidet, durch das Umstellen benachbarter Zahlen (ein üblicher Eingabefehler), den ich bezweifle, unproportional getäuscht wird, bezweifle ich, dass er zuverlässiger ist als jede menschliche Überprüfung. 

1
OneUponAProgram

Wenn alle Kreditkarten, die Sie akzeptieren, dieselben Eigenschaften haben, lassen Sie den Benutzer einfach die Kartennummer und andere Eigenschaften (Ablaufdatum, CVV usw.) eingeben. Bei einigen Kartentypen müssen jedoch andere Felder eingegeben werden (z. B. Startdatum oder Ausgabenummer für britische Maestro-Karten). In diesen Fällen müssen Sie entweder alle Felder verwenden, um den Benutzer zu verwirren, oder ein wenig Javascript, um die relevanten Felder auszublenden/anzuzeigen, was wiederum die Benutzererfahrung etwas komisch erscheinen lässt (Felder verschwinden/erscheinen, wenn sie die Kreditkartennummer eingeben). . In diesen Fällen empfehle ich zuerst nach dem Kartentyp zu fragen.

1
dovetalk

Diese Implementierung in Python sollte für AmEx, Discover, Master Card und Visa funktionieren:

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
Travis

https://binlist.net/ bietet eine kostenlose API. Sie müssen nur die ersten 6 oder 8 Ziffern der Kartennummer eingeben, d. H. Die Emittentenidentifikationsnummern (IIN), die zuvor als Bankidentifikationsnummer (BIN) bekannt waren. 

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

(Cross-Posting aus einer spezifischeren Frage: Wie unterscheidet man eine Debitkarte von einer Kreditkarte )

0
pd12