Grupos exclusivos de desconto no WhatsApp — Faca parte agora! Participar

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.

Como validar CNPJ alfanumérico em PHP (função pronta)

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
<?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')); // true

Calculando 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
<?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

Passos para testar
  • Rode validarCnpj() com os vetores válidos da tabela — todos devem retornar true.
  • 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.

CNPJTipoEsperado
12.ABC.345/01DE-35Alfanumérico (filial)válido
XP.TO1.234/0001-20Alfanumérico (matriz)válido
9F.8E7.D6C/0001-36Alfanumérico (matriz)válido
A1.B2C.3D4/E5F6-68Alfanumérico (filial)válido
ZZ.ZZ0.001/AAAA-41Alfanuméricoválido
11.222.333/0001-81Numérico clássicoválido
12.ABC.345/01DE-34DV incorretoinvá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.

Assistente PP
Assistente PP
Online agora
Powered by Primeira Solução