Skip to content

Instantly share code, notes, and snippets.

@guisehn
Last active August 28, 2025 11:43
Show Gist options
  • Select an option

  • Save guisehn/3276302 to your computer and use it in GitHub Desktop.

Select an option

Save guisehn/3276302 to your computer and use it in GitHub Desktop.
Validar CNPJ (PHP)
<?php
function validar_cnpj($cnpj)
{
$cnpj = preg_replace('/[^0-9]/', '', (string) $cnpj);
// Valida tamanho
if (strlen($cnpj) != 14)
return false;
// Verifica se todos os digitos são iguais
if (preg_match('/(\d)\1{13}/', $cnpj))
return false;
// Valida primeiro dígito verificador
for ($i = 0, $j = 5, $soma = 0; $i < 12; $i++)
{
$soma += $cnpj[$i] * $j;
$j = ($j == 2) ? 9 : $j - 1;
}
$resto = $soma % 11;
if ($cnpj[12] != ($resto < 2 ? 0 : 11 - $resto))
return false;
// Valida segundo dígito verificador
for ($i = 0, $j = 6, $soma = 0; $i < 13; $i++)
{
$soma += $cnpj[$i] * $j;
$j = ($j == 2) ? 9 : $j - 1;
}
$resto = $soma % 11;
return $cnpj[13] == ($resto < 2 ? 0 : 11 - $resto);
}
var_dump(validar_cnpj('11.444.777/0001-61'));
@akamus
Copy link
Copy Markdown

akamus commented Nov 29, 2018

Valeu galera do bem!

@joaorolim
Copy link
Copy Markdown

Top! Obrigado!

@rogerpitigliani
Copy link
Copy Markdown

Valeu!

@rogerionunes
Copy link
Copy Markdown

Show! Valeu!

@brcontainer
Copy link
Copy Markdown

Muito bom, só faltou invalidar as sequências:

// Lista de CNPJs inválidos
$invalidos = [
	'00000000000000',
	'11111111111111',
	'22222222222222',
	'33333333333333',
	'44444444444444',
	'55555555555555',
	'66666666666666',
	'77777777777777',
	'88888888888888',
	'99999999999999'
];

// Verifica se o CNPJ está na lista de inválidos
if (in_array($cnpj, $invalidos)) {	
	return false;
}

Não precisa, o if (preg_match('/(\d)\1{13}/', $cnpj)) já resolve isto.

@mateusmrosa
Copy link
Copy Markdown

mateusmrosa commented Dec 16, 2019

funcionou valeu

@luizbills
Copy link
Copy Markdown

👍

@joefreire
Copy link
Copy Markdown

Não funciona no php 7.4
Array and string offset access syntax with curly braces is deprecated

@luizbills
Copy link
Copy Markdown

Não funciona no php 7.4
Array and string offset access syntax with curly braces is deprecated

só trocar os curly braces por chaves nas linhas 18, 30 e 36

@Uriel-Alves
Copy link
Copy Markdown

Uriel-Alves commented Jun 24, 2020

Resolvido para PHP 7.4. Testei e estou utilizando o código com a API pagarme. 100% aprovado.

        $cnpj = preg_replace( '/[^0-9]/is', '', $cnpj );
        // Valida primeiro dígito verificador
        for ($i = 0, $j = 5, $soma = 0; $i < 12; $i++)
        {
            $soma += (int)$cnpj[$i] * $j;
            $j = ($j == 2) ? 9 : $j - 1;
        }

        $resto = $soma % 11;

        if ($cnpj[12] != ($resto < 2 ? 0 : 11 - $resto))
            return false;

        // Valida segundo dígito verificador
        for ($i = 0, $j = 6, $soma = 0; $i < 13; $i++)
        {
            $soma += (int)$cnpj[$i] * $j;
            $j = ($j == 2) ? 9 : $j - 1;
        }

        $resto = $soma % 11;

        return $cnpj[13] == ($resto < 2 ? 0 : 11 - $resto);

@srRodolfo
Copy link
Copy Markdown

Olá, tudo bom?
Deixo aqui uma pequena contribuição como forma de agradecimento!

/**
 * Valida CPNJ
 * @param string $document
 * @return bool
 */
function is_cnpj(string $document): bool
{
    // Extrai os números
    $cnpj = preg_replace('/[^0-9]/is', '', $document);

    // Valida tamanho
    if (strlen($cnpj) != 14) {
        return false;
    }

    // Verifica sequência de digitos repetidos. Ex: 11.111.111/111-11
    if (preg_match('/(\d)\1{13}/', $cnpj)) {
        return false;
    }

    // Valida dígitos verificadores
    for ($t = 12; $t < 14; $t++) {
        for ($d = 0, $m = ($t - 7), $i = 0; $i < $t; $i++) {
            $d += $cnpj[$i] * $m;
            $m = ($m == 2 ? 9 : --$m);
        }
        $d = ((10 * $d) % 11) % 10;
        if ($cnpj[$i] != $d) {
            return false;
        }
    }
    return true;
}

@pferreirafabricio
Copy link
Copy Markdown

Muito obrigado!

@rodriguesrenato61
Copy link
Copy Markdown

Obrigado me ajudou muito!

@gitjorginho
Copy link
Copy Markdown

Muito obrigado, Ajudou demais !

@tiagofrancafernandes
Copy link
Copy Markdown

Olá, tudo bom?
Deixo aqui uma pequena contribuição como forma de agradecimento!

/**
 * Valida CPNJ
 * @param string $document
 * @return bool
 */
function is_cnpj(string $document): bool
{
    // Extrai os números
    $cnpj = preg_replace('/[^0-9]/is', '', $document);

    // Valida tamanho
    if (strlen($cnpj) != 14) {
        return false;
    }

    // Verifica sequência de digitos repetidos. Ex: 11.111.111/111-11
    if (preg_match('/(\d)\1{13}/', $cnpj)) {
        return false;
    }

    // Valida dígitos verificadores
    for ($t = 12; $t < 14; $t++) {
        for ($d = 0, $m = ($t - 7), $i = 0; $i < $t; $i++) {
            $d += $cnpj[$i] * $m;
            $m = ($m == 2 ? 9 : --$m);
        }
        $d = ((10 * $d) % 11) % 10;
        if ($cnpj[$i] != $d) {
            return false;
        }
    }
    return true;
}

top tbm

@tiagofrancafernandes
Copy link
Copy Markdown

Obrigado

@LucianoCarbonera
Copy link
Copy Markdown

Ótimo, Obrigado !!

@douglasisraelbonfim
Copy link
Copy Markdown

public static function verificaCnpj(string $cnpj)
{
$url = "https://www.receitaws.com.br/v1/cnpj/" . $cnpj;
$json = file_get_contents($url);
return json_decode($json);
}

@pedroquezado
Copy link
Copy Markdown

public static function verificaCnpj(string $cnpj) { $url = "https://www.receitaws.com.br/v1/cnpj/" . $cnpj; $json = file_get_contents($url); return json_decode($json); }

Show

@JesusAdson
Copy link
Copy Markdown

JesusAdson commented Sep 15, 2023

Contribuindo com a resposta do @douglasisraelbonfim

use Illuminate\Support\Facades\Http;

public static function verificaCnpj(string $cnpj): array
{
$result = Http::get("https://www.receitaws.com.br/v1/cnpj/" . $cnpj);
return $result->json();
}

@institutoiab
Copy link
Copy Markdown

Olá, tudo bom? Deixo aqui uma pequena contribuição como forma de agradecimento!

/**
 * Valida CPNJ
 * @param string $document
 * @return bool
 */
function is_cnpj(string $document): bool
{
    // Extrai os números
    $cnpj = preg_replace('/[^0-9]/is', '', $document);

    // Valida tamanho
    if (strlen($cnpj) != 14) {
        return false;
    }

    // Verifica sequência de digitos repetidos. Ex: 11.111.111/111-11
    if (preg_match('/(\d)\1{13}/', $cnpj)) {
        return false;
    }

    // Valida dígitos verificadores
    for ($t = 12; $t < 14; $t++) {
        for ($d = 0, $m = ($t - 7), $i = 0; $i < $t; $i++) {
            $d += $cnpj[$i] * $m;
            $m = ($m == 2 ? 9 : --$m);
        }
        $d = ((10 * $d) % 11) % 10;
        if ($cnpj[$i] != $d) {
            return false;
        }
    }
    return true;
}

Sensacional, ficou simples, valeu! (gostei como vc resolveu as sequencias inválidas)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment