← Voltar ao blog

Validação de CNPJ em Node.js: implementação completa sem dependências

·7 min de leitura

Se você está construindo um sistema que aceita CNPJ — cadastro de fornecedores, marketplace, emissão de NF-e — precisa validar o formato e os dígitos verificadores. Muitos devs instalam uma lib para isso, mas a validação é simples o suficiente para implementar em poucas linhas.

Estrutura do CNPJ

O CNPJ tem 14 dígitos no formato XX.XXX.XXX/XXXX-XX. Os 8 primeiros identificam a empresa, os 4 seguintes identificam a filial (0001 para matriz), e os 2 últimos são dígitos verificadores calculados pelo algoritmo módulo 11.

O algoritmo

O cálculo é similar ao do CPF, mas com pesos diferentes:

  1. Remova a formatação (pontos, barra, traço)
  2. Verifique se tem exatamente 14 dígitos e não é uma sequência repetida
  3. Para o primeiro dígito verificador: multiplique os 12 primeiros dígitos pelos pesos 5,4,3,2,9,8,7,6,5,4,3,2
  4. Some os resultados e calcule o resto da divisão por 11
  5. Se o resto for menor que 2, o dígito é 0; caso contrário, é 11 menos o resto
  6. Repita com os 13 dígitos e pesos 6,5,4,3,2,9,8,7,6,5,4,3,2 para o segundo dígito

Implementação em TypeScript

function validateCNPJ(cnpj: string): boolean {
// Remove formatação
const digits = cnpj.replace(/\\D/g, '');
// Deve ter 14 dígitos
if (digits.length !== 14) return false;
// Rejeita sequências repetidas
if (/^(\\d)\\1+$/.test(digits)) return false;
// Calcula dígitos verificadores
const weights1 = [5,4,3,2,9,8,7,6,5,4,3,2];
const weights2 = [6,5,4,3,2,9,8,7,6,5,4,3,2];
const calcDigit = (slice: string, w: number[]) => {
const sum = slice.split('')
.reduce((acc, d, i) => acc + parseInt(d) * w[i], 0);
const rest = sum % 11;
return rest < 2 ? 0 : 11 - rest;
};
const d1 = calcDigit(digits.slice(0, 12), weights1);
const d2 = calcDigit(digits.slice(0, 12) + d1, weights2);
return d1 === parseInt(digits[12])
&& d2 === parseInt(digits[13]);
}

Testando a validação

Agora você precisa de CNPJs fictícios para testar. Se usar apenas CNPJs inválidos, você só testa o caminho de rejeição. Gere CNPJs válidos para testar o caminho de aceitação:

CNPJs fictícios com dígitos verificadores válidos

Clique em Gerar para começar

Casos de teste recomendados

// Deve aceitar
validateCNPJ('11.222.333/0001-81'); // formatado
validateCNPJ('11222333000181'); // sem formato
// Deve rejeitar
validateCNPJ('11.111.111/1111-11'); // sequência repetida
validateCNPJ('12.345.678/0001-00'); // dígitos errados
validateCNPJ('123'); // tamanho errado
validateCNPJ(''); // vazio

Via API para testes em massa

# Gerar 200 CNPJs para popular o banco de testes
curl "https://fakeforge.com.br/api/generate?type=cnpj&quantity=200&format=json"

Resumo

  • Validação de CNPJ são ~20 linhas de código, sem necessidade de libs externas
  • O algoritmo mod-11 com pesos específicos valida os 2 dígitos verificadores
  • Teste com CNPJs válidos (gerados) e inválidos para cobrir ambos os caminhos
  • Use o validador online para checar CNPJs rapidamente
  • Use a API para gerar CNPJs em massa no CI/CD