Skip to content

Instantly share code, notes, and snippets.

@guisehn
Last active April 3, 2024 13:24
Show Gist options
  • Star 90 You must be signed in to star a gist
  • Fork 19 You must be signed in to fork a gist
  • Save guisehn/3276302 to your computer and use it in GitHub Desktop.
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'));
@wesmes
Copy link

wesmes commented Aug 18, 2017

Muito bom! Valeu, obrigado!

@ricardofadini
Copy link

Nice!

@g1llz
Copy link

g1llz commented Jan 24, 2018

Muito bom!

@ftbraian
Copy link

VALEW!

@sJonatas
Copy link

sJonatas commented Mar 1, 2018

(y)

@apandrade
Copy link

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

@rickslayer
Copy link

tks

@smourao
Copy link

smourao commented Sep 7, 2018

Muito bom, tnks.

@rodrigoalmeidanet
Copy link

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

@akamus
Copy link

akamus commented Nov 29, 2018

Valeu galera do bem!

@joaorolim
Copy link

Top! Obrigado!

@rogerpitigliani
Copy link

Valeu!

@rogerionunes
Copy link

Show! Valeu!

@brcontainer
Copy link

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

mateusmrosa commented Dec 16, 2019

funcionou valeu

@luizbills
Copy link

👍

@joefreire
Copy link

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

@luizbills
Copy link

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

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

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

Muito obrigado!

@rodriguesrenato61
Copy link

Obrigado me ajudou muito!

@gitjorginho
Copy link

Muito obrigado, Ajudou demais !

@tiagofrancafernandes
Copy link

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

Obrigado

@LucianoCarbonera
Copy link

Ótimo, Obrigado !!

@douglasisraelbonfim
Copy link

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

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

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

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