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
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!
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.
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.
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
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;
}
Voici Complétez le code C # ou VB pour toutes sortes de choses liées à CC sur codeproject.
Cet article est publié depuis quelques années sans commentaires négatifs.
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.
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.
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;
}
?>
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é.
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.
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.
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.
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
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 )