Saltar al contenido

¿Cómo detecta el tipo de tarjeta de crédito según el número?

Te damos la bienvenida a nuestro sitio, en este sitio hallarás la resolución de lo que estás buscando.

Solución:

El número de la tarjeta de crédito / débito se denomina SARTÉN, 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 es posible que vea referencias a esa terminología en algunos documentos). Estos seis dígitos están sujetos a una norma internacional, ISO / IEC 7812, y se pueden utilizar para determinar el tipo de tarjeta a partir del número.

Desafortunadamente, la base de datos ISO / IEC 7812 real 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 a partir 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 las tarjetas Visa comienzan con 4.

Tarjeta 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 del 51 al 55, pero esto solo detectará tarjetas de crédito MasterCard; Hay otras tarjetas emitidas con el sistema MasterCard que no entran en este rango de IIN. En 2016, agregarán números en el rango (222100-272099).

American Express:^3[47][0-9]5,$ Los números de las tarjetas American Express comienzan con 34 o 37.

Diners Club:^3(?:0[0-5]|[68][0-9])[0-9]4,$ Los números de las tarjetas 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 deben procesarse como una MasterCard.

Descubrir:^6(?:011|5[0-9]2)[0-9]3,$ Los números de tarjeta Discover comienzan con 6011 o 65.

JCB:^(?:2131|1800|35[0-9]3)[0-9]3,$ Las tarjetas JCB comienzan con 2131, 1800 o 35.

Desafortunadamente, hay varios tipos de tarjetas procesadas con el sistema MasterCard que no se encuentran en el rango de IIN de MasterCard (números que comienzan con 51 … 55); el caso más importante es el de las tarjetas Maestro, muchas de las cuales han sido emitidas desde rangos de IIN de otros bancos y, por lo tanto, están ubicadas en todo el espacio numérico. Como resultado, Puede ser mejor asumir que cualquier tarjeta que no sea de otro tipo que acepte debe ser MasterCard..

Importante: los números de tarjeta varían en longitud; por ejemplo, Visa ha emitido en el pasado tarjetas con PAN de 13 dígitos y tarjetas con PAN de 16 dígitos. Actualmente, la documentación de Visa indica que puede emitir o puede haber emitido números de entre 12 y 19 dígitos. Por lo tanto, no debe verificar la longitud del número de la tarjeta, excepto para verificar que tenga al menos 7 dígitos. (para un IIN completo más un dígito de control, 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 los espacios en blanco y los caracteres de puntuación de la entrada. ¿Por qué? Porque es típicamente mucho Es más fácil ingresar los dígitos en grupos, similar a cómo se muestran en el frente de una tarjeta de crédito real, es decir

4444 4444 4444 4444

es mucho más fácil ingresar correctamente que

4444444444444444

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 sus campos de entrada tengan espacio para por lo menos 24 caracteres, de lo contrario, los usuarios que ingresen espacios se quedarán sin espacio. Le recomiendo que haga el campo lo suficientemente ancho para mostrar 32 caracteres y permitir hasta 64; eso da mucho margen de maniobra para la expansión.

Aquí hay una imagen que brinda un poco más de información:

ACTUALIZACIÓN (2014): El método de suma de comprobación ya no parece ser una forma válida de verificar la autenticidad de una tarjeta como se señaló en los comentarios sobre esta respuesta.

ACTUALIZACIÓN (2016): Mastercard implementará nuevos rangos de BIN a partir de Ach Payment.

Verificación de tarjeta de crédito

En javascript:

function detectCardType(number) 
    var re = 6759

    for(var key in re) 
        if(re[key].test(number)) 
            return key
        
    

Prueba de unidad:

describe('CreditCard', function() 
    describe('#detectCardType', function() 

        var cards = 
            '8800000000000000': 'UNIONPAY',

            '4026000000000000': 'ELECTRON',
            '4175000000000000': 'ELECTRON',
            '4405000000000000': 'ELECTRON',
            '4508000000000000': 'ELECTRON',
            '4844000000000000': 'ELECTRON',
            '4913000000000000': 'ELECTRON',
            '4917000000000000': 'ELECTRON',

            '5019000000000000': 'DANKORT',

            '5018000000000000': 'MAESTRO',
            '5020000000000000': 'MAESTRO',
            '5038000000000000': 'MAESTRO',
            '5612000000000000': 'MAESTRO',
            '5893000000000000': 'MAESTRO',
            '6304000000000000': 'MAESTRO',
            '6759000000000000': 'MAESTRO',
            '6761000000000000': 'MAESTRO',
            '6762000000000000': 'MAESTRO',
            '6763000000000000': 'MAESTRO',
            '0604000000000000': 'MAESTRO',
            '6390000000000000': 'MAESTRO',

            '3528000000000000': 'JCB',
            '3589000000000000': 'JCB',
            '3529000000000000': 'JCB',

            '6360000000000000': 'INTERPAYMENT',

            '4916338506082832': 'VISA',
            '4556015886206505': 'VISA',
            '4539048040151731': 'VISA',
            '4024007198964305': 'VISA',
            '4716175187624512': 'VISA',

            '5280934283171080': 'MASTERCARD',
            '5456060454627409': 'MASTERCARD',
            '5331113404316994': 'MASTERCARD',
            '5259474113320034': 'MASTERCARD',
            '5442179619690834': 'MASTERCARD',

            '6011894492395579': 'DISCOVER',
            '6011388644154687': 'DISCOVER',
            '6011880085013612': 'DISCOVER',
            '6011652795433988': 'DISCOVER',
            '6011375973328347': 'DISCOVER',

            '345936346788903': 'AMEX',
            '377669501013152': 'AMEX',
            '373083634595479': 'AMEX',
            '370710819865268': 'AMEX',
            '371095063560404': 'AMEX'
        ;

        Object.keys(cards).forEach(function(number) 
            it('should detect card ' + number + ' as ' + cards[number], function() 
                Basket.detectCardType(number).should.equal(cards[number]);
            );
        );
    );
);

Actualizado: 15 de junio de 2016 (como solución definitiva actualmente)

Tenga en cuenta que incluso doy un voto a favor del que está más votado, pero para dejar en claro que estas son las expresiones regulares 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á false resultados en el mundo real!

JCB^(?:2131|1800|35)[0-9]0,$ Empezar con: 2131, 1800, 35 (3528-3589)

American Express^3[47][0-9]0,$ Empezar con: 34, 37

Diners Club^3(?:0[0-59]1|[689])[0-9]0,$ Empezar con: 300-305, 309, 36, 38-39

Visa^4[0-9]0,$ Empezar con: 4

tarjeta MasterCard^(5[1-5]|222[1-9]|22[3-9]|2[3-6]|27[01]|2720)[0-9]0,$ Empezar con: 2221-2720, 51-55

Maestro^(5[06789]|6)[0-9]0,$ Maestro siempre creciendo en la gama: 60-69, comenzó con / no con otra cosa, pero el comienzo 5 debe codificarse como mastercard de todos modos. Las tarjetas Maestro deben detectarse al final del código porque algunas otras tienen un rango de 60-69. Mire 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,$ Descubra bastante difícil de codificar, comience con: 6011, 622126-622925, 644-649, 65

En javascript Yo uso esta función. Esto es bueno cuando lo asigna a un evento onkeyup y da un resultado lo antes posible.

function cc_brand_id(cur_val) 62292[0-5])[0-9]0,$');
    ////6011, 622126-622925, 644-649, 65


    // get rid of anything but numbers
    cur_val = cur_val.replace(/D/g, '');

    // checks per each, as their could be multiple hits
    //fix: ordering matter in detection, otherwise can give false results in rare cases
    var sel_brand = "unknown";
    if (cur_val.match(jcb_regex)) 
        sel_brand = "jcb";
     else if (cur_val.match(amex_regex)) 
        sel_brand = "amex";
     else if (cur_val.match(diners_regex)) 
        sel_brand = "diners_club";
     else if (cur_val.match(visa_regex)) 
        sel_brand = "visa";
     else if (cur_val.match(mastercard_regex)) 
        sel_brand = "mastercard";
     else if (cur_val.match(discover_regex)) 
        sel_brand = "discover";
     else if (cur_val.match(maestro_regex)) 
        if (cur_val[0] == '5')  //started 5 must be mastercard
            sel_brand = "mastercard";
         else 
            sel_brand = "maestro"; //maestro is all 60-69 which is not something else, thats why this condition in the end
        
    

    return sel_brand;

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:

/**
  * Obtain a brand constant from a PAN
  *
  * @param string $pan               Credit card number
  * @param bool   $include_sub_types Include detection of sub visa brands
  * @return string
  */
public static function getCardBrand($pan, $include_sub_types = false)
35)[0-9]0,$/";

    //ordering matter in detection, otherwise can give false results in rare cases
    if (preg_match($jcb_regex, $pan)) 
        return "jcb";
    

    if (preg_match($amex_regex, $pan)) 
        return "amex";
    

    if (preg_match($diners_regex, $pan)) 
        return "diners_club";
    

    //sub visa/mastercard cards
    if ($include_sub_types) 
        if (preg_match($vpreca_regex, $pan)) 
            return "v-preca";
        
        if (preg_match($postepay_regex, $pan)) 
            return "postepay";
        
        if (preg_match($cartasi_regex, $pan)) 
            return "cartasi";
        
        if (preg_match($entropay_regex, $pan)) 
            return "entropay";
        
        if (preg_match($o2money_regex, $pan)) 
            return "o2money";
        
        if (preg_match($kukuruza_regex, $pan)) 
            return "kukuruza";
        
        if (preg_match($yunacard_regex, $pan)) 
            return "yunacard";
        
    

    if (preg_match($visa_regex, $pan)) 
        return "visa";
    

    if (preg_match($mastercard_regex, $pan)) 
        return "mastercard";
    

    if (preg_match($discover_regex, $pan)) 
        return "discover";
    

    if (preg_match($maestro_regex, $pan)) 
        if ($pan[0] == '5')  //started 5 must be mastercard
            return "mastercard";
        
        return "maestro"; //maestro is all 60-69 which is not something else, thats why this condition in the end

    

    return "unknown"; //unknown for this system

Aquí tienes las reseñas y valoraciones

Al final de todo puedes encontrar las anotaciones de otros administradores, tú además tienes el poder insertar el tuyo si te apetece.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *