Validador de tarjetas bancarias: comprueba el número con el algoritmo de Luhn

Escribe o pega el número de una tarjeta de crédito o débito y este validador de tarjetas comprueba su dígito verificador con el algoritmo de Luhn, te dice de qué red es (Visa, Mastercard, American Express…) y separa el BIN, las cifras que identifican al banco. Sirve para descubrir una cifra mal copiada antes de pagar o para probar un formulario de pago. Todo se calcula en tu navegador: el número no se envía a ningún sitio.

Un número válido no significa que la tarjeta exista, esté activa o tenga fondos. El dígito verificador solo detecta errores al escribirlo. Nunca compartas el número completo junto con la fecha de vencimiento y el código de seguridad (CVV): con esos tres datos se puede comprar en tu nombre. Este validador no los pide.

Qué comprueba el validador

  • Que solo tenga cifras y entre 12 y 19. Casi todas las tarjetas tienen 16; las de American Express, 15. Puedes escribirlo con espacios o guiones.
  • El dígito verificador, la última cifra. Detecta cualquier cifra mal copiada y casi todos los intercambios de dos cifras seguidas. Si no cuadra, te dice cuál debería ser.
  • La red, por las primeras cifras, y si el número tiene las cifras que usa esa red.
  • El BIN (o IIN, número de identificación del emisor): las primeras cifras, que identifican al banco que emitió la tarjeta. Tradicionalmente eran 6; desde abril de 2022 Visa solo asigna BIN de 8 cifras y Mastercard también los usa, así que conviven los dos. El validador muestra 8 en las tarjetas de 16 cifras o más, y 6 en las demás. El validador no lo busca en ninguna base de datos: así no tiene que enviar nada.

El botón Poner un número de prueba elige uno de los números de prueba que publica Stripe para desarrolladores, como 4242 4242 4242 4242. No son de ninguna persona y sirven para probar formularios de pago en modo de prueba.

Cómo saber la red por las primeras cifras

  • Visa: empieza por 4. Tiene 16 cifras (también 13 o 19).
  • Mastercard: de 51 a 55, o de 2221 a 2720. Tiene 16 cifras.
  • American Express: 34 o 37. Tiene 15 cifras, agrupadas como 4-6-5.
  • Discover: 6011, de 644 a 649, o 65.
  • Diners Club: 30, 36, 38 o 39.
  • JCB: de 3528 a 3589.
  • UnionPay: 62.
  • Maestro: 5018, 5020, 5038, 5893, 6304, 6759 o de 6761 a 6763.
  • Mir: de 2200 a 2204.

Las tarjetas de redes locales, como Carnet en México, o las de tiendas departamentales usan otros prefijos. El validador las comprueba igual con el algoritmo de Luhn, pero no dice el nombre de la red.

Cómo se calcula el dígito verificador

Se usa el algoritmo de Luhn (norma ISO/IEC 7812), el mismo del NSS del IMSS y del IMEI de los teléfonos. Con las cifras anteriores al verificador, empezando por la derecha, se duplica una sí y otra no; si un doble pasa de 9, se le restan 9. Se suma todo, y el verificador es lo que falta para llegar a la siguiente decena.

Con 4242 4242 4242 424, el número de prueba sin su última cifra, los que se duplican son los ocho 4: cada uno da 8, y suman 64. Los siete 2 quedan igual y suman 14. El total es 78, y para llegar a 80 faltan 2: el número completo es 4242 4242 4242 4242.

Validar una tarjeta en Python

def luhn_digito(cuerpo):
    """Dígito de Luhn: desde la derecha, se duplica una cifra sí y otra no, empezando por la última."""
    suma = 0
    for i, c in enumerate(reversed(cuerpo)):
        d = int(c) * (2 if i % 2 == 0 else 1)
        suma += d - 9 if d > 9 else d
    return str((10 - suma % 10) % 10)


REDES = [("American Express", ["34", "37"]), ("Mastercard", [("51", "55"), ("2221", "2720")]),
         ("Visa", ["4"]), ("JCB", [("3528", "3589")]), ("Discover", ["6011", ("644", "649"), "65"])]


def red(numero):
    for nombre, prefijos in REDES:
        for p in prefijos:
            desde, hasta = p if isinstance(p, tuple) else (p, p)
            if desde <= numero[:len(desde)] <= hasta:
                return nombre
    return "otra"


def tarjeta_valida(numero):
    numero = numero.replace(" ", "").replace("-", "")
    return numero.isdigit() and 12 <= len(numero) <= 19 and numero[-1] == luhn_digito(numero[:-1])


for n in ["4242 4242 4242 4242", "4242 4242 4242 4241", "3782 822463 10005", "2223 0031 2200 3222"]:
    print(f"{n:22} {tarjeta_valida(n)!s:5}  {red(n.replace(' ', ''))}")
print(luhn_digito("424242424242424"))   # el último dígito de 4242 4242 4242 4242
$ python3 tarjeta.py4242 4242 4242 4242    True   Visa
4242 4242 4242 4241    False  Visa
3782 822463 10005      True   American Express
2223 0031 2200 3222    True   Mastercard
2

Otros validadores con el mismo algoritmo: IMEI y NSS. Para cuentas bancarias de México, el validador de CLABE. Todas las herramientas, en decodigo.com/herramientas.

Prefijos y longitudes de cada red: Wikipedia, «Payment card number», que resume la norma ISO/IEC 7812. BIN de 8 cifras: ICBA. Números de prueba: documentación de Stripe. El cálculo se comparó con la biblioteca de Python python-stdnum en 20,000 números al azar: coinciden en todos. Las 15 tarjetas de prueba salen con su red correcta.