J'essaie de comprendre comment détecter le type de carte de crédit uniquement en fonction de son numéro. Quelqu'un connaît-il un moyen définitif et fiable de le trouver?
algorithm
language-agnostic
e-commerce
Andrew Edvalson
la source
la source
Réponses:
Le numéro de carte de crédit / débit est appelé PAN ou numéro de compte principal . Les six premiers chiffres du PAN proviennent de l' IIN , ou numéro d'identification de l'émetteur , appartenant à la banque émettrice (les IIN étaient auparavant connus sous le nom de BIN - Bank Identification Numbers - de sorte que vous pouvez voir des références à cette terminologie dans certains documents). Ces six chiffres sont soumis à une norme internationale, ISO / IEC 7812 , et peuvent être utilisés pour déterminer le type de carte à partir du numéro.
Malheureusement, la base de données ISO / IEC 7812 n'est pas accessible au public, mais il existe des listes non officielles, à la fois commerciales et gratuites, y compris sur Wikipédia .
Quoi qu'il en soit, pour détecter le type à partir du nombre, vous pouvez utiliser une expression régulière comme celles ci-dessous: Crédit pour les expressions originales
Visa:
^4[0-9]{6,}$
les numéros de carte Visa commencent par un 4.MasterCard:
^5[1-5][0-9]{5,}|222[1-9][0-9]{3,}|22[3-9][0-9]{4,}|2[3-6][0-9]{5,}|27[01][0-9]{4,}|2720[0-9]{3,}$
Avant 2016, les numéros MasterCard commencent par les numéros 51 à 55, mais cela ne détectera que les cartes de crédit MasterCard ; il existe d'autres cartes émises à l'aide du système MasterCard qui ne tombent pas dans cette plage IIN. En 2016, ils ajouteront des nombres dans la plage (222100-272099).American Express:
^3[47][0-9]{5,}$
les numéros de carte American Express commencent par 34 ou 37.Diners Club:
^3(?:0[0-5]|[68][0-9])[0-9]{4,}$
les numéros de carte Diners Club commencent par 300 à 305, 36 ou 38. Il existe des cartes Diners Club qui commencent par 5 et ont 16 chiffres. Il s'agit d'une joint-venture entre Diners Club et MasterCard et doit être traitée comme une MasterCard.Découvrir:
^6(?:011|5[0-9]{2})[0-9]{3,}$
les numéros de carte Découvrir commencent par 6011 ou 65.JCB: les
^(?:2131|1800|35[0-9]{3})[0-9]{3,}$
cartes JCB commencent par 2131, 1800 ou 35.Malheureusement, il existe un certain nombre de types de cartes traitées avec le système MasterCard qui ne vivent pas dans la plage IIN de MasterCard (nombres commençant de 51 à 55); le cas le plus important est celui des cartes Maestro, dont beaucoup ont été émises à partir des plages IIN d'autres banques et sont donc situées partout dans l'espace numérique. En conséquence, il peut être préférable de supposer que toute carte qui n'est pas d'un autre type que vous acceptez doit être une MasterCard .
Important : la longueur des numéros de carte varie; par exemple, Visa a par le passé émis des cartes avec des PAN à 13 chiffres et des cartes avec des PAN à 16 chiffres. La documentation de Visa indique actuellement qu'elle peut émettre ou peut avoir émis des numéros comprenant entre 12 et 19 chiffres. Par conséquent, vous ne devez pas vérifier la longueur du numéro de carte, sauf pour vérifier qu'il a au moins 7 chiffres (pour un IIN complet plus un chiffre de contrôle, qui doit correspondre à la valeur prédite par l'algorithme de Luhn ).
Un autre conseil: avant de traiter un PAN de titulaire de carte, supprimez les espaces et les caractères de ponctuation de l'entrée . Pourquoi? Parce qu'il est généralement beaucoup plus facile de saisir les chiffres en groupes, de la même façon qu'ils sont affichés au recto d'une véritable carte de crédit, c'est-à-dire
est beaucoup plus facile à saisir correctement que
Il n'y a vraiment aucun avantage à châtier l'utilisateur car il a entré des caractères auxquels vous ne vous attendez pas ici.
Cela implique également de s'assurer que vos champs de saisie ont de la place pour au moins 24 caractères, sinon les utilisateurs qui entreront des espaces manqueront de place. Je vous recommande de rendre le champ suffisamment large pour afficher 32 caractères et autoriser jusqu'à 64; cela donne beaucoup de marge pour l'expansion.
Voici une image qui donne un peu plus d'informations:
MISE À JOUR (2014): La méthode de la somme de contrôle ne semble plus être un moyen valide de vérifier l'authenticité d'une carte, comme indiqué dans les commentaires sur cette réponse.
MISE À JOUR (2016): Mastercard va implémenter de nouvelles gammes BIN à partir d' Ach Payment .
la source
En javascript:
Test de l'unité:
la source
Mise à jour: 15 juin 2016 (comme solution ultime actuellement)
Veuillez noter que j'abandonne même le vote pour celui qui est le mieux voté, mais pour être clair, ce sont les regexps qui fonctionnent, je l'ai testé avec des milliers de vrais codes BIN. Le plus important est d'utiliser des chaînes de début (^) sinon cela donnera de faux résultats dans le monde réel!
JCB
^(?:2131|1800|35)[0-9]{0,}$
Commence par: 2131, 1800, 35 (3528-3589)American Express
^3[47][0-9]{0,}$
Commencez avec: 34, 37Diners Club
^3(?:0[0-59]{1}|[689])[0-9]{0,}$
Commencez par: 300-305, 309, 36, 38-39Visa
^4[0-9]{0,}$
Commence par: 4MasterCard
^(5[1-5]|222[1-9]|22[3-9]|2[3-6]|27[01]|2720)[0-9]{0,}$
Commencez par: 2221-2720, 51-55Maestro
^(5[06789]|6)[0-9]{0,}$
Maestro grandit toujours dans la gamme: 60-69 , a commencé avec / pas autre chose, mais le début de 5 doit quand même être encodé en mastercard. Les cartes Maestro doivent être détectées à la fin du code car certaines autres ont entre 60 et 69. Veuillez regarder le code.Découvrir
^(6011|65|64[4-9]|62212[6-9]|6221[3-9]|622[2-8]|6229[01]|62292[0-5])[0-9]{0,}$
Découvrez assez difficile à coder, commencez par: 6011, 622126-622925, 644-649, 65En javascript j'utilise cette fonction. C'est bien quand vous l'attribuez à un événement onkeyup et cela donne un résultat dès que possible.
Ici, vous pouvez jouer avec:
http://jsfiddle.net/upN3L/69/
Pour PHP, utilisez cette fonction, cela détecte également certaines sous-cartes VISA / MC:
la source
Voici la fonction pour vérifier le type de carte de crédit à l'aide de Regex, c #
la source
Regarde ça:
http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256CC70060A01B
la source
récemment, j'avais besoin d'une telle fonctionnalité, je portais le validateur de carte de crédit Zend Framework sur 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 des plages INN pour détecter le type. Ici vous pouvez lire sur INN
Selon cela, vous pouvez également détecter la carte de crédit (sans regexps, mais en déclarant certaines règles sur les préfixes et la longueur possible)
Nous avons donc les prochaines règles pour les cartes les plus utilisées
Ensuite, en recherchant le préfixe et en comparant la longueur, vous pouvez détecter la marque de carte de crédit. N'oubliez pas non plus de Luhn Algoritm (il est décrit ici http://en.wikipedia.org/wiki/Luhn ).
MISE À JOUR
la liste mise à jour des règles peut être trouvée ici https://raw.githubusercontent.com/Fivell/credit_card_validations/master/lib/data/brands.yaml
la source
Voici le code C # ou VB complet pour toutes sortes de choses liées à CC sur codeproject.
Cet article est disponible depuis quelques années sans commentaires négatifs.
la source
Version javascript compacte
la source
Réponse d'Anatoliy en PHP:
la source
Voici une fonction de classe php qui renvoie CCtype par CCnumber.
Ce code ne valide pas la carte ou n'exécute pas l'algorithme de Luhn, essayez uniquement de trouver le type de carte de crédit en fonction du tableau de cette page . utilise fondamentalement la longueur CCnumber et le préfixe CCcard pour déterminer le type de carte CC.
la source
N'essayez pas de détecter le type de carte de crédit dans le cadre du traitement d'un paiement. Vous risquez de refuser des transactions valides.
Si vous devez fournir des informations à votre processeur de paiement (par exemple, l'objet de carte de crédit PayPal nécessite de nommer le type de carte ), alors devinez-le à partir du moins d'informations disponibles, par exemple
Cette implémentation (en utilisant uniquement les deux premiers chiffres) est suffisante pour identifier tous les principaux schémas de cartes (et dans le cas de PayPal tous les) pris en charge. En fait, vous voudrez peut-être ignorer complètement l'exception et choisir par défaut le type de carte le plus populaire. Laissez la passerelle / le processeur de paiement vous dire s'il y a une erreur de validation en réponse à votre demande.
La réalité est que votre passerelle de paiement ne se soucie pas de la valeur que vous fournissez .
la source
Les premiers chiffres de la carte de crédit peuvent être utilisés pour rapprocher le vendeur:
la source
Dans Card Range Recognition (CRR), un inconvénient des algorithmes qui utilisent une série d'expressions régulières ou d'autres plages codées en dur, est que les BIN / IIN changent au fil du temps selon mon expérience. Le co-marquage des cartes est une complication permanente. Différents acquéreurs / marchands de cartes peuvent avoir besoin que vous traitiez la même carte différemment, en fonction, par exemple, de la géolocalisation.
De plus, au cours des dernières années, avec par exemple des cartes UnionPay en circulation plus large, les modèles existants ne font pas face à de nouvelles gammes qui s'entrelacent parfois avec des gammes plus larges qu'elles remplacent.
La connaissance de la géographie que votre système doit couvrir peut être utile, car certaines plages sont limitées à l'utilisation dans certains pays. Par exemple, les gammes 62 incluent certaines sous-gammes AAA aux États-Unis, mais si votre base de marchands est en dehors des États-Unis, vous pourrez peut-être traiter tous les 62 comme UnionPay.
Vous pouvez également être invité à traiter une carte différemment en fonction de l'emplacement du commerçant. Par exemple, pour traiter certaines cartes britanniques comme un débit national, mais comme un crédit international.
Il existe un ensemble très utile de règles maintenues par une grande banque acquéreuse. Par exemple, https://www.barclaycard.co.uk/business/files/BIN-Rules-EIRE.pdf et https://www.barclaycard.co.uk/business/files/BIN-Rules-UK.pdf . (Liens valides à partir de juin 2017, grâce à l'utilisateur qui a fourni un lien vers une référence mise à jour.) Mais sachez que si ces règles CRR peuvent représenter l'univers d'émission de cartes tel qu'il s'applique aux marchands acquis par cette entité, il n'inclut pas par exemple les plages identifiées comme CUP / UPI.
Ces commentaires s'appliquent aux scénarios de bande magnétique (MagStripe) ou PKE (Pan Key Entry). La situation est à nouveau différente dans le monde ICC / EMV.
Mise à jour: Les autres réponses sur cette page (et aussi la page WikiPedia liée) ont JCB comme toujours 16 longues. Cependant, dans mon entreprise, nous avons une équipe dédiée d'ingénieurs qui certifient nos dispositifs de point de vente et nos logiciels dans plusieurs banques et zones géographiques d'acquisition. Le plus récent pack de cartes de certification que JCB a reçu de cette équipe avait un étui pour un PAN de 19 longs.
la source
Version Swift 2.1 de la réponse d'Usman Y. Utilisez une instruction print pour vérifier, appelez par une valeur de chaîne
la source
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.
Incluez-le d'abord sur votre page Web
Deuxièmement, utilisez la fonction cardType pour détecter le schéma de carte.
Voici les liens de référence pour plus d'exemples et de démos.
la source
Dans swift, vous pouvez créer une énumération pour détecter le type de carte de crédit.
Appelez la méthode CreditCardType.cardTypeForCreditCardNumber ("# numéro de carte") qui renvoie la valeur énumérée CreditCardType.
la source
Ma solution avec jQuery:
Si 0 est retourné, le type de carte de crédit n'est pas détecté.
La classe "carte de crédit" doit être ajoutée au champ de saisie de la carte de crédit.
la source
J'ai cherché un peu le formatage des cartes de crédit et le formatage des numéros de téléphone. J'ai trouvé plein de bons conseils, mais rien ne convenait vraiment à mes désirs, j'ai donc créé ce bout de code . Vous l'utilisez comme ceci:
la source
la source
Juste une petite cuillère à nourrir:
la source
Voici un exemple de certaines fonctions booléennes écrites en Python qui retournent
True
si la carte est détectée selon le nom de la fonction.la source
Sur la base des faits ci-dessus, je voudrais conserver un extrait de code JAVA pour identifier la marque de la carte.
Référence
la source
Essayez ceci pour kotlin. Ajoutez Regex et ajoutez à l'instruction when.
la source
Les règles d'expression régulière qui correspondent aux fournisseurs de cartes respectifs :
(4\d{12}(?:\d{3})?)
pour VISA.(5[1-5]\d{14})
pour MasterCard.(3[47]\d{13})
pour AMEX.((?:5020|5038|6304|6579|6761)\d{12}(?:\d\d)?)
pour Maestro.(3(?:0[0-5]|[68][0-9])[0-9]{11})
pour Diners Club.(6(?:011|5[0-9]{2})[0-9]{12})
pour Découvrir.(35[2-8][89]\d\d\d{10})
pour JCB.la source
J'utilise https://github.com/bendrucker/creditcards-types/ pour détecter le type de carte de crédit à partir du numéro. Un problème que j'ai rencontré est de découvrir le numéro de test 6011 1111 1111 1117
à partir de https://www.cybersource.com/developers/other_resources/quick_references/test_cc_numbers/ nous pouvons voir que c'est un numéro de découverte car il commence par 6011. Mais le résultat que j'obtiens des types de cartes de crédit est "Maestro". J'ai ouvert le dossier à l'auteur. Il m'a répondu très rapidement et fournit ce doc pdf https://www.discovernetwork.com/downloads/IPP_VAR_Compliance.pdf D'après le doc, nous pouvons voir clairement que 6011 1111 1111 1117 ne fait pas partie de la gamme des cartes de crédit Discover.
la source
Essayez ceci. Pour rapide.
Utilisation.
la source
la source