web-dev-qa-db-fra.com

Déterminer le type de carte de crédit par numéro?

Le type de carte de crédit peut-il être déterminé uniquement à partir du numéro de carte de crédit?

Est-ce recommandé ou toujours demander au client le type de carte de crédit utilisé?

J'ai cherché sur Google et trouvé cet algorithme: http://cuinl.tripod.com/Tips/o-1.htm , est-ce fiable?

Merci

67
Henry

Oui, le site que vous avez mentionné est correct. De nombreux sites, incl. Je crois que Google Checkout repose sur la détection automatique du type de carte. C'est pratique, l'interface utilisateur est moins encombrée (une zone de saisie en moins) et vous fait gagner du temps. Aller de l'avant!

32
Alex

J'ai entendu une bonne raison de les faire choisir (même si vous pouvez le comprendre). Pour qu'ils connaissent la liste des cartes de crédit que vous acceptez.

21
Lou Franco

En tant que consommateur, je déteste choisir une carte en premier. Je veux juste commencer à taper le numéro.

Cette question est traitée dans le Conception de formulaire Web de Wroblewski aux pages 153-154. C'est dans la section "Suppression de questions" du chapitre "Entrées inutiles". L'exemple donné est Paypal, qui met en évidence le type de carte lorsque vous avez saisi votre numéro.

11
Nosredna

Je suis à peu près certain qu'au moins pour les cartes MasterCard, Visa, Discover et American Express, cela est exact. Je n'ai jamais travaillé avec aucun des autres.

Voir tout au bas de cette page: http://www.merchantplus.com/resources/pages/credit-card-logos-and-test-numbers/

Cela pourrait aussi vous être utile " http://www.beachnet.com/~hstiles/cardtype.html

C'est assez intéressant pour: http://en.wikipedia.org/wiki/Bank_card_number

7
AaronLS

voici le script que j'utilise qui fonctionne avec les gammes de cartes actuelles. effectue également une vérification de validité du nombre. 

/**
* 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

Voici Complétez le code C # ou VB pour toutes sortes de choses liées à CC sur codeproject.

  • IsValidNumber
  • GetCardTypeFromNumber
  • GetCardTestNumber
  • PassesLuhnTest

Cet article est publié depuis quelques années sans commentaires négatifs.

5
Simon_Weaver

Wikipedia contient la liste de la plupart des préfixes de cartes. Certaines cartes sont absentes du lien que vous avez posté. Il semble également que le lien que vous avez fourni est valide.

Une raison de demander le type de carte est pour une validation supplémentaire, comparez ce que l'utilisateur a fourni avec le nombre.

4
MitMaro

Le code que vous avez lié a un BIN/plage incomplète pour Discover, omet Diner's club (qui appartient maintenant à Discover de toute façon), répertorie les types de cartes qui n'existent plus et qui devraient être repliés dans d'autres types (enRoute, Carte Blanche) et ignore le type de chariot de plus en plus important de Maestro International. 

Comme @Alex l'a confirmé, il est possible de déterminer le type de carte à partir du numéro BIN. De nombreuses entreprises le font, mais le faire de manière cohérente et correcte n'est pas anodin: les marques de cartes changent constamment et il est de plus en plus compliqué de gérer le suivi cartes de débit régionales (Laser en Irlande, Maestro en Europe, etc.) - Je n’ai trouvé aucun code ou algorithme gratuit et maintenu (correct) à cette fin.

Comme @MitMaro l'a souligné, Wikipedia contient une liste de haut niveau d'identifiants de cartes , ainsi que une liste plus spécifique de numéros et de plages BIN , ce qui est un bon début, et comme l'a commenté gbjbaanb, Barclays a une liste publiée publiquement (mais elle ne semble pas inclure Discover pour une raison quelconque - vraisemblablement, elle ne traite pas sur le réseau Discover?)

Aussi trivial que cela puisse paraître, un algorithme/une méthode/une fonction d’identification de carte correct nécessite du travail à maintenir. Par conséquent, à moins que votre routine de détection ne soit non critique/informative (par exemple, la suggestion de @ Simon_Weaver), OR vous y allez pour mettre le travail à jour, je vous recommande de passer la détection automatique.

3
Tao

Ceci est la version php du même algorithme mentionné dans le 1er post

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

Voici un moyen rapide de déterminer automatiquement le type de carte et de le montrer à l'utilisateur pendant la saisie.

Cela signifie A) l'utilisateur n'a pas à le choisir et B) il ne perdra pas de temps à chercher un menu déroulant qui n'existe pas.

Version jQuery très simple pour Amex, Visa et Mastercard . Si vous avez besoin d'autres types de cartes, vous pouvez 

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

C'est le jQuery pour accompagner ceci (ASP.NET MVC):

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

J'ai une règle CSS pour .unknown pour afficher du texte grisé.

2
Simon_Weaver

Stripe a fourni cette fantastique bibliothèque javascript pour la détection de schémas de cartes. Permettez-moi d'ajouter quelques extraits de code et de vous montrer comment l'utiliser. 

Tout d'abord, incluez-le sur votre page Web en tant que

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

Deuxièmement, utilisez la fonction cardType pour détecter le schéma de carte.

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

Voici les liens de référence pour plus d'exemples et de démos.

  1. Stripe blog for jquery.payment.js
  2. Dépôt Github
2
Naina

Personnellement, je n'ai aucun problème à choisir le type de carte en premier. Mais deux aspects de la saisie du numéro de carte de crédit sont problématiques à mon avis. 

Le pire est l'incapacité à saisir des espaces entre des groupes de nombres. L'inclusion des espaces imprimés sur les cartes physiques faciliterait considérablement la numérisation des chiffres pour permettre à l'utilisateur de vérifier s'il a correctement saisi les informations. Chaque fois que je rencontre cette lacune omniprésente, j'ai l’impression de basculer dans un âge de pierre où l’information de l’utilisateur ne pouvait pas être filtrée pour supprimer les caractères inutiles. 

La seconde est la nécessité, lors de la passation d'une commande téléphonique, d'écouter le vendeur vous répéter le numéro de la carte. Le destinataire de la carte de crédit n’a besoin que d’une interface utilisateur lui permettant d’accéder au schéma de vérification qui vérifie la validité d’un numéro de cc. Selon cet algorithme, les 15 premiers chiffres (ou quel que soit leur nombre) calculent le dernier chiffre - et il est pratiquement impossible de "tromper". Pour passer un numéro à plusieurs doigts, il faut au moins deux erreurs d’annulation mutuelle parmi les 15 chiffres. À moins que l’algorithme ne présente le défaut d’être trompé de manière disproportionnée en transposant des nombres adjacents (une erreur d’entrée commune), ce dont je doute, j’en dis qu’il est plus fiable que tout double contrôle humain. 

1
OneUponAProgram

Si toutes les cartes de crédit que vous acceptez ont les mêmes propriétés, laissez simplement l'utilisateur saisir le numéro de la carte et d'autres propriétés (date d'expiration, CVV, etc.). Cependant, certains types de cartes nécessitent la saisie de différents champs (date de début ou numéro d’émission pour les cartes UK Maestro, par exemple). Dans ces cas, vous devez soit avoir tous les champs, ce qui dérange l'utilisateur, soit utiliser du Javascript pour masquer/afficher les champs pertinents, ce qui rend l'expérience utilisateur un peu bizarre (les champs disparaissent/apparaissent lors de la saisie du numéro de carte de crédit). . Dans ces cas, je vous recommande de demander le type de carte en premier.

1
dovetalk

Cette implémentation en Python devrait fonctionner pour 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
Travis

https://binlist.net/ offre une API gratuite. Il vous suffit de saisir les 6 ou 8 premiers chiffres du numéro de carte, c'est-à-dire les numéros d'identification de l'émetteur (IIN), précédemment appelés numéro d'identification bancaire (BIN). 

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

(cross-posté d'une question plus spécifique: Comment faire la différence entre une carte de débit et une carte de crédit )

0
pd12