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 })); // truepublicidade
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
alphajá 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.