Como validar CNPJ com PHP

Nenhum produto encontrado nessa seleção.

Seguindo a mesma linha de raciocínio para a validação de CPF, hoje você vai aprender a validar CNPJ com PHP.

O CNPJ é formado por quatorze números separados por dois pontos, uma barra e um traço, por exemplo:

12.345.678/0001-95

Caso queira, você pode utilizar o gerador e/ou validador de CNPJ que criei:

A parte que está antes da barra representa o número da inscrição; o valor após a barra e antes do traço representa um código único para matriz e filial; os dois últimos dígitos (que vem após o traço) são chamados de dígitos verificadores. Eles são formados a partir dos doze primeiros números pelo cálculo que você verá logo abaixo.

Algoritmo do CNPJ

O cálculo do CNPJ deve ser feito em duas etapas.

Primeiro cálculo

Na primeira, separe os doze primeiros números em uma tabela simples:

123456780001

Agora temos que multiplicar todos os números acima por uma sequência padrão. Veja:

123456780001
x5x4x3x2x9x8x7x6x5x4x3x2
5898454849480002

Agora devemos somar o resultado de todas as multiplicações, ou seja:

5 + 8 + 9 + 8 + 45 + 48 + 49 + 48 + 0 + 0 + 0 + 2 = 222

Agora devemos dividir o resultado (222) por 11, porém, não vamos usar o resultado da divisão, mas o resto.

Se você quiser obter o resto de qualquer divisão na calculadora, siga os passos abaixo:

  • Faça a divisão normal: 222 / 11 = 20,18181818181818
  • Se o resultado fosse inteiro, a divisão não teria resto. Caso contrário, pegue a parte após a vírgula e multiplique pelo valor que você utilizou para fazer a divisão (nosso caso, 11): 0,18181818181818 * 11 = 1,99999999999998.
  • Arredonde o valor para o número mais próximo. Nosso caso, 2.

Dois (2) é o resto da divisão entre 222 e 11.

Agora temos mais uma verificação simples a fazer: Se o valor do resto da divisão for menor que dois (2), o nosso primeiro dígito se torna zero (0); caso contrário, nosso primeiro dígito será 11 – o resto da divisão anterior.

Para nosso exemplo, temos 11 – 2 = 9, portanto, 9 será o primeiro dígito do nosso CNPJ.

Até agora temos o seguinte CNPJ: 12.345.678/0001-9 (como você pode perceber, fala um dígito).

Segundo cálculo

Para a segunda parte, vamos usar os doze primeiros números do CNPJ, e também o dígito que conseguimos no primeiro cálculo, ou seja:

1234567800019

Como temos mais um dígito, nossa conta mudará um pouco, veja:

1234567800019
x6x5x4x3x2x9x8x7x6x5x4x3x2
610121210545656000318

Agora somamos todas as multiplicações:

6 + 10 + 12 + 12 + 10 + 54 + 56 + 56 + 0 + 0 + 0 + 3 + 18 = 237

Agora é a mesma coisa, devemos dividir o resultado (237) por 11, porém, não vamos usar o resultado da divisão, mas o resto.

Se você quiser obter o resto de qualquer divisão na calculadora, siga os passos abaixo:

  • Faça a divisão normal: 237 / 11 = 21,54545454545455
  • Se o resultado fosse inteiro, a divisão não teria resto. Caso contrário, pegue a parte após a vírgula e multiplique pelo valor que você utilizou para fazer a divisão (nosso caso, 11): 0,54 * 11 = 5,94.
  • Arredonde o valor para o número mais próximo. Nosso caso, 6.

Seis (6) é o resto da divisão entre 237 e 11.

Agora temos mais uma verificação simples a fazer: Se o valor do resto da divisão for menor que dois (2), o nosso primeiro dígito se torna zero (0); caso contrário, nosso primeiro dígito será 11 – o resto da divisão anterior.

Para nosso exemplo, temos 11 – 6 = 5, portanto, 5 será o último dígito do nosso CNPJ.

Até agora temos o seguinte CNPJ: 12.345.678/0001-95, exatamente como o CNPJ que estávamos verificando no início do cálculo.

Isso significa que este é um CNPJ válido.

Como validar CNPJ com PHP

Depois da longa explicação acima, fiz uma função que faz exatamente o que foi descrito:

<?php
/**
 * Valida CNPJ
 *
 * @author Luiz Otávio Miranda <[email protected]/w>
 * @param string $cnpj 
 * @return bool true para CNPJ correto
 *
 */
function valida_cnpj ( $cnpj ) {
    // Deixa o CNPJ com apenas números
    $cnpj = preg_replace( '/[^0-9]/', '', $cnpj );
    
    // Garante que o CNPJ é uma string
    $cnpj = (string)$cnpj;
    
    // O valor original
    $cnpj_original = $cnpj;
    
    // Captura os primeiros 12 números do CNPJ
    $primeiros_numeros_cnpj = substr( $cnpj, 0, 12 );
    
    /**
     * Multiplicação do CNPJ
     *
     * @param string $cnpj Os digitos do CNPJ
     * @param int $posicoes A posição que vai iniciar a regressão
     * @return int O
     *
     */
    if ( ! function_exists('multiplica_cnpj') ) {
        function multiplica_cnpj( $cnpj, $posicao = 5 ) {
            // Variável para o cálculo
            $calculo = 0;
            
            // Laço para percorrer os item do cnpj
            for ( $i = 0; $i < strlen( $cnpj ); $i++ ) {
                // Cálculo mais posição do CNPJ * a posição
                $calculo = $calculo + ( $cnpj[$i] * $posicao );
                
                // Decrementa a posição a cada volta do laço
                $posicao--;
                
                // Se a posição for menor que 2, ela se torna 9
                if ( $posicao < 2 ) {
                    $posicao = 9;
                }
            }
            // Retorna o cálculo
            return $calculo;
        }
    }
    
    // Faz o primeiro cálculo
    $primeiro_calculo = multiplica_cnpj( $primeiros_numeros_cnpj );
    
    // Se o resto da divisão entre o primeiro cálculo e 11 for menor que 2, o primeiro
    // Dígito é zero (0), caso contrário é 11 - o resto da divisão entre o cálculo e 11
    $primeiro_digito = ( $primeiro_calculo % 11 ) < 2 ? 0 :  11 - ( $primeiro_calculo % 11 );
    
    // Concatena o primeiro dígito nos 12 primeiros números do CNPJ
    // Agora temos 13 números aqui
    $primeiros_numeros_cnpj .= $primeiro_digito;
 
    // O segundo cálculo é a mesma coisa do primeiro, porém, começa na posição 6
    $segundo_calculo = multiplica_cnpj( $primeiros_numeros_cnpj, 6 );
    $segundo_digito = ( $segundo_calculo % 11 ) < 2 ? 0 :  11 - ( $segundo_calculo % 11 );
    
    // Concatena o segundo dígito ao CNPJ
    $cnpj = $primeiros_numeros_cnpj . $segundo_digito;
    
    // Verifica se o CNPJ gerado é idêntico ao enviado
    if ( $cnpj === $cnpj_original ) {
        return true;
    }
}

Para utilizá-la, basta fazer o seguinte:

if ( valida_cnpj('12.345.678/0001-95') ) {
	echo "CNPJ correto.";
} else {
	echo "CNPJ inválido.";
}

Download da função

Caso queira baixar o arquivo da função, basta utilizar o link abaixo:

Para utilizá-la, basta descompactar a pasta e incluir a função. Exemplo:

<?php
// Inclui o arquivo com a função
include('valida-cnpj.php');

// Valida um CNPJ
if ( valida_cnpj('12.345.678/0001-95') ) {
	echo "CNPJ correto.";
} else {
	echo "CNPJ inválido.";
}

Espero ter ajudado.