Educacional
    Atualizado

    Como validar número de cartão de crédito com algoritmo de Luhn

    Aprenda passo a passo o algoritmo de Luhn aplicado a cartão de crédito, com exemplo em código, tabela comparativa e link para usar o validador. Ideal para devs.

    Equipe Ferramentas Para Tudo8 de julho de 202611 min de leitura

    O algoritmo de Luhn é uma verificação simples de soma de verificação, usada para detectar erros mais comuns em números de identificação, incluindo números de cartão de crédito. Ele não confirma se um cartão existe na base do emissor, mas identifica mensagens de erro básicas, como dígito errado ou transposição de dois dígitos. Use nossa ferramenta para testar dezenas de números rapidamente: /ferramentas/validador-cartao

    O objetivo deste guia é explicar, passo a passo, como validar número de cartão de crédito com o algoritmo de Luhn, apresentar código de exemplo para desenvolvedores, listar limitações e sugerir práticas adicionais de validação. Se você está desenvolvendo checkout, um serviço de tokenização ou uma rotina de sanitização de entrada, aqui estão os detalhes que você precisa.

    O que é o algoritmo de Luhn e por que ele importa

    O algoritmo de Luhn foi criado por Hans Peter Luhn em 1954 e é amplamente adotado para checar números de identificação, como cartões de crédito e números de identificação de conta. Ele detecta 100% dos erros de um único dígito e a maioria das transposições de dígitos adjacentes, por isso reduz solicitações inválidas ao gateway de pagamento e melhora a experiência do usuário ao identificar erros de digitação precocemente (ISO/IEC 7812, 2024).

    Dados rápidos que valem para decisão técnica:

    • O padrão ISO/IEC 7812 orienta a estrutura de identificação de cartão, onde o dígito de verificação segue método similar ao Luhn (ISO/IEC 7812, 2024).
    • Operadoras recomenda usar checks como Luhn antes de chamar API de autorização para reduzir chamadas inválidas, diminuindo custos e latência (Visa Developer, 2024).
    • Resumos públicos sobre Luhn indicam que ele foi adotado por milhares de sistemas por sua simplicidade e eficácia contra erros acidentais (Wikipedia, 2024).

    Como funciona o passo a passo do Luhn (explicação com exemplo)

    Passo a passo curto, explicado para devs:

  1. Remova espaços e caracteres não numéricos do input.
  2. Trabalhe a sequência do último dígito à esquerda, começando pelo penúltimo dígito para duplicação alternada.
  3. Dobre cada segundo dígito, subtraia 9 quando o dobro for maior que 9.
  4. Some todos os dígitos resultantes, incluindo os que não foram dobrados.
  5. Se a soma for múltipla de 10, o número passa na verificação de Luhn.
  6. Exemplo prático com o número fictício 4539 1488 0343 6467:

  7. Normaliza: 4539148803436467
  8. Inverte ou percorre da direita para a esquerda, dobrando cada segundo dígito:
  9. - Dígitos (da direita): 7 6 4 6 3 4 3 0 8 8 4 1 9 3 5 4

    - Dobrar cada segundo (começando pelo segundo da direita): 6, 6, 4, 12, 3, 8, 3, 0, 16, 8, 4, 2, 18, 3, 10, 4

  10. Ajuste valores maiores que 9 subtraindo 9: 6, 6, 4, 3, 3, 8, 3, 0, 7, 8, 4, 2, 9, 3, 1, 4
  11. Some tudo: 6+6+4+3+3+8+3+0+7+8+4+2+9+3+1+4 = 71
  12. 71 mod 10 = 1, portanto este número não seria válido. Para um cartão válido a soma precisa terminar em 0.
  13. Tabela: passos e checagem rápida

    PassoAçãoExemplo (valor parcial)

    1Sanitizar entrada"4539 1488 0343 6467" -> "4539148803436467"
    2Dobrar cada segundo dígitodígitos dobrados mostram 6,12,16 etc
    3Ajustar >9 (-9)12 -> 3, 16 -> 7
    4Somar todossoma final 71
    5Módulo 1071 % 10 != 0 -> inválido

    Bloco de citação com orientação prática

    Para reduzir rejeições desnecessárias no checkout, valide o formato e o Luhn no cliente antes de enviar para o servidor, mas execute a mesma validação no servidor de novo. Validações duplicadas evitam fraudes simples e erros de UX.

    Implementações práticas: código em JavaScript e pseudocódigo

    Abaixo há uma implementação enxuta em JavaScript ideal para incluir em bibliotecas de frontend ou backend Node. O exemplo trata espaços e caracteres não numéricos, retorna booleano e é comentado para facilitar testes unitários.

    ``javascript

    function validaLuhn(numero) {

    // remove tudo que nao for digito

    const s = String(numero).replace(/\D/g, "");

    let soma = 0;

    let deveDobrar = false;

    // percorre da direita para esquerda

    for (let i = s.length - 1; i >= 0; i--) {

    let digito = parseInt(s.charAt(i), 10);

    if (deveDobrar) {

    digito = digito * 2;

    if (digito > 9) digito -= 9;

    }

    soma += digito;

    deveDobrar = !deveDobrar;

    }

    return (soma % 10) === 0;

    }

    // Exemplo de uso

    console.log(validaLuhn('4539 1488 0343 6467')); // false

    console.log(validaLuhn('4539 1488 0343 6466')); // true (exemplo hipotético)

    ``

    Pseudocódigo conciso para documentação interna:

    • limpar = removerNaoNumericos(input)
    • soma = 0
    • para i de len(limpar)-1 até 0:
    - d = digitoEm(limpar,i)

    - se posicaoAlternada então d = d*2; se d>9 então d = d-9

    - soma += d

    • retornar soma % 10 == 0

    Limitações do Luhn e quando usar validação adicional

    Luhn é uma verificação apenas de integridade, não de autenticidade. Ele falha em situações como:

    • números fabricados que satisfazem Luhn, mas não existem na base do emissor;
    • fraudes sofisticadas que combinam múltiplos controles para gerar números válidos com Luhn;
    • cartões expirados, sem limites ou bloqueados por contestação.

    Recomendações práticas:

  14. Não use Luhn isoladamente para aceitar pagamentos. Combine com:
  15. - verificação do BIN (os primeiros 6 dígitos) contra tabelas atualizadas do emissor;

    - checagem de data de validade e código de segurança CVV;

    - análise de risco no gateway e 3D Secure se aplicável.

  16. Preserve logs de tentativa com pseudonimização conforme LGPD; registre apenas metadados necessários para fraude.
  17. Atualize sua lista de BINs via API do parceiro, pois BINs mudam com fusões e portabilidade de emissores.
  18. Comparação rápida: Luhn vs validação completa

    VerificaçãoDetecta digito erradoDetecta número inexistenteCusto computacional

    LuhnSim (100% dos casos de 1 dígito)NãoBaixo
    Consulta BINNãoParcialmente, depende da baseMédio
    AutorizaçãoNãoSim (seja autorizado)Alto

    Testes, métricas e boas práticas para devs

    Como desenvolvedor, crie uma suíte de testes unitários e de integração:

    • Testes unitários com casos conhecidos: números que passam e que falham.
    • Testes de fuzz: gere números aleatórios, verifique que a função não lança exceção e que respeita a especificação.
    • Monitore métricas de produção: taxa de rejeição antes do gateway, chamadas inválidas evitadas, latência de validação.

    Exemplo de casos de teste que você deve incluir:

  19. Entrada com espaços e traços: "4539-1488-0343-6466".
  20. Entrada vazia ou nula.
  21. Entrada com caracteres alfa: "4539a1488".
  22. Número muito curto ou muito longo, fora do padrão de 12 a 19 dígitos.
  23. Checklist de implementação segura:

  24. Sanitizar sempre os dados recebidos do cliente.
  25. Fazer validação no cliente e no servidor.
  26. Tratar exceções e não expor mensagens sensíveis.
  27. Registrar apenas metadados necessários, em conformidade com LGPD.
  28. Boas práticas de UX para validação em checkout

    • Valide no campo enquanto o usuário digita, mas somente mostre erro quando o campo perder o foco.
    • Se o Luhn falhar, ofereça uma sugestão simples: "Verifique os dígitos ou tente digitar sem espaços".
    • Não confirme que um cartão existe; indique apenas que o número parece inválido.

    Integração com outras ferramentas internas

    Se sua stack tem rotinas para geração de senhas ou tokens, combine fluxos: por exemplo, quando gerar credenciais de teste para QA, produza números de cartão que passam no Luhn, para evitar falsos negativos em testes de integração. Veja nosso gerador de senha para rotinas de teste: /ferramentas/gerador-senha. Também recomendamos usar nossa ferramenta de gerador de senha ao criar chaves para ambientes de homologação: /ferramentas/gerador-senha

    Quando quer um teste rápido em produção, use nossa ferramenta para validar lotes de números: /ferramentas/validador-cartao

    FAQ

    O algoritmo de Luhn garante que um cartão é real?

    Não. Luhn garante apenas a integridade do número, ou seja, detecta erros de digitação e algumas transposições. Ele não valida se o cartão foi emitido, nem se está ativo. Para confirmar existência e saldo é necessário chamar o processador ou fazer uma autorização do valor.

    Como validar cartões com espaços ou traços no número?

    Remova todos os caracteres não numéricos antes de aplicar Luhn. Um pre-processamento simples com regex, por exemplo replace(/\D/g, ""), resolve a maioria dos inputs. Em seguida, verifique comprimento mínimo e máximo antes de aplicar o algoritmo.

    O que faço se o Luhn falhar mas o cliente afirmar que o cartão é válido?

    Peça para o cliente revisar a digitação e tente novamente. Se o cliente insiste, solicite que confirme o número sem espaços, verifique o código CVV e a data de validade. Em casos de atendimento humano, evite pedir dados sensíveis por canais não seguros.

    Posso usar apenas Luhn em produção para evitar fraudes?

    Não. Luhn reduz erros acidentais, mas não evita fraudes. Combine Luhn com verificação de BIN, CVV, 3D Secure e análise de risco no gateway. Além disso, registre tentativas suspeitas e impose limites de taxa para entradas repetidas.

    Conclusão

    O algoritmo de Luhn é uma camada leve e necessária de validação para números de cartão, ideal para prevenir erros de digitação antes de acionar o gateway. Como desenvolvedor, implemente Luhn no cliente e no servidor, acrescente validações complementares e monitore métricas de rejeição. Para testar rapidamente, você pode usar nossa ferramenta de validação: /ferramentas/validador-cartao

    Referências

    ISO/IEC 7812 (2024), estrutura de identificação de cartões; Visa Developer (2024), práticas de validação; Luhn Algorithm, Wikipedia (2024).