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.
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:
Exemplo prático com o número fictício 4539 1488 0343 6467:
- 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
Tabela: passos e checagem rápida
| Passo | Ação | Exemplo (valor parcial) |
| 1 | Sanitizar entrada | "4539 1488 0343 6467" -> "4539148803436467" |
| 2 | Dobrar cada segundo dígito | dígitos dobrados mostram 6,12,16 etc |
| 3 | Ajustar >9 (-9) | 12 -> 3, 16 -> 7 |
| 4 | Somar todos | soma final 71 |
| 5 | Módulo 10 | 71 % 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:
- 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:
- 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.
Comparação rápida: Luhn vs validação completa
| Verificação | Detecta digito errado | Detecta número inexistente | Custo computacional |
| Luhn | Sim (100% dos casos de 1 dígito) | Não | Baixo |
| Consulta BIN | Não | Parcialmente, depende da base | Médio |
| Autorização | Não | Sim (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:
Checklist de implementação segura:
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).
