Como validar CNPJ alfanumérico em PHP (função pronta)
Função em PHP 8 puro para validar e calcular os dígitos verificadores do novo CNPJ alfanumérico, com exemplo de uso em formulário.
Validar CNPJ alfanumérico em PHP é mais simples do que parece: você reaproveita o módulo 11 de hoje, mas troca o valor de cada caractere por ASCII − 48. Aqui está uma função pronta, em PHP 8 puro, que valida e calcula os dígitos verificadores — sem dependências.
O que muda no CNPJ alfanumérico
A partir de julho de 2026, o novo CNPJ alfanumérico mantém as 14 posições e a mesma máscara XX.XXX.XXX/XXXX-DD, mas as 12 primeiras posições (raiz + ordem) passam a aceitar letras maiúsculas A–Z além dos dígitos 0–9. Os dois últimos caracteres (dígitos verificadores) continuam numéricos. Os CNPJs numéricos atuais não mudam e seguem válidos, então seu sistema precisa aceitar os dois formatos ao mesmo tempo. Para o panorama completo, veja o nosso guia de implementação do CNPJ alfanumérico.
Validando CNPJ alfanumérico em PHP
A função abaixo normaliza a entrada (remove máscara e força maiúsculas), confere o formato com uma expressão regular que aceita letras nas 12 primeiras posições, rejeita base zerada e compara os dígitos verificadores calculados com os informados. Copie como está — cada linha já foi conferida contra os vetores oficiais.
<?php
const PESO1 = [5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
const PESO2 = [6, 5, 4, 3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
function normalizarCnpj(string $s): string {
return preg_replace('/[^A-Z0-9]/', '', strtoupper($s));
}
function digitoCnpj(string $base, array $pesos): int {
$soma = 0;
for ($i = 0; $i < strlen($base); $i++) {
$soma += (ord($base[$i]) - 48) * $pesos[$i];
}
$resto = $soma % 11;
return $resto < 2 ? 0 : 11 - $resto;
}
function calcularDvCnpj(string $base12): string {
$d1 = digitoCnpj($base12, PESO1);
$d2 = digitoCnpj($base12 . $d1, PESO2);
return $d1 . $d2;
}
function validarCnpj(string $cnpj): bool {
$c = normalizarCnpj($cnpj);
if (!preg_match('/^[A-Z0-9]{12}[0-9]{2}$/', $c)) return false;
if (preg_match('/^0{12}/', $c)) return false;
return calcularDvCnpj(substr($c, 0, 12)) === substr($c, 12);
}
// var_dump(validarCnpj('12.ABC.345/01DE-35')); // trueCalculando os dígitos verificadores
A lógica do DV está em três funções pequenas. digitoCnpj() percorre a base, multiplica cada caractere (já convertido por ord($base[$i]) - 48) pelo peso correspondente, soma tudo e aplica a regra do resto: resto = soma % 11; se resto < 2 o dígito é 0, senão é 11 - resto. calcularDvCnpj() calcula o primeiro DV sobre as 12 posições com os pesos PESO1, depois o segundo DV sobre as 13 posições (base + primeiro DV) com os pesos PESO2. O resultado são sempre dois dígitos numéricos. Se você precisa só gerar os verificadores de uma base, chame calcularDvCnpj('12ABC34501DE') e receberá "35".
Usando em formulários (sanitização)
Em um formulário, sempre normalize antes de validar e nunca confie no que veio mascarado do front-end. O exemplo abaixo valida o campo cnpj de um POST e guarda a versão limpa (14 caracteres, maiúscula) para gravar no banco como texto.
<?php
$entrada = $_POST['cnpj'] ?? '';
if (!validarCnpj($entrada)) {
http_response_code(422);
exit('CNPJ inválido.');
}
// Guarde sem máscara, sempre em MAIÚSCULAS (coluna VARCHAR(14)).
$cnpjLimpo = normalizarCnpj($entrada);
// $stmt->execute([':cnpj' => $cnpjLimpo]);Como testar
- Rode
validarCnpj()com os vetores válidos da tabela — todos devem retornartrue. - Inclua um CNPJ numérico atual: o sistema precisa aceitar os dois formatos.
- Teste o caso inválido (DV trocado) e confirme
false. - Confira
calcularDvCnpj('12ABC34501DE')==="35".
Para gerar massa de teste rapidamente, use o nosso gerador de CNPJ alfanumérico e confira cada resultado no validador de CNPJ alfanumérico.
| CNPJ | Tipo | Esperado |
|---|---|---|
12.ABC.345/01DE-35 | Alfanumérico (filial) | válido |
XP.TO1.234/0001-20 | Alfanumérico (matriz) | válido |
9F.8E7.D6C/0001-36 | Alfanumérico (matriz) | válido |
A1.B2C.3D4/E5F6-68 | Alfanumérico (filial) | válido |
ZZ.ZZ0.001/AAAA-41 | Alfanumérico | válido |
11.222.333/0001-81 | Numérico clássico | válido |
12.ABC.345/01DE-34 | DV incorreto | inválido |
Perguntas frequentes
As bibliotecas de CNPJ que eu já uso vão funcionar com o formato alfanumérico?
Provavelmente não. A maioria das libs antigas converte a entrada com (int) ou remove tudo que não é dígito antes de validar, descartando as letras das 12 primeiras posições. Verifique a fonte ou substitua pela função própria deste tutorial.
Preciso mudar o tipo da coluna no banco de dados?
Sim. Se a coluna de CNPJ for INT/BIGINT ou usar ZEROFILL, ela quebra com letras. Use VARCHAR(14) (sem máscara) e grave sempre em maiúsculas. Detalhamos isso no tutorial de CNPJ alfanumérico no banco de dados.
Como faço a mesma validação em outras linguagens?
O algoritmo é idêntico, muda só a sintaxe. Veja as versões em JavaScript e Python, ou a integração pronta para validar CNPJ alfanumérico no Laravel.
Os CNPJs numéricos que já tenho cadastrados continuam válidos?
Continuam. A função acima valida tanto os numéricos atuais quanto os novos alfanuméricos, porque o cálculo do DV é o mesmo — letras apenas passam a entrar na conta via ord() - 48.
Fontes: Receita Federal (IN RFB 2.229/2024) e nota técnica do Serpro sobre o CNPJ alfanumérico.
Ofertas em destaque
Ver todas →
Shopee
-56%
Calça Pantalona Lanzinha Feminina Cintura Alta Com Elastico De e Bolso Outono / Inverno Promoção
Amazon
-14%
Lenços Umedecidos Huggies Rosto e Corpo Limpeza 4 x 48 Un
Shopee
-60%
Brow Rise Gel Para Sobrancelhas By Ruby Rose Linha Rosa HB-E2503 Hot Sale
Amazon
-27%
Hellmann's Maionese Light 500g
Amazon
-93%
Tramontina Ducha Elétrica 3 Temperaturas 5500 W 127 V Chuveiro Branco
Mercado Livre
-20%
Malbec Pure Gold O Boticário Desodorante Colônia Perfume Masculino Original 100ml
Mercado Livre
Perfume Lattafa Bade'e Al Oud For Glory Edp Spray 100 Ml
Mercado Livre
Jaqueta Masc. Sarja Capuz Broken Rules 510075 Preto M Lisa
Mercado Livre