Validar tarjetas de crédito con Javascript

Hace unos días investigando para desarrollar un módulo de reservas para un hotel me cayó la duda si era necesario almacenar los datos de la tarjeta de crédito y si había que validarla contra alguna entidad para corroborar que la tarjeta es válida antes de dar por hecha la reserva.
Para mi sorpresa en la mayoría de los sitios de booking que probé solamente hacen un simple chequeo para comprobar que el número de la tarjeta cumple ciertas características.
Para conocer esto el algoritmo es bien sencillo. Tomamos los dígitos en las posiciones impares y multiplicamos cada uno por dos, si algún resultado tuviera dos cifras, se suman las dos cifras del resultado. Los números obtenidos se suman entre sí junto con los números que ocupan las posiciones pares. Si el resultado es un múltiplo de 10 el número de tarjeta es válido. Por supuesto este método no asegura que el número exista, solamente que es coherente.

Aquí va el código en javascript:

function validarTarjeta(campo) {
  //Limpiamos el número de tarjeta  de posibles espacios en blanco...
  var expReg = /W/gi;
  var numero = campo.value.replace(expReg, "");

  //Chequeamos que el numero entrado tenga formato numérico...
  if (isNaN(numero)) {
    alert("El número de la tarjeta de crédito no tiene formato numérico.");
    campo.focus();
    return false;
  }

  //Chequeamos que el numero tenga 16 o 18 dígitos...
  if ((numero.length!=16) && (numero.length!=18)) {
     alert("El número de dígitos en la tarjeta de crédito es incorrecto.");
     campo.focus();
     return false;
  }

  var suma = 0;
  for (i = numero.length; i > 0; i--) {

    //Si la posición es impar
    if (i % 2 == 1) {
      var doble = "" + (parseInt(numero.substring(i - 1, i)) * 2);

      //Si el doble tiene más dos cifras (o sea es mayor que 9)
      if (doble.length == 2) {
         doble = parseInt(doble.substring(0,1)) + parseInt(doble.substring(1,2));
      }
      suma += parseInt(doble);
    }
    //Si la posición es par
    else {
      suma += parseInt(numero.substring(i - 1, i));
    }
  }

  //Si la suma total no es divisible por 10 entonces el número no es válido
  if (suma % 10 != 0) {
    alert("El número de la tarjeta de crédito no es válido.");
    campo.focus();
    return false;
  }

  //En cualquier otro caso el número es válido
  return true;
}

Increíble! conociendo esto me pude hacer reservas con datos falsos y números de tarjetas falsos que cumplen las características anteriores como este 1111222233334444, por supuesto esto fue solo para probar el concepto y enseguida las cancelé, de todas formas los hoteles suelen hacerle un cargo a las tarjetas para comprobar que realmente existen.

7 comentarios en “Validar tarjetas de crédito con Javascript”

  1. jgarcía PR: 6dijo:

    ¡¡Genial Alfredo!!
    Gracias por compartirlo…

  2. Edu® PR: 5dijo:

    Muy bueno Alfredo! Seguro que es muy interesante para mucha gente.

    Bienvenido al Core ;)

    ********************************
    Eduardo Luque Portero
    Microsoft Certified Professional
    edu@bitacoradewebmaster.com
    http://www.bdw.es
    ********************************

  3. eMe PR: 5dijo:

    Crack!!!!!!

  4. svt PR: 0dijo:

    crack total!

  5. neodemo PR: 0dijo:

    Hola tengo una duda al respecto, de lo que ha publicado, quisiera saber qeu es lo que hay que poner en el javascript tngo que poner lo que esta en español o en ingles, soy un novato, y es interesanto eso que ha publicado, espero pronta respuesta, gracuas

  6. aartiles PR: 0dijo:

    Hola neodemo, tienes que poner la funcion “validarTarjeta” tal y como está declarada en el post. El parámetro campo es la referencia campo de texto del formulario.
    Aqui te pongo más o menos como quedaría el HTML, sinceramente no lo he comprobado, así que ruego me disculpes si tiene algún error de sintaxtis.

    Tarjeta:

  7. petalo PR: 0dijo:

    es genial!! es genial!! me ha salido !!es fantastico!!
    por favor el que entienda de estos temas pongase en contacto conmigo nenufar_blanco@hotmail.com me llamo caro

Deja tu comentario

XHTML: Puedes usar las etiquetas: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>