Validador de cartão de crédito (Luhn e bandeira)

O validador de cartão de crédito confere se um número passa no algoritmo de Luhn, o dígito verificador dos cartões, e identifica a bandeira pelos primeiros dígitos: Visa, Mastercard, American Express, Hipercard, Diners, Discover e JCB. A conferência é feita no seu navegador e não diz se o cartão existe ou tem limite.

Atualizado em · Por Leonardo Gaertner

Achou um resultado errado ou tem uma sugestão? Avise por e-mail.

Como usar

  1. Digite o número do cartão, com ou sem espaços.
  2. A partir de 12 dígitos, o resultado aparece na hora, com a bandeira.
  3. Se o tamanho não for o comum para a bandeira, aparece um aviso.

Como funciona

A ferramenta aplica o algoritmo de Luhn: da direita para a esquerda, dobra um dígito sim, outro não, subtrai 9 dos dobros maiores que 9 e soma tudo. O número é válido se a soma for múltipla de 10. Isso detecta qualquer dígito trocado e quase todas as inversões de dois dígitos vizinhos.

A bandeira vem dos primeiros dígitos: 4 é Visa, 51 a 55 e 2221 a 2720 são Mastercard, 34 e 37 são American Express, 606282 é Hipercard, e assim por diante. As faixas da Elo são muitas e mudam, por isso ela aparece como não identificada.

Passar no Luhn não quer dizer que o cartão existe, está ativo ou tem limite. Isso só a operadora responde, quando o pagamento é autorizado.

Em código

Para validar o número do cartão em código, aplique o algoritmo de Luhn e confira o tamanho. A bandeira e a existência do cartão ficam com o gateway de pagamento.

JavaScript
// Algoritmo de Luhn: da direita para a esquerda, dobra um dígito sim, outro não
function luhnConfere(digitos) {
  let soma = 0;
  for (let i = 0; i < digitos.length; i++) {
    let n = Number(digitos[digitos.length - 1 - i]);
    if (i % 2 === 1) {
      n *= 2;
      if (n > 9) n -= 9; // 7 × 2 = 14, e 1 + 4 = 5 (o mesmo que 14 - 9)
    }
    soma += n;
  }
  return soma % 10 === 0;
}

// Cartão: de 12 a 19 dígitos e o Luhn conferindo
function cartaoValido(numero) {
  const d = numero.replace(/\D/g, '');
  return d.length >= 12 && d.length <= 19 && luhnConfere(d);
}

// Dígito que completa um número para passar no Luhn (útil para gerar dados de teste)
function digitoLuhn(base) {
  for (let dv = 0; dv <= 9; dv++) {
    if (luhnConfere(`${base}${dv}`)) return dv;
  }
}
Python
import re


def luhn_confere(digitos: str) -> bool:
    soma = 0
    for i, c in enumerate(reversed(digitos)):
        n = int(c)
        if i % 2 == 1:
            n = n * 2 - 9 if n * 2 > 9 else n * 2
        soma += n
    return soma % 10 == 0


def cartao_valido(numero: str) -> bool:
    d = re.sub(r"\D", "", numero)
    return 12 <= len(d) <= 19 and luhn_confere(d)
PHP
<?php
function luhnConfere(string $digitos): bool
{
    $soma = 0;
    foreach (str_split(strrev($digitos)) as $i => $c) {
        $n = (int) $c;
        if ($i % 2 === 1) {
            $n = $n * 2 > 9 ? $n * 2 - 9 : $n * 2;
        }
        $soma += $n;
    }
    return $soma % 10 === 0;
}

function cartaoValido(string $numero): bool
{
    $d = preg_replace('/\D/', '', $numero);
    return strlen($d) >= 12 && strlen($d) <= 19 && luhnConfere($d);
}

Perguntas frequentes

O validador diz se o cartão tem limite?

Não. Ele só confere o formato e o dígito verificador. Se o cartão existe, está ativo ou tem limite, só a operadora responde, na autorização do pagamento.

É seguro digitar o número do cartão aqui?

O número não sai do seu navegador. Mesmo assim, evite colar cartões reais em qualquer site: para testes, use números fictícios ou os cartões de teste do seu gateway.

Como saber a bandeira pelo número do cartão?

Pelos primeiros dígitos: 4 é Visa, 51 a 55 ou 2221 a 2720 é Mastercard, 34 ou 37 é American Express e 606282 é Hipercard. O validador mostra a bandeira ao conferir o número.