Estou tentando descobrir como detectar o tipo de cartão de crédito com base apenas no número. Alguém sabe de uma maneira definitiva e confiável de encontrar isso?
algorithm
language-agnostic
e-commerce
Andrew Edvalson
fonte
fonte
Respostas:
O número do cartão de crédito / débito é conhecido como PAN ou Número da conta principal . Os seis primeiros dígitos do PAN são obtidos do IIN , ou Número de identificação do emissor , pertencente ao banco emissor (os IINs eram conhecidos anteriormente como BIN - Números de identificação bancária - para que você possa ver referências a essa terminologia em alguns documentos). Esses seis dígitos estão sujeitos a um padrão internacional, ISO / IEC 7812 , e podem ser usados para determinar o tipo de cartão a partir do número.
Infelizmente, o banco de dados ISO / IEC 7812 real não está disponível ao público, no entanto, existem listas não oficiais, comerciais e gratuitas, inclusive na Wikipedia .
De qualquer forma, para detectar o tipo no número, você pode usar uma expressão regular como as abaixo: Crédito por expressões originais
Visa: os
^4[0-9]{6,}$
números dos cartões Visa começam com 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, os números MasterCard começam com os números 51 a 55, mas isso detectará apenas cartões de crédito MasterCard ; existem outros cartões emitidos usando o sistema MasterCard que não se enquadram nessa faixa IIN. Em 2016, eles adicionarão números no intervalo (222100-272099).American Express:
^3[47][0-9]{5,}$
os números dos cartões American Express começam com 34 ou 37.Diners Club: os
^3(?:0[0-5]|[68][0-9])[0-9]{4,}$
números dos cartões Diners Club começam entre 300 e 305, 36 ou 38. Existem cartões Diners Club que começam com 5 e têm 16 dígitos. Trata-se de uma joint venture entre o Diners Club e a MasterCard e deve ser processada como um MasterCard.Descobrir: os
^6(?:011|5[0-9]{2})[0-9]{3,}$
números dos cartões Discover começam com 6011 ou 65.JCB: os
^(?:2131|1800|35[0-9]{3})[0-9]{3,}$
cartões JCB começam com 2131, 1800 ou 35.Infelizmente, existem vários tipos de cartões processados com o sistema MasterCard que não vivem no intervalo IIN da MasterCard (números que começam 51 ... 55); o caso mais importante é o dos cartões Maestro, muitos dos quais foram emitidos pelas gamas IIN de outros bancos e, portanto, estão localizados em todo o espaço numérico. Como resultado, pode ser melhor supor que qualquer cartão que não seja de outro tipo aceito deve ser um MasterCard .
Importante : os números dos cartões variam em tamanho; por exemplo, a Visa emitiu cartões com PANs de 13 dígitos e cartões com PANs de 16 dígitos. Atualmente, a documentação da Visa indica que ela pode emitir ou ter emitido números com 12 a 19 dígitos. Portanto, você não deve verificar o comprimento do número do cartão, exceto para verificar se ele possui pelo menos 7 dígitos (para um IIN completo mais um dígito de verificação, que deve corresponder ao valor previsto pelo algoritmo de Luhn ).
Mais uma dica: antes de processar um PAN do titular do cartão, retire todos os caracteres de espaço em branco e de pontuação da entrada . Por quê? Como geralmente é muito mais fácil inserir os dígitos em grupos, semelhante à maneira como eles são exibidos na frente de um cartão de crédito real, ou seja,
é muito mais fácil entrar corretamente do que
Não há realmente nenhum benefício em punir o usuário porque ele inseriu caracteres que você não espera aqui.
Isso também implica garantir que seus campos de entrada tenham espaço para pelo menos 24 caracteres; caso contrário, os usuários que inserirem espaços ficarão sem espaço. Eu recomendo que você amplie o campo o suficiente para exibir 32 caracteres e permitir até 64; isso oferece muito espaço para expansão.
Aqui está uma imagem que fornece um pouco mais de insight:
ATUALIZAÇÃO (2014): O método de soma de verificação não parece mais uma maneira válida de verificar a autenticidade de um cartão, conforme observado nos comentários desta resposta.
ATUALIZAÇÃO (2016): a Mastercard deve implementar novos intervalos de BIN a partir do Ach Payment .
fonte
Em javascript:
Teste de unidade:
fonte
Atualizado: 15 de junho de 2016 (atualmente, como solução definitiva)
Por favor, note que eu até desisto de votar em quem é o mais votado, mas para deixar claro que esses são os regexps que realmente funcionam, eu testei com milhares de códigos BIN reais. O mais importante é usar as strings de início (^), caso contrário, ele fornecerá resultados falsos no mundo real!
JCB
^(?:2131|1800|35)[0-9]{0,}$
Começa com: 2131, 1800, 35 (3528-3589)American Express
^3[47][0-9]{0,}$
Iniciar com: 34, 37Diners Club
^3(?:0[0-59]{1}|[689])[0-9]{0,}$
Começa com: 300-305, 309, 36, 38-39Visa
^4[0-9]{0,}$
Iniciar com: 4MasterCard
^(5[1-5]|222[1-9]|22[3-9]|2[3-6]|27[01]|2720)[0-9]{0,}$
Começa com: 2221-2720, 51-55Maestro O
^(5[06789]|6)[0-9]{0,}$
Maestro sempre cresce no intervalo: 60-69 , iniciado com / não outra coisa, mas o início 5 deve ser codificado como mastercard de qualquer maneira. Os cartões Maestro devem ser detectados no final do código, porque outros têm no intervalo de 60 a 69. Por favor, olhe o código.Descobrir
^(6011|65|64[4-9]|62212[6-9]|6221[3-9]|622[2-8]|6229[01]|62292[0-5])[0-9]{0,}$
Descobrir bastante difícil de codificar, comece com: 6011, 622126-622925, 644-649, 65Em javascript, eu uso essa função. Isso é bom quando você o atribui a um evento onkeyup e fornece o resultado o mais rápido possível.
Aqui você pode brincar com ele:
http://jsfiddle.net/upN3L/69/
Para o PHP, use esta função, isso também detecta algumas placas sub VISA / MC:
fonte
Aqui está a função para verificar o tipo de cartão de crédito usando Regex, c #
fonte
Veja isso:
http://www.breakingpar.com/bkp/home.nsf/0/87256B280015193F87256CC70060A01B
fonte
recentemente, eu precisava dessa funcionalidade, estava portando o Zend Framework Credit Card Validator para ruby. ruby gem: https://github.com/Fivell/credit_card_validations zend framework: https://github.com/zendframework/zf2/blob/master/library/Zend/Validator/CreditCard.php
Ambos usam faixas de INN para detectar o tipo. Aqui você pode ler sobre o INN
De acordo com isso, você pode detectar o cartão de crédito alternativamente (sem regexps, mas declarando algumas regras sobre prefixos e tamanho possível)
Portanto, temos as próximas regras para os cartões mais usados
Pesquisando o prefixo e comparando o comprimento, você pode detectar a marca do cartão de crédito. Também não se esqueça do algoritmo luhn (é descrito aqui http://en.wikipedia.org/wiki/Luhn ).
ATUALIZAR
lista atualizada de regras pode ser encontrada aqui https://raw.githubusercontent.com/Fivell/credit_card_validations/master/lib/data/brands.yaml
fonte
Aqui está o código C # ou VB completo para todos os tipos de coisas relacionadas ao CC no codeproject.
Este artigo existe há alguns anos sem comentários negativos.
fonte
Versão javascript compacta
fonte
Resposta de Anatoliy em PHP:
fonte
Aqui está uma função de classe php retorna CCtype por CCnumber.
Este código não valida o cartão ou não executa o algoritmo Luhn, apenas tentando encontrar o tipo de cartão de crédito com base na tabela nesta página . usa basicamente o comprimento CCnumber e o prefixo CCcard para determinar o tipo de CCcard.
fonte
Não tente detectar o tipo de cartão de crédito como parte do processamento de um pagamento. Você está arriscando recusar transações válidas.
Se você precisar fornecer informações ao seu processador de pagamento (por exemplo, o objeto do cartão de crédito do PayPal precisa nomear o tipo de cartão ), adivinhe-o com o mínimo de informações disponíveis, por exemplo
Essa implementação (usando apenas os dois primeiros dígitos) é suficiente para identificar todos os principais esquemas de cartões (e no caso do PayPal todos os suportados). Na verdade, você pode ignorar a exceção completamente e usar como padrão o tipo de cartão mais popular. Deixe o gateway / processador de pagamento informar se há um erro de validação em resposta à sua solicitação.
A realidade é que seu gateway de pagamento não se importa com o valor que você fornece .
fonte
Os primeiros números do cartão de crédito podem ser usados para aproximar o fornecedor:
fonte
No reconhecimento de intervalo de cartões (CRR), uma desvantagem com algoritmos que usam uma série de regex ou outros intervalos codificados é que os BINs / IINs mudam ao longo do tempo em minha experiência. O co-branding de cartões é uma complicação contínua. Os adquirentes / comerciantes de cartões diferentes podem precisar que você trate o mesmo cartão de maneira diferente, dependendo, por exemplo, da localização geográfica.
Além disso, nos últimos anos com, por exemplo, cartões UnionPay em circulação mais ampla, os modelos existentes não lidam com novos intervalos que às vezes intercalam com intervalos mais amplos que eles substituem.
Conhecer a geografia que seu sistema precisa cobrir pode ajudar, pois alguns intervalos são restritos para uso em países específicos. Por exemplo, os intervalos 62 incluem alguns subintervalos AAA nos EUA, mas se sua base de comerciantes estiver fora dos EUA, você poderá tratar todos os 62 como UnionPay.
Você também pode ser solicitado a tratar um cartão de maneira diferente, com base na localização do comerciante. Por exemplo, tratar certos cartões do Reino Unido como débito no mercado interno, mas como crédito internacional.
Há um conjunto de regras muito útil mantido por um grande banco adquirente. Por exemplo https://www.barclaycard.co.uk/business/files/BIN-Rules-EIRE.pdf e https://www.barclaycard.co.uk/business/files/BIN-Rules-UK.pdf . (Links válidos a partir de junho de 2017, graças ao usuário que forneceu um link para a referência atualizada.) Mas lembre-se de que, embora essas regras de CRR possam representar o universo de emissão de cartões, como se aplica aos comerciantes adquiridos por essa entidade, não inclui, por exemplo, intervalos identificados como CUP / UPI.
Esses comentários se aplicam aos cenários de tarja magnética (MagStripe) ou PKE (Pan Key Entry). A situação é diferente novamente no mundo da ICC / EMV.
Atualização: Outras respostas nesta página (e também na página vinculada da WikiPedia) têm o JCB como sempre com 16 anos. No entanto, em minha empresa, temos uma equipe dedicada de engenheiros que certificam nossos dispositivos e softwares de PDV em vários bancos e regiões geográficas adquirentes. O mais recente pacote de cartões de certificação que essa equipe tem do JCB, teve um caso de aprovação por um PAN de 19 anos.
fonte
Swift 2.1 Versão da resposta de Usman Y. Use uma instrução print para verificar a chamada por algum valor de string
fonte
O Stripe forneceu esta fantástica biblioteca javascript para detecção de esquema de cartões. Deixe-me adicionar alguns trechos de código e mostrar como usá-lo.
Em primeiro lugar, inclua-o na sua página da web como
Em segundo lugar, use a função cardType para detectar o esquema do cartão.
Aqui estão os links de referência para mais exemplos e demonstrações.
fonte
No Swift, você pode criar uma enumeração para detectar o tipo de cartão de crédito.
Chame o método CreditCardType.cardTypeForCreditCardNumber ("# card number") que retorna o valor da enumeração CreditCardType.
fonte
Minha solução com jQuery:
No caso de retorno de 0, o tipo de cartão de crédito não é detectado.
A classe "creditcard" deve ser adicionada ao campo de entrada do cartão de crédito.
fonte
Pesquisei bastante um pouco sobre formatação de cartão de crédito e formatação de números de telefone. Encontrei muitas dicas boas, mas nada realmente atendia aos meus desejos exatos, por isso criei esse código . Você o usa assim:
fonte
fonte
Apenas uma pequena colher de alimentação:
fonte
Aqui está um exemplo de algumas funções booleanas escritas em Python que retornam
True
se o cartão for detectado conforme o nome da função.fonte
Com base nos fatos acima, eu gostaria de manter um trecho de código JAVA para identificar a marca do cartão.
Referência
fonte
Tente isso para kotlin. Adicione Regex e adicione à instrução when.
fonte
As regras de expressão regular que correspondem aos respectivos fornecedores de cartões :
(4\d{12}(?:\d{3})?)
para VISA.(5[1-5]\d{14})
para MasterCard.(3[47]\d{13})
para AMEX.((?:5020|5038|6304|6579|6761)\d{12}(?:\d\d)?)
para o Maestro.(3(?:0[0-5]|[68][0-9])[0-9]{11})
para Diners Club.(6(?:011|5[0-9]{2})[0-9]{12})
para o Discover.(35[2-8][89]\d\d\d{10})
para JCB.fonte
Eu uso https://github.com/bendrucker/creditcards-types/ para detectar o número do cartão de crédito. Um problema que encontrei é descobrir o número de teste 6011 1111 1111 1117
em https://www.cybersource.com/developers/other_resources/quick_references/test_cc_numbers/ , podemos ver que é um número de descoberta porque começa em 6011. Mas o resultado obtido pelos tipos de cartões de crédito é "Maestro". Abri a questão ao autor. Ele me respondeu muito em breve e fornece este documento em PDF https://www.discovernetwork.com/downloads/IPP_VAR_Compliance.pdf A partir do documento, podemos ver claramente que 6011 1111 1111 1117 não se enquadra no intervalo do cartão de crédito Discover.
fonte
Experimente isso.
Usar.
fonte
fonte