e-commerce - pasarelas - plataformas de pago online
Determine el tipo de tarjeta de crédito por número? (14)
Aquí está el código completo de C # o VB para todo tipo de cosas relacionadas con CC en codeproject.
- IsValidNumber
- GetCardTypeFromNumber
- GetCardTestNumber
- PasesLuhnTest
Este artículo ha estado en pie durante un par de años sin comentarios negativos.
¿Se puede determinar el tipo de tarjeta de crédito únicamente a partir del número de tarjeta de crédito?
¿Se recomienda esto o siempre le pide al cliente el tipo de tarjeta de crédito que está usando?
Busqué en Google y encontré este algoritmo: http://cuinl.tripod.com/Tips/o-1.htm , ¿esto es confiable?
Gracias
Aquí hay una manera rápida y sucia de determinar el tipo de tarjeta automáticamente y mostrarla al usuario mientras están escribiendo.
Eso significa que a) el usuario no tiene que elegirlo yb) no perderán el tiempo buscando un menú desplegable que no exista.
Versión jQuery muy simple para Amex, Visa y Mastercard. si necesita otros tipos de tarjetas, puede tomar el
$(''[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");
});
Este es el jQuery para acompañar esto (ASP.NET MVC):
Card number: <%= Html.TextBox("PaymentDetails.CreditCardDetails.CreditCardNumber")%>
Card Type: <span id="ccCardType" class="unknown">Enter card number above</span>
Tengo una regla de css para .unknown
muestre el texto en gris.
Como consumidor, odio elegir una tarjeta primero. Quiero comenzar a escribir el número.
Este tema se trata en el Diseño de formularios web de Wroblewski en las páginas 153-154. Está en la sección "Eliminar preguntas" del capítulo "Entradas innecesarias". El ejemplo que se da es Paypal, que resalta el tipo de tarjeta cuando ingresaste tu número.
El código que ha vinculado tiene una lista BIN / rango incompleta para Discover, omite el club Diner (que ahora pertenece a Discover), enumera los tipos de tarjeta que ya no existen y debe doblarse en otros tipos (enRoute, Carte Blanche) e ignora el cada vez más importante tipo de carro Maestro Internacional.
Como @Alex confirmó, es posible determinar el tipo de tarjeta a partir del número BIN, y numerosas empresas lo hacen, pero hacerlo de manera consistente y correcta no es trivial: las marcas de tarjetas cambian constantemente, y hacer un seguimiento de las cosas se vuelve más complicado a medida que intentas manejar tarjetas de débito regionales (Laser en Irlanda, Maestro en Europa, etc.) - No he encontrado una pieza de código o algoritmo libre y mantenido (correcto) para esto en ninguna parte.
Mientras @MitMaro se acercaba, Wikipedia , y también una lista más específica de números y rangos BIN , lo cual es un buen comienzo, y como comentó gbjbaanb, barclaycard.co.uk/business/documents/pdfs/bin_rules.pdf (pero no parece incluir Discover por alguna razón, presumiblemente, no se procesan en la red Discover?)
Por trivial que parezca, un algoritmo / método / función correcto de identificación de la tarjeta requiere trabajo para mantenerse, así que a menos que su rutina de detección no sea crítica / informativa (por ejemplo, la sugerencia de @ Simon_Weaver), O va a poner el trabajo en manténgalo actualizado, le recomendaría que omita la detección automática.
Esta es la versión php del mismo algoritmo mencionado en la primera publicación
<?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;
}
?>
Esta implementación en Python debería funcionar para 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
Estoy bastante seguro de que al menos para MasterCard, Visa, Discover y American Express es exacto. Nunca he trabajado con ninguno de los otros.
Consulte la parte inferior de esta página: http://www.merchantplus.com/resources/pages/credit-card-logos-and-test-numbers/
También esto podría serle útil " http://www.beachnet.com/~hstiles/cardtype.html
Esto es muy interesante para: http://en.wikipedia.org/wiki/Bank_card_number
He escuchado una buena razón para hacer que escojan (a pesar de que puedes averiguarlo). Para que sepan la lista de tarjetas de crédito que acepta.
Personalmente, no tengo ningún problema para elegir primero el tipo de tarjeta. Pero hay dos aspectos de la entrada del número de tarjeta de crédito que son problemáticos desde mi punto de vista.
Lo peor es la inhabilidad de ingresar espacios entre grupos de números. Incluir los espacios impresos en las tarjetas físicas haría que los dígitos fueran mucho más fáciles de escanear para que el usuario verificara que ingresó la información correctamente. Cada vez que encuentro esta omnipresente deficiencia siento que estoy siendo impulsado hacia atrás en una edad de piedra cuando la entrada del usuario no se pudo filtrar para eliminar los caracteres innecesarios.
El segundo es la necesidad al hacer un pedido por teléfono para escuchar al vendedor repetir el número de tarjeta. Todo lo que el destinatario de la tarjeta de crédito realmente necesita es una UI que les dé acceso al esquema de dígitos de verificación que verifica que un número de cc es válido. Según ese algoritmo, los primeros 15 dígitos (o cuántos) calculan el último dígito, y es prácticamente imposible "engañar". Para que un número gordo toque "pasar" requiere al menos dos errores mutuamente canceladores entre los 15 dígitos. A menos que el algoritmo sufra el defecto de ser engañado desproporcionadamente transponiendo números adyacentes (un error de entrada común) que dudo, excepto que es más confiable que cualquier doble verificación humana.
Sí, el sitio que mencionaste es correcto. Muchos sitios, incl. Google Checkout, creo, confía en la detección automática del tipo de tarjeta. Es conveniente, hace que la IU esté menos saturada (una caja de entrada menos) y ahorra tiempo. ¡Adelante!
Si todas las tarjetas de crédito que acepta tienen las mismas propiedades, simplemente deje que el usuario ingrese el número de tarjeta y otras propiedades (fecha de vencimiento, CVV, etc.). Sin embargo, algunos tipos de tarjetas requieren la introducción de diferentes campos (por ejemplo, fecha de inicio o número de expedición para las tarjetas Maestro del Reino Unido). En esos casos, debe tener todos los campos, lo que confunde al usuario, o algo de Javascript para ocultar / mostrar los campos relevantes, lo que hace que la experiencia del usuario sea un poco extraña (los campos desaparecen, al ingresar el número de la tarjeta de crédito) . En esos casos, recomiendo primero preguntar por el tipo de tarjeta.
Stripe ha proporcionado esta fantástica biblioteca de JavaScript para la detección de esquemas de tarjetas. Permítanme agregar algunos fragmentos de código y mostrarles cómo usarlo.
Primero, inclúyelo en tu página web como
<script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/jquery.payment/1.2.3/jquery.payment.js " ></script>
En segundo lugar, use la función cardType para detectar el esquema de la tarjeta.
$(document).ready(function() {
var type = $.payment.cardType("4242 4242 4242 4242"); //test card number
console.log(type);
});
Aquí están los enlaces de referencia para más ejemplos y demos.
aquí está el script que uso que funciona con los rangos de tarjeta actuales. también hace una verificación de validez en el número.
/**
* 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;
}
Wikipedia contiene una lista de la mayoría de los prefijos de tarjetas. Algunas cartas faltan en el enlace que publicaste. También parece que el enlace que proporcionó es válido.
Una razón para solicitar el tipo de tarjeta es para obtener una validación adicional, comparar lo que el usuario proporcionó con el número.