Cómo validar un número de tarjeta de crédito por javascript


Para la validación de una tarjeta de crédito, vamos a tomar dos conceptos, el código BIN y la suma de veerificación del algoritmo de Lhun.

El BIN (número de identificación bancaria) se compone por los 6 primeros dígitos de una tarjeta, e identifica al banco que ha emitido el plástico. Los siguientes son los códigos BIN que identifican a cada entidad bancaria:

El algoritmo de Luhn fue desarrollado por Hans Peter Luhn, científico de IBM y es de dominio público utilizado ampliamente en la actualidad. Es una fórmula de suma de verificación, utilizada para validar una diversidad de números de identificación, como números de tarjetas de crédito, números IMEI, etc. Su idea se convirtió en la base de uno de los algoritmos más importantes de nuestra era, la función resumen / hash como la conocemos hoy.​  

A continuación el código javascript que valida que la tarjeta sea emitida por una entidad Bancaria y que el número ingresado sea correcto a través a través del algoritmo de Luhn.

function fValidarTarjeta(){
    var opt = $("#lstTipoTarjeta option:selected").val();
    codigo = $("#nro_tarjeta").val().replace('-', '');
    var msg = "Valor incorrecto";
    VISA = /^4[0-9]{3}-?[0-9]{4}-?[0-9]{4}-?[0-9]{4}$/;
    MASTERCARD = /^5[1-5][0-9]{2}-?[0-9]{4}-?[0-9]{4}-?[0-9]   {4}$/;
    AMEX = /^3[47][0-9-]{16}$/;
    CABAL = /^(6042|6043|6044|6045|6046|5896){4}[0-9]{12}$/;
    NARANJA =   /^(589562|402917|402918|527571|527572|0377798|0377799)[0-9]*$/;

    $("#err_nro_tarjeta").html("");
    if(luhn(codigo)){
        if(opt == "VISA" && !codigo.match(VISA)){
            alert(msg);
        }
        if(opt == "MASTERCARD" && !codigo.match(MASTERCARD)){
            alert(msg);
        }
        if(opt == "NARANJA" && !codigo.match(NARANJA)){
            alert(msg);
        }
        if(opt == "CABAL" && !codigo.match(CABAL)){
            alert(msg);
        }
        if(opt == "AMEX" && !codigo.match(AMEX)){
            alert(msg);
        }
    } else {
        alert(msg);
    }
}
function luhn(value) {
    // Accept only digits, dashes or spaces
    if (/[^0-9-\s]+/.test(value)) return false;
    // The Luhn Algorithm. It's so pretty.
    let nCheck = 0, bEven = false;
    value = value.replace(/\D/g, "");
    for (var n = value.length - 1; n >= 0; n--) {
        var cDigit = value.charAt(n),
        nDigit = parseInt(cDigit, 10);
        if (bEven && (nDigit *= 2) > 9) nDigit -= 9; nCheck +=  nDigit; bEven = !bEven;
    }
    return (nCheck % 10) == 0;
}