600 votes

Comment détectez-vous le type de carte de crédit en fonction du nombre?

J'essaie de comprendre comment détecter le type de carte de crédit en fonction de son nombre. Est-ce que quelqu'un sait d'une manière définitive et fiable de trouver ceci?

892voto

senfo Points 8611

La carte de crédit/débit nombre est appelé un PAN, ou le Numéro de Compte Primaire. Les six premiers chiffres de la CASSEROLE sont prises à partir de l' IIN, ou de l'Émetteur Numéro d'Identification, appartenant à la banque émettrice (Iin ont été précédemment connu sous le BIN - Identification de la Banque de Numéros - de sorte que vous pouvez voir les références de cette terminologie dans certains documents). Ces six chiffres, sont soumis à une norme internationale, l'ISO/CEI 7812, et peut être utilisé pour déterminer le type de carte de le nombre.

Malheureusement, le réel de l'ISO/CEI 7812 de la base de données n'est pas disponible, cependant il y a des listes non officielles, à la fois commercial et gratuit, y compris sur Wikipédia.

De toute façon, pour détecter le type du numéro, vous pouvez utiliser une expression régulière comme ceux ci-dessous: Crédit pour origine des expressions

Visa: ^4[0-9]{6,}$ Visa numéros de carte de commencer avec un 4.

MasterCard: ^5[1-5][0-9]{5,}$ MasterCard numéros de commencer avec les numéros 51 à 55, mais ce ne détectera que les cartes de crédit MasterCard; il y a d'autres cartes émises à l'aide de la carte MasterCard système qui n'entrent pas dans cette IIN gamme.

American Express: ^3[47][0-9]{5,}$ American Express numéros de carte de commencer avec 34 ou 37.

Diners Club: ^3(?:0[0-5]|[68][0-9])[0-9]{4,}$ Diners Club des numéros de carte de commencer avec 300 par 305, 36 ou 38. Il y a des cartes Diners Club qui commencent par 5 et 16 chiffres. Ces sont une joint-venture entre Diners Club et MasterCard, et doit être traitée comme une MasterCard.

Découvrez: ^6(?:011|5[0-9]{2})[0-9]{3,}$ Découvrir des numéros de carte de commencer avec 6011 ou 65 ans.

JCB: ^(?:2131|1800|35[0-9]{3})[0-9]{3,}$ JCB cartes de commencer avec 2131, 1800 ou 35.

Malheureusement, il ya un certain nombre de types de cartes traitées avec la MasterCard système qui ne vivent pas dans la carte MasterCard EN gamme (numéros commençant 51...55); la plus importante est le cas de cartes Maestro, dont beaucoup ont été délivrés par d'autres banques IIN chaînes sont situés partout dans le numéro de l'espace. En conséquence, il peut être préférable de supposer que toute carte qui n'est pas d'un autre type, vous acceptez doit être une MasterCard.

Important: les numéros de carte de faire varier la longueur; par exemple, le Visa est délivré par le passé avec des cartes à 13 chiffres, des Casseroles et des cartes avec 16 chiffres, des Casseroles. Visa de la documentation indique qu'elle peut délivrer ou ont publié des numéros avec entre 12 et 19 chiffres. Par conséquent, vous ne devez pas vérifier la longueur du numéro de la carte, autres que pour vérifier qu'il a au moins 7 chiffres (pour une IIN plus un chiffre de contrôle, qui doit correspondre à la valeur prédite par l'algorithme de Luhn).

Un autre conseil: avant de traiter le titulaire d'une carte de PAN, la bande d'espaces et les caractères de ponctuation, à partir de l'entrée. Pourquoi? Parce que c'est généralement beaucoup plus facile d'entrer les chiffres dans les groupes, semblable à la façon dont ils sont affichés sur le recto de votre carte de crédit, c'est à dire

4444 4444 4444 4444

est beaucoup plus facile d'entrer correctement que

4444444444444444

Il n'y a vraiment aucun avantage à châtier l'utilisateur parce qu'ils ont les caractères saisis, vous ne vous attendez pas ici.

Ceci implique également de s'assurer que votre champs d'entrée de la place pour au moins 24 caractères, sinon les utilisateurs qui entrent dans les espaces de l'espace disponible. Je vous recommande de rendre le champ suffisamment large pour afficher 32 caractères et permettent jusqu'à 64; qui donne beaucoup d'espace pour l'expansion.

Voici une image qui donne un peu plus de perspicacité:

Credit Card Verification

97voto

Anatoliy Points 7775

En javascript:

 function detectCardType(number) {
    var re = {
        electron: /^(4026|417500|4405|4508|4844|4913|4917)\d+$/,
        maestro: /^(5018|5020|5038|5612|5893|6304|6759|6761|6762|6763|0604|6390)\d+$/,
        dankort: /^(5019)\d+$/,
        interpayment: /^(636)\d+$/,
        unionpay: /^(62|88)\d+$/,
        visa: /^4[0-9]{12}(?:[0-9]{3})?$/,
        mastercard: /^5[1-5][0-9]{14}$/,
        amex: /^3[47][0-9]{13}$/,
        diners: /^3(?:0[0-5]|[68][0-9])[0-9]{11}$/,
        discover: /^6(?:011|5[0-9]{2})[0-9]{12}$/,
        jcb: /^(?:2131|1800|35\d{3})\d{11}$/
    };
    if (re.electron.test(number)) {
        return 'ELECTRON';
    } else if (re.maestro.test(number)) {
        return 'MAESTRO';
    } else if (re.dankort.test(number)) {
        return 'DANKORT';
    } else if (re.interpayment.test(number)) {
        return 'INTERPAYMENT';
    } else if (re.unionpay.test(number)) {
        return 'UNIONPAY';
    } else if (re.visa.test(number)) {
        return 'VISA';
    } else if (re.mastercard.test(number)) {
        return 'MASTERCARD';
    } else if (re.amex.test(number)) {
        return 'AMEX';
    } else if (re.diners.test(number)) {
        return 'DINERS';
    } else if (re.discover.test(number)) {
        return 'DISCOVER';
    } else if (re.jcb.test(number)) {
        return 'JCB';
    } else {
        return undefined;
    }
}
 

Test de l'unité:

 describe('CreditCard', function() {
    describe('#detectCardType', function() {

        var cards = {
            '8800000000000000': 'UNIONPAY',

            '4026000000000000': 'ELECTRON',
            '4175000000000000': 'ELECTRON',
            '4405000000000000': 'ELECTRON',
            '4508000000000000': 'ELECTRON',
            '4844000000000000': 'ELECTRON',
            '4913000000000000': 'ELECTRON',
            '4917000000000000': 'ELECTRON',

            '5019000000000000': 'DANKORT',

            '5018000000000000': 'MAESTRO',
            '5020000000000000': 'MAESTRO',
            '5038000000000000': 'MAESTRO',
            '5612000000000000': 'MAESTRO',
            '5893000000000000': 'MAESTRO',
            '6304000000000000': 'MAESTRO',
            '6759000000000000': 'MAESTRO',
            '6761000000000000': 'MAESTRO',
            '6762000000000000': 'MAESTRO',
            '6763000000000000': 'MAESTRO',
            '0604000000000000': 'MAESTRO',
            '6390000000000000': 'MAESTRO',

            '3528000000000000': 'JCB',
            '3589000000000000': 'JCB',
            '3529000000000000': 'JCB',

            '6360000000000000': 'INTERPAYMENT',

            '4916338506082832': 'VISA',
            '4556015886206505': 'VISA',
            '4539048040151731': 'VISA',
            '4024007198964305': 'VISA',
            '4716175187624512': 'VISA',

            '5280934283171080': 'MASTERCARD',
            '5456060454627409': 'MASTERCARD',
            '5331113404316994': 'MASTERCARD',
            '5259474113320034': 'MASTERCARD',
            '5442179619690834': 'MASTERCARD',

            '6011894492395579': 'DISCOVER',
            '6011388644154687': 'DISCOVER',
            '6011880085013612': 'DISCOVER',
            '6011652795433988': 'DISCOVER',
            '6011375973328347': 'DISCOVER',

            '345936346788903': 'AMEX',
            '377669501013152': 'AMEX',
            '373083634595479': 'AMEX',
            '370710819865268': 'AMEX',
            '371095063560404': 'AMEX'
        };

        Object.keys(cards).forEach(function(number) {
            it('should detect card ' + number + ' as ' + cards[number], function() {
                Basket.detectCardType(number).should.equal(cards[number]);
            });
        });
    });
});
 

26voto

Usman Y Points 157
   public string GetCreditCardType(string CreditCardNumber)
    {
        Regex regVisa = new Regex("^4[0-9]{12}(?:[0-9]{3})?$");
        Regex regMaster = new Regex("^5[1-5][0-9]{14}$");
        Regex regExpress = new Regex("^3[47][0-9]{13}$");
        Regex regDiners = new Regex("^3(?:0[0-5]|[68][0-9])[0-9]{11}$");
        Regex regDiscover = new Regex("^6(?:011|5[0-9]{2})[0-9]{12}$");
        Regex regJSB= new Regex("^(?:2131|1800|35\\d{3})\\d{11}$");


        if(regVisa.IsMatch(CreditCardNumber))
            return "VISA";
        if (regMaster.IsMatch(CreditCardNumber))
            return "MASTER";
        if (regExpress.IsMatch(CreditCardNumber))
            return "AEXPRESS";
        if (regDiners.IsMatch(CreditCardNumber))
            return "DINERS";
        if (regDiscover.IsMatch(CreditCardNumber))
            return "DISCOVERS";
        if (regJSB.IsMatch(CreditCardNumber))
            return "JSB";
        return "invalid";
    }
 

Voici la fonction pour vérifier le type de carte de crédit en utilisant Regex

21voto

Rashy Points 323

Regarde ça:

http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256CC70060A01B

 function isValidCreditCard(type, ccnum) {
/* Visa: length 16, prefix 4, dashes optional.
Mastercard: length 16, prefix 51-55, dashes optional.
Discover: length 16, prefix 6011, dashes optional.
American Express: length 15, prefix 34 or 37.
Diners: length 14, prefix 30, 36, or 38. */

  var re = new Regex({ "visa": "/^4\d{3}-?\d{4}-?\d{4}-?\d",
                       "mc": "/^5[1-5]\d{2}-?\d{4}-?\d{4}-?\d{4}$/",
                       "disc": "/^6011-?\d{4}-?\d{4}-?\d{4}$/",
                       "amex": "/^3[47]\d{13}$/",
                       "diners": "/^3[068]\d{12}$/"}[type.toLowerCase()])

   if (!re.test(ccnum)) return false;
   // Remove all dashes for the checksum checks to eliminate negative numbers
   ccnum = ccnum.split("-").join("");
   // Checksum ("Mod 10")
   // Add even digits in even length strings or odd digits in odd length strings.
   var checksum = 0;
   for (var i=(2-(ccnum.length % 2)); i<=ccnum.length; i+=2) {
      checksum += parseInt(ccnum.charAt(i-1));
   }
   // Analyze odd digits in even length strings or even digits in odd length strings.
   for (var i=(ccnum.length % 2) + 1; i<ccnum.length; i+=2) {
      var digit = parseInt(ccnum.charAt(i-1)) * 2;
      if (digit < 10) { checksum += digit; } else { checksum += (digit-9); }
   }
   if ((checksum % 10) == 0) return true; else return false;
}
 

18voto

Fivell Points 5521

récemment, j'ai besoin de cette fonctionnalité, j'ai été portage de Zend Framework Carte de Crédit du programme de validation de ruby. ruby gem: https://github.com/Fivell/credit_card_validations zend framework: https://github.com/zendframework/zf2/blob/master/library/Zend/Validator/CreditCard.php

Ils utilisent tous les deux INN plages de détection de type. Vous pouvez lire à ce sujet INN ici http://en.wikipedia.org/wiki/List_of_Issuer_Identification_Numbers

En fonction de cela, vous pouvez détecter la carte de crédit sinon (sans les expressions régulières,mais de déclarer certaines règles sur les préfixes et la longueur possible)

Nous avons donc suivant les règles de la plupart des cartes utilisées

   VISA = [
        {length: [16], prefixes: ['4']}
    ]
    MASTERCARD = [
        {length: [16], prefixes: ['51', '52', '53', '54', '55']}
    ]
    ######## other brands ########
    AMEX = [
        {length: [15], prefixes: ['34', '37']}
    ]

    DINERS = [
        {length: [14], prefixes: ['300', '301', '302', '303', '304', '305', '36']},
    ]

    #There are Diners Club (North America) cards that begin with 5. These are a joint venture between Diners Club and MasterCard, and are processed like a MasterCard
    DINERS_US = [
        {length: [16], prefixes: ['54', '55']}
    ]

    DISCOVER = [
        {length: [16], prefixes: ['6011', '622126', '622127', '622128', '622129', '62213',
                                '62214', '62215', '62216', '62217', '62218', '62219',
                                '6222', '6223', '6224', '6225', '6226', '6227', '6228',
                                '62290', '62291', '622920', '622921', '622922', '622923',
                                '622924', '622925', '644', '645', '646', '647', '648',
                                '649', '65']}
    ]

    JCB = [
        {length: [16], prefixes: ['3528', '3529', '353', '354', '355', '356', '357', '358']}
    ]


    LASER = [
        {length: [16, 17, 18, 19], prefixes: ['6304', '6706', '6771', '6709']}
    ]

    MAESTRO = [
        {length: [12, 13, 14, 15, 16, 17, 18, 19], prefixes: ['5018', '5020', '5038', '6304', '6759', '6761', '6763']}
    ]

    SOLO = [
        {length: [16, 18, 19], prefixes: ['6334', '6767']}
    ]

    UNIONPAY = [
        {length: [16, 17, 18, 19], prefixes: ['620', '621', '623', '625', '626']}
    ]

Puis par la recherche de préfixe et la comparaison de la longueur vous pouvez détecter marque de carte de crédit. Aussi, ne pas oublier luhn algorithme (c'est décrite ici http://en.wikipedia.org/wiki/Luhn).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X