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'));
@ricardofadini

Copy link
Copy Markdown

Nice!

@g1llz

g1llz commented Jan 24, 2018

Copy link
Copy Markdown

Muito bom!

@ftbraian

Copy link
Copy Markdown

VALEW!

@sJonatas

sJonatas commented Mar 1, 2018

Copy link
Copy Markdown

(y)

@apandrade

Copy link
Copy Markdown
// Verifica se todos os digitos são iguais
if (preg_match('/(\d)\1{13}/', $cnpj))
    return false;

@rickslayer

Copy link
Copy Markdown

tks

@smourao

smourao commented Sep 7, 2018

Copy link
Copy Markdown

Muito bom, tnks.

@rodrigoalmeidanet

Copy link
Copy Markdown

Muito bom rapaz... funciona perfeito. Adiciona o complemento do @apandrade que fica perfeito!

@akamus

akamus commented Nov 29, 2018

Copy link
Copy Markdown

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

mateusmrosa commented Dec 16, 2019

Copy link
Copy Markdown

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

Uriel-Alves commented Jun 24, 2020

Copy link
Copy Markdown

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

JesusAdson commented Sep 15, 2023

Copy link
Copy Markdown

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