cnpjcpf.
Código · JavaScript

Gerar CNPJ em JavaScript

Função sem dependências que gera um CNPJ matematicamente válido para teste — numérico ou alfanumérico, com a opção { alpha: true }. Calcula os dois verificadores pelo módulo 11 (ASCII−48) e opcionalmente aplica a máscara.

A função

JavaScript
const W1 = [5,4,3,2,9,8,7,6,5,4,3,2];
const W2 = [6,5,4,3,2,9,8,7,6,5,4,3,2];
const val = (c) => c.charCodeAt(0) - 48;        // '0'->0 ... 'Z'->42
const dvCNPJ = (base, w) => {
  let s = 0;
  for (let i = 0; i < w.length; i++) s += val(base[i]) * w[i];
  const r = s % 11;
  return r < 2 ? 0 : 11 - r;
};

function generateCNPJ({ alpha = false, mask = false } = {}) {
  const set = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
  let base = '';
  for (let i = 0; i < 8; i++)
    base += alpha ? set[Math.floor(Math.random() * 36)] : String(Math.floor(Math.random() * 10));
  base += '0001';
  const d1 = dvCNPJ(base, W1), d2 = dvCNPJ(base + d1, W2);
  const s = base + d1 + d2;
  return mask ? s.replace(/^(..)(...)(...)(....)(..)$/, '$1.$2.$3/$4-$5') : s;
}

generateCNPJ();                          // '11222333000181'  (numérico)
generateCNPJ({ mask: true });            // '11.222.333/0001-81'
generateCNPJ({ alpha: true });           // '12ABC34501DE35'  (alfanumérico)
generateCNPJ({ alpha: true, mask: true }); // '12.ABC.345/01DE-35'

Monta 8 posições de base (dígitos, ou letras+dígitos quando alpha), fixa a ordem da matriz em 0001 e calcula os dois verificadores. O alpha só troca o alfabeto da base; o cálculo do DV é o mesmo, com a conversão val() = ASCII − 48. Os 2 verificadores são sempre numéricos.

Detalhe: com alpha: true a base é puramente aleatória sobre 36 símbolos, então existe uma chance mínima (~0,002%) de sair só com dígitos — ainda um CNPJ válido. Se quiser forçar ao menos uma letra na raiz, trate isso fora do núcleo.

Validar o que você gerou

A mesma dvCNPJ serve para conferir os dois formatos. Gere, valide, garanta que fecha.

JavaScript
function isValidCNPJ(cnpj) {
  cnpj = String(cnpj).replace(/[./-]/g, '').toUpperCase();
  if (!/^[A-Z0-9]{12}\d{2}$/.test(cnpj)) return false;
  if (/^(.)\1{13}$/.test(cnpj)) return false;
  const d1 = dvCNPJ(cnpj.slice(0, 12), W1);
  const d2 = dvCNPJ(cnpj.slice(0, 12) + d1, W2);
  return d1 === Number(cnpj[12]) && d2 === Number(cnpj[13]);
}

isValidCNPJ(generateCNPJ({ alpha: true })); // true
publicidade

Cuidados

  • Número fictício, não real. A função gera um CNPJ que passa no módulo 11, mas não corresponde a empresa nenhuma. É para teste de software e QA — ver se é legal gerar CPF/CNPJ e CNPJ válido vs. CNPJ real.
  • Válido ≠ existe. Consistência matemática não é registro na Receita.
  • Sequências repetidas são tecnicamente consistentes; o validador acima as rejeita com /^(.)\1{13}$/, mas o gerador quase nunca as produz.
  • Math.random não é criptográfico. Suficiente para massa de teste; para imprevisibilidade real use crypto.getRandomValues.
  • Alfanumérico entra em jul/2026 (IN RFB nº 2.229/2024), só para novos registros. A opção alpha já antecipa o formato.

Continue

Código verificado por execução: a saída passa no validador (módulo 11 com ASCII−48; exemplo SERPRO 12ABC34501DE→35). Números fictícios para teste. Revisado em 06/2026.