Estoy tratando de descubrir cómo detectar el tipo de tarjeta de crédito basándose únicamente en su número. ¿Alguien sabe de una manera definitiva y confiable de encontrar esto?
algorithm
language-agnostic
e-commerce
Andrew Edvalson
fuente
fuente
Respuestas:
El número de tarjeta de crédito / débito se conoce como PAN o Número de cuenta principal . Los primeros seis dígitos del PAN se toman del IIN , o número de identificación del emisor , perteneciente al banco emisor (los IIN se conocían anteriormente como BIN - Números de identificación bancaria - por lo que puede ver referencias a esa terminología en algunos documentos). Estos seis dígitos están sujetos a un estándar internacional, ISO / IEC 7812 , y se pueden usar para determinar el tipo de tarjeta a partir del número.
Desafortunadamente, la base de datos ISO / IEC 7812 actual no está disponible públicamente, sin embargo, hay listas no oficiales, tanto comerciales como gratuitas, incluso en Wikipedia .
De todos modos, para detectar el tipo del número, puede usar una expresión regular como las siguientes: Crédito por expresiones originales
Visa:
^4[0-9]{6,}$
los números de tarjeta Visa comienzan con 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,}$
antes de 2016, los números de MasterCard comienzan con los números 51 a 55, pero esto solo detectará las tarjetas de crédito MasterCard ; Hay otras tarjetas emitidas con el sistema MasterCard que no entran en este rango IIN. En 2016, agregarán números en el rango (222100-272099).American Express:
^3[47][0-9]{5,}$
los números de tarjeta American Express comienzan con 34 o 37.Diners Club:
^3(?:0[0-5]|[68][0-9])[0-9]{4,}$
los números de tarjeta Diners Club comienzan con 300 a 305, 36 o 38. Hay tarjetas Diners Club que comienzan con 5 y tienen 16 dígitos. Se trata de una empresa conjunta entre Diners Club y MasterCard y debe procesarse como una MasterCard.Discover:
^6(?:011|5[0-9]{2})[0-9]{3,}$
los números de tarjetas Discover comienzan con 6011 o 65.JCB: las
^(?:2131|1800|35[0-9]{3})[0-9]{3,}$
tarjetas JCB comienzan con 2131, 1800 o 35.Desafortunadamente, hay varios tipos de tarjetas procesadas con el sistema MasterCard que no viven en el rango IIN de MasterCard (números que comienzan 51 ... 55); El caso más importante es el de las tarjetas Maestro, muchas de las cuales han sido emitidas desde los rangos IIN de otros bancos y, por lo tanto, se encuentran en todo el espacio numérico. Como resultado, puede ser mejor suponer que cualquier tarjeta que no sea de otro tipo que acepte debe ser una MasterCard .
Importante : los números de tarjeta varían en longitud; por ejemplo, Visa emitió en el pasado tarjetas con PAN de 13 dígitos y tarjetas con PAN de 16 dígitos. La documentación de Visa actualmente indica que puede emitir o puede haber emitido números con entre 12 y 19 dígitos. Por lo tanto, no debe verificar la longitud del número de tarjeta, excepto para verificar que tenga al menos 7 dígitos (para un IIN completo más un dígito de verificación, que debe coincidir con el valor predicho por el algoritmo de Luhn ).
Una pista más: antes de procesar un PAN del titular de la tarjeta, elimine cualquier espacio en blanco y caracteres de puntuación de la entrada . ¿Por qué? Debido a que generalmente es mucho más fácil ingresar los dígitos en grupos, de forma similar a cómo se muestran en el frente de una tarjeta de crédito real, es decir
es mucho más fácil ingresar correctamente que
Realmente no hay ningún beneficio en castigar al usuario porque ha ingresado caracteres que no espera aquí.
Esto también implica asegurarse de que los campos de entrada tengan espacio para al menos 24 caracteres; de lo contrario, los usuarios que ingresen espacios se quedarán sin espacio. Recomiendo que amplíe el campo lo suficiente como para mostrar 32 caracteres y permita hasta 64; eso le da mucho espacio para la expansión.
Aquí hay una imagen que da un poco más de información:
ACTUALIZACIÓN (2014): el método de suma de verificación ya no parece ser una forma válida de verificar la autenticidad de una tarjeta como se señala en los comentarios sobre esta respuesta.
ACTUALIZACIÓN (2016): Mastercard implementará nuevos rangos BIN a partir de Ach Payment .
fuente
En javascript:
Prueba de unidad:
fuente
Actualizado: 15 de junio de 2016 (como una solución definitiva actualmente)
Tenga en cuenta que incluso doy mi voto para que el que está más votado, pero para dejar en claro que estos son los regexps que realmente funcionan, lo probé con miles de códigos BIN reales. ¡Lo más importante es usar cadenas de inicio (^) de lo contrario, dará resultados falsos en el mundo real!
JCB
^(?:2131|1800|35)[0-9]{0,}$
Comience con: 2131, 1800, 35 (3528-3589)American Express
^3[47][0-9]{0,}$
Comience con: 34, 37Diners Club
^3(?:0[0-59]{1}|[689])[0-9]{0,}$
Comience con: 300-305, 309, 36, 38-39Visa
^4[0-9]{0,}$
comienza con: 4MasterCard
^(5[1-5]|222[1-9]|22[3-9]|2[3-6]|27[01]|2720)[0-9]{0,}$
Comience con: 2221-2720, 51-55Maestro
^(5[06789]|6)[0-9]{0,}$
Maestro siempre crece en el rango: 60-69 , comenzó con / no con otra cosa, pero el inicio 5 debe codificarse como tarjeta maestra de todos modos. Las tarjetas Maestro deben detectarse al final del código porque algunas otras tienen un rango de 60-69. Por favor mira el código.Descubrir
^(6011|65|64[4-9]|62212[6-9]|6221[3-9]|622[2-8]|6229[01]|62292[0-5])[0-9]{0,}$
Descubre bastante difícil de codificar, comience con: 6011, 622126-622925, 644-649, 65En javascript utilizo esta función. Esto es bueno cuando lo asigna a un evento onkeyup y da resultado tan pronto como sea posible.
Aquí puedes jugar con él:
http://jsfiddle.net/upN3L/69/
Para PHP, use esta función, esto también detecta algunas tarjetas sub VISA / MC:
fuente
Aquí está la función para verificar el tipo de tarjeta de crédito usando Regex, c #
fuente
Mira esto:
http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256CC70060A01B
fuente
Hace poco necesitaba esa funcionalidad, estaba transfiriendo el Validador de tarjetas de crédito de Zend Framework a Ruby. gema de rubí: https://github.com/Fivell/credit_card_validations zend framework: https://github.com/zendframework/zf2/blob/master/library/Zend/Validator/CreditCard.php
Ambos usan rangos INN para detectar el tipo. Aquí puedes leer sobre INN
De acuerdo con esto, puede detectar la tarjeta de crédito alternativamente (sin expresiones regulares, pero declarando algunas reglas sobre prefijos y posible longitud)
Entonces tenemos las siguientes reglas para la mayoría de las tarjetas usadas
Luego, al buscar el prefijo y comparar la longitud, puede detectar la marca de la tarjeta de crédito. Tampoco te olvides del algoritmo de Luhn (se describe aquí http://en.wikipedia.org/wiki/Luhn ).
ACTUALIZAR
La lista actualizada de reglas se puede encontrar aquí https://raw.githubusercontent.com/Fivell/credit_card_validations/master/lib/data/brands.yaml
fuente
Aquí está el código completo C # o VB para todo tipo de cosas relacionadas con CC en codeproject.
Este artículo ha estado publicado durante un par de años sin comentarios negativos.
fuente
Versión javascript compacta
fuente
La respuesta de Anatoliy en PHP:
fuente
Aquí hay una función de clase php que devuelve CCtype por CCnumber.
Este código no valida la tarjeta o no ejecuta el algoritmo de Luhn, solo trata de encontrar el tipo de tarjeta de crédito según la tabla de esta página . utiliza básicamente la longitud de CCnumber y el prefijo de CCcard para determinar el tipo de CCcard.
fuente
No intente detectar el tipo de tarjeta de crédito como parte del procesamiento de un pago. Corre el riesgo de rechazar transacciones válidas.
Si necesita proporcionar información a su procesador de pagos (p. Ej., El objeto de la tarjeta de crédito de PayPal requiere nombrar el tipo de tarjeta ), adivine con la menor información disponible, p. Ej.
Esta implementación (usando solo los primeros dos dígitos) es suficiente para identificar todos los esquemas de tarjetas principales (y en el caso de PayPal, todos los compatibles). De hecho, es posible que desee omitir la excepción por completo y usar el tipo de tarjeta más popular. Deje que la pasarela de pago / procesador le diga si hay un error de validación en respuesta a su solicitud.
La realidad es que su pasarela de pago no se preocupa por el valor que proporciona .
fuente
Los primeros números de la tarjeta de crédito pueden usarse para aproximarse al vendedor:
fuente
En el reconocimiento de rango de tarjeta (CRR), un inconveniente con los algoritmos que utilizan una serie de expresiones regulares u otros rangos codificados, es que los BIN / IIN cambian con el tiempo en mi experiencia. La marca compartida de tarjetas es una complicación continua. Los diferentes adquirentes / comerciantes de tarjetas pueden necesitar que trate la misma tarjeta de manera diferente, dependiendo, por ejemplo, de la geolocalización.
Además, en los últimos años, por ejemplo, con tarjetas UnionPay en circulación más amplia, los modelos existentes no hacen frente a nuevos rangos que a veces se entrelazan con rangos más amplios que reemplazan.
Puede ser útil conocer la geografía que necesita cubrir su sistema, ya que algunos rangos están restringidos para su uso en determinados países. Por ejemplo, los rangos 62 incluyen algunos subrangos AAA en los EE. UU., Pero si su base comercial está fuera de los EE. UU., Puede tratar a los 62 como UnionPay.
También se le puede pedir que trate una tarjeta de manera diferente según la ubicación del comerciante. Por ejemplo, para tratar ciertas tarjetas del Reino Unido como débito a nivel nacional, pero como crédito internacional.
Hay un conjunto muy útil de reglas mantenidas por un banco adquirente importante. Por ejemplo, https://www.barclaycard.co.uk/business/files/BIN-Rules-EIRE.pdf y https://www.barclaycard.co.uk/business/files/BIN-Rules-UK.pdf . (Vínculos válidos a partir de junio de 2017, gracias al usuario que proporcionó un vínculo a la referencia actualizada). Pero tenga en cuenta la advertencia de que, si bien estas reglas de CRR pueden representar el universo de Emisión de tarjetas tal como se aplica a los comerciantes adquiridos por esa entidad, no incluye, por ejemplo, rangos identificados como CUP / UPI.
Estos comentarios se aplican a escenarios de banda magnética (MagStripe) o PKE (Entrada de clave de desplazamiento). La situación es diferente nuevamente en el mundo de ICC / EMV.
Actualización: Otras respuestas en esta página (y también la página de WikiPedia vinculada) tienen JCB como siempre 16 de largo. Sin embargo, en mi empresa tenemos un equipo dedicado de ingenieros que certifican nuestros dispositivos y software POS en múltiples bancos y geografías adquirientes. El paquete de tarjetas de certificación más reciente que este equipo tiene de JCB, tenía un caso de pase para un PAN de 19 largos.
fuente
Versión Swift 2.1 de la respuesta de Usman Y. Use una declaración de impresión para verificar, así que llame por algún valor de cadena
fuente
Stripe ha proporcionado esta fantástica biblioteca de JavaScript para la detección de esquemas de tarjetas. Permítame agregar algunos fragmentos de código y mostrarle cómo usarlo.
En primer lugar inclúyalo a su página web como
En segundo lugar, use la función cardType para detectar el esquema de la tarjeta.
Aquí están los enlaces de referencia para más ejemplos y demostraciones.
fuente
En Swift puede crear una enumeración para detectar el tipo de tarjeta de crédito.
Llame al método CreditCardType.cardTypeForCreditCardNumber ("# número de tarjeta") que devuelve el valor de enumeración CreditCardType.
fuente
Mi solución con jQuery:
En caso de que se devuelva 0, el tipo de tarjeta de crédito no se detecta.
La clase "tarjeta de crédito" debe agregarse al campo de entrada de la tarjeta de crédito.
fuente
Busqué bastante por el formato de la tarjeta de crédito y el formato del número de teléfono. Encontré muchos buenos consejos, pero nada realmente se ajustaba a mis deseos exactos, así que creé este bit de código . Lo usas así:
fuente
fuente
Solo una cucharadita de alimentación:
fuente
Aquí hay un ejemplo de algunas funciones booleanas escritas en Python que regresan
True
si la tarjeta se detecta según el nombre de la función.fuente
En base a los hechos anteriores, me gustaría mantener un fragmento de código JAVA para identificar la marca de la tarjeta.
Referencia
fuente
Prueba esto para kotlin. Agregue Regex y agregue a la instrucción when.
fuente
Las reglas de expresión regular que coinciden con los proveedores de tarjetas respectivos :
(4\d{12}(?:\d{3})?)
para la visa.(5[1-5]\d{14})
para MasterCard.(3[47]\d{13})
para AMEX((?:5020|5038|6304|6579|6761)\d{12}(?:\d\d)?)
para maestro.(3(?:0[0-5]|[68][0-9])[0-9]{11})
para Diners Club.(6(?:011|5[0-9]{2})[0-9]{12})
para descubrir.(35[2-8][89]\d\d\d{10})
para JCBfuente
Utilizo https://github.com/bendrucker/creditcards-types/ para detectar el tipo de tarjeta de crédito del número. Un problema que encontré es descubrir el número de prueba 6011 1111 1111 1117
de https://www.cybersource.com/developers/other_resources/quick_references/test_cc_numbers/ podemos ver que es un número de descubrimiento porque comienza en 6011. Pero el resultado que obtengo de los tipos de tarjetas de crédito es "Maestro". Abrí el tema al autor. Él me respondió muy pronto y proporcionó este documento en pdf https://www.discovernetwork.com/downloads/IPP_VAR_Compliance.pdf. Desde el documento podemos ver claramente que 6011 1111 1111 1117 no se encuentra dentro del rango de descubrir tarjetas de crédito.
fuente
Intenta esto. Para rápido.
Utilizar.
fuente
fuente