Como Preencher Dados da Empresa pelo CNPJ Dinamicamente (com PHP ou Java)

logo da receita federal para representar o post

Dentro do design de interação, a automação de dados é importante para agilizar cadastros, além de garantir uma maior segurança dessas informações. Preencher dinamicamente o máximo de campos possível é sempre uma opção interessante para otimizar processos e manter um ambiente ágil.

Uma das formas mais utilizadas é o preenchimento automático de endereço a partir do CEP (clique aqui, caso queira saber como fazer). Porém, uma outra alternativa muito interessante, e sempre procurada, é o preenchimento dinâmico dos dados de uma empresa a partir do CNPJ.

Para isso, há uma API pública bem interessante de uma organização chamada ReceitaWS, que é uma empresa destinada a fornecer dados de pessoas jurídicas a partir da Receita Federal. Sua API pública é bem funcional e garante uma quantidade enorme de CNPJs atualizados. O ReceitaWS também possui uma API comercial para quem precisa de dados mais refinados e precisos.

Obs. Só deixando claro que isto NÃO é um anúncio.

Conectando com o ReceitaWS

A API do ReceitaWS aconselha o acesso via cURL. Falando de forma simples, é como se o servidor fizesse o acesso a um site como se fosse um navegador. Por questões de segurança e para impedir o acúmulo de processos, muitas APIs bloqueiam o acesso direto. Por isso a comunicação não pode ser feita apenas com a URL.

Apesar de ser possível fazer acesso cURL em praticamente qualquer linguagem, vamos usar PHP (atualização: ou Java) no nosso exemplo, por você poder usar em praticamente qualquer hospedagem.

Esse acesso deverá ser feito para a URL: https://www.receitaws.com.br/v1/cnpj/[cnpj], onde [cnpj] corresponde ao número do CNPJ que você irá consultar.

Para iniciar, devemos criar um arquivo onde vai ser carregado os dados e impresso o retorno.

cnpj.php

É extremamente importante que o nosso arquivo possua um cabeçalho que imprima como text/plain. Isso porque teremos uma resposta em jSon e passar este cabeçalho irá garantir a leitura correta dos dados.

header("Content-Type: text/plain");

Em seguida, devemos capturar o CNPJ enviado pela requisição e guardar em uma variável.

$cnpj = $_REQUEST["cnpj"];

Agora começa a parte interessante. Iremos usar o método cURL do PHP para poder acessar a URL e passar o CNPJ. Leias os comentários para entender seu funcionamento.

$ch = curl_init(); //Inicializa
curl_setopt($ch, CURLOPT_URL, "https://www.receitaws.com.br/v1/cnpj/".$cnpj); //Acessa a URL
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //Permite a captura do Retorno
$retorno = curl_exec($ch); //Executa o cURL e guarda o Retorno em uma variável
curl_close($ch); //Encerra a conexão

Por fim, devemos terminar com a impressão do retorno.
Para o retorno poder ser lido de forma simples, mesmo que por um humano, iremos usar o JSON_PRETTY_PRINT. Para isso, temos que converter a String de retorno usando o método Json Decode, em seguida imprimindo o resultado com o JSON_PRETTY_PRINT.

$retorno = json_decode($retorno); //Ajuda a ser lido mais rapidamente
echo json_encode($retorno, JSON_PRETTY_PRINT);

O código completo ficará:

<?php
//Garantir que seja lido sem problemas
header("Content-Type: text/plain");

//Capturar CNPJ
$cnpj = $_REQUEST["cnpj"];

//Criando Comunicação cURL
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, "https://www.receitaws.com.br/v1/cnpj/".$cnpj);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
//curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); //Descomente esta linha apenas se você não usar HTTPS, ou se estiver testando localmente
$retorno = curl_exec($ch);
curl_close($ch);

$retorno = json_decode($retorno); //Ajuda a ser lido mais rapidamente
echo json_encode($retorno, JSON_PRETTY_PRINT);

?>

Se quiser testar, basta acessar o seu arquivo php pelo navegador, por exemplo:
seusite.com/pasta/cnpj.php?cnpj=XXXXXXXXXXXXX

Atualização (Java):

Você também pode fazer com Java. O exemplo abaixo é uma forma bem simples de fazer.

<%@ page contentType="text/plain; charset=utf-8" language="java" errorPage="" %>
<%@page import="java.io.*"%>
<%@page import="java.net.URL"%>
<%
URL url = new URL("https://www.receitaws.com.br/v1/cnpj/"+request.getParameter("cnpj"));
try (BufferedReader reader = new BufferedReader(new InputStreamReader(url.openStream(), "UTF-8"))) {
 for (String line; (line = reader.readLine()) != null;) {
 out.println(line);
 }
}
%>

Evitando acessos externos

Por segurança, precisamos evitar que outros sites acessem o nosso json. Isso para evitar que o servidor caia devido a diversas requisições de fontes desconhecidas. A forma mais simples de fazer isso, e compatível com praticamente qualquer hospedagem / servidor, é através do arquivo .htaccess.

Na mesma pasta onde foi criado o arquiv cnpj.php deve ser criado um arquivo chamado:

.htaccess

Nesse arquivo deve conter as seguintes informações:

#Evitar Acesso Externo
Order Deny,Allow
Deny from all
Allow from 127. #localhost

Basicamente, o que está sendo dito é que nenhum servidor pode acessar o conteúdo desta pasta, exceto o localhost (127.0.0.1). Caso você queira adicionar mais algum IP autorizado, basta adicionar o IP ou domínio do endereço que deseja.

ATENÇÃO: Caso você seja usuário Cloudflare, adicone os seguintes IPs em sua lista de permissões do .htaccess:

Allow from 199.27.128.0/21
Allow from 173.245.48.0/20
Allow from 103.21.244.0/22
Allow from 103.22.200.0/22
Allow from 103.31.4.0/22
Allow from 141.101.64.0/18
Allow from 108.162.192.0/18
Allow from 190.93.240.0/20
Allow from 188.114.96.0/20
Allow from 197.234.240.0/22
Allow from 198.41.128.0/17
Allow from 162.158.0.0/15
Allow from 104.16.0.0/12
Allow from 172.64.0.0/13

Atualização (Java):

Caso você use o Java, a forma de configurar as permissões de acesso irá variar de acordo com o servidor que você utilizar.

Caso você utilize o Tomcat, você deve utilizar o CORS para fazer esse controle de permissão.

Para isso, edite o arquivo web.xml, e procure pelo filtro do CORS. O bloco deverá ficar algo semelhante ao código abaixo, segundo a mesma lógica do exemplo acima, do PHP:

<filter>
    <filter-name>CORS</filter-name>
    <filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
    <init-param>
     <param-name>cors.allowOrigin</param-name>
        <param-value>127.0.0.1</param-value>
    </init-param>
    <init-param>
     <param-name>cors.supportedMethods</param-name>
        <param-value>GET, POST, HEAD, PUT, DELETE</param-value>
    </init-param>
    <init-param>
       <param-name>cors.supportedHeaders</param-name>
       <param-value>Accept, Origin, X-Requested-With, Content-Type, Last-Modified</param-value>
    </init-param>
    <init-param>
        <param-name>cors.exposedHeaders</param-name>
        <param-value>Set-Cookie</param-value>
    </init-param>
    <init-param>
        <param-name>cors.supportsCredentials</param-name>
        <param-value>true</param-value>
    </init-param>
</filter>

OBS. O uso do CORS pode dar problemas com clientes que façam acesso por cliente sem DNS, ou seja, com acesso que não é feito por conexão http ou https, como por exemplo,
o Cordova/Phonegap. Nesse caso, aconselha-se simplesmente não usar o CORS, ou editar a bibliotca.

Enviando o CNPJ e Imprimindo os Dados da Empresa

Já para imprimir os dados e ler o json de retorno, precisamos usar um formulário HTML e um pouco de Javascript. Para poder facilitar a compreensão, usaremos o bom e velho jQuery, já explicado em conteúdos anteriores.

A primeira coisa é criar o formulário que devemos usar.

form.html

<!--Importando Script Jquery-->
<script type="text/javascript" src="https://code.jquery.com/jquery-3.2.1.min.js"></script>

<!--Formulário-->
<form id="post">
  <label for="cnpj">CNPJ</label>
  <input id="cnpj" required type="text">
  <br/>
  <label for="nome">Razão Social</label>
  <input id="nome" type="text">
  <br/>
  <label for="fantasia">Nome Fantasia</label>
  <input id="fantasia" type="text">
  <br/>
  <label for="atividade">Atividade Principal</label>
  <input id="atividade" type="text">
  <br/>
  <label for="telefone">Telefone</label>
  <input id="telefone" required type="text">
  <br/>
  <label for="email">E-mail</label>
  <input id="email" type="text">
  <br/>
  <label for="cep">CEP</label>
  <input id="cep" type="text">
  <br/>
  <label for="logradouro">Logradouro</label>
  <input id="logradouro" type="text">
  <br/>
  <label for="numero">Número</label>
  <input id="numero" type="text">
  <br/>
  <label for="complemento">Complemento</label>
  <input id="complemento" type="text">
  <br/>
  <label for="bairro">Bairro</label>
  <input id="bairro" type="text">
  <br/>
  <label for="uf">Estado</label>
  <select id="uf">
    <option value="AC">Acre</option>
    <option value="AL">Alagoas</option>
    <option value="AP">Amapá</option>
    <option value="AM">Amazonas</option>
    <option value="BA">Bahia</option>
    <option value="CE">Ceará</option>
    <option value="DF">Distrito Federal</option>
    <option value="ES">Espírito Santo</option>
    <option value="GO">Goiás</option>
    <option value="MA">Maranhão</option>
    <option value="MT">Mato Grosso</option>
    <option value="MS">Mato Grosso do Sul</option>
    <option value="MG">Minas Gerais</option>
    <option value="PA">Pará</option>
    <option value="PB">Paraíba</option>
    <option value="PR">Paraná</option>
    <option value="PE">Pernambuco</option>
    <option value="PI">Piauí</option>
    <option value="RJ">Rio de Janeiro</option>
    <option value="RN">Rio Grande do Norte</option>
    <option value="RS">Rio Grande do Sul</option>
    <option value="RO">Rondônia</option>
    <option value="RR">Roraima</option>
    <option value="SC">Santa Catarina</option>
    <option value="SP">São Paulo</option>
    <option value="SE">Sergipe</option>
    <option value="TO">Tocantins</option>
  </select>
</form>

Como iremos aplicar a consulta após o usuário deixar o campo CNPJ, deveremos adicionar a chamada no focusout do CNPJ, ficando

<script type="text/javascript">
	$("#cnpj").focusout(function(){
	//Aqui vai o código		
	});
</script>

Agora é bem simples. Basta usarmos o método Ajax, que já utilizamos em tutoriais anteriores para fazermos conexões. O código abaixo possui diversos comentários para facilitar o entendimento de cada bloco.

<script type="text/javascript">
	$("#cnpj").focusout(function(){
		//Início do Comando AJAX
		$.ajax({
			//O campo URL diz o caminho de onde virá os dados
			//É importante concatenar o valor digitado no CNPJ
			url: '/pasta/cnpj.php?cnpj='+$("#cnpj").val(),
//Atualização: caso use java, use cnpj.jsp, usando o outro exemplo.
			//Aqui você deve preencher o tipo de dados que será lido,
			//no caso, estamos lendo JSON.
			dataType: 'json',
			//SUCESS é referente a função que será executada caso
			//ele consiga ler a fonte de dados com sucesso.
			//O parâmetro dentro da função se refere ao nome da variável
			//que você vai dar para ler esse objeto.
			success: function(resposta){
				//Confere se houve erro e o imprime
				if(resposta.status == "ERROR"){
					alert(resposta.message + "\nPor favor, digite os dados manualmente.");
					$("#post #nome").focus().select();
					return false;
				}
				//Agora basta definir os valores que você deseja preencher
				//automaticamente nos campos acima.
				$("#post #nome").val(resposta.nome);
				$("#post #fantasia").val(resposta.fantasia);
				$("#post #atividade").val(resposta.atividade_principal[0].text + " (" + resposta.atividade_principal[0].code + ")");
				$("#post #telefone").val(resposta.telefone);
				$("#post #email").val(resposta.email);
				$("#post #logradouro").val(resposta.logradouro);
				$("#post #complemento").val(resposta.complemento);
				$("#post #bairro").val(resposta.bairro);
				$("#post #cidade").val(resposta.municipio);
				$("#post #uf").val(resposta.uf);
				$("#post #cep").val(resposta.cep);
				$("#post #numero").val(resposta.numero);
			}
		});
	});
</script>

Que tal agora testarmos o funcionamento?

Digite um CNPJ (apenas números) no campo CNPJ abaixo e depois saia dele (focusout), clicando em outro campo ou pressionando a tecla TAB de seu teclado.














 

 

Baixe o exemplo no GitHub:
Download
É mais fácil do que parece, não é? Aproveite para compartilhar isso com seus amigos que estão estudando ou que essa informação possa ser útil 👍. Aproveite e deixe um like na nova página da Velhobit, no Facebook.

 

Comentários

17 respostas para “Como Preencher Dados da Empresa pelo CNPJ Dinamicamente (com PHP ou Java)”

  1. Avatar de GalanBR
    GalanBR

    Ola Rodrigo, achei excelente o post, porem testei aqui e os selectores que usou pra mim não funcionou, tive que remover os seletores adicional que usou para retorno nos campos do form, $(“#post #nome”) , removi de todos o seletor #post das respostas… Vlw.

    1. Avatar de Portillo Rodrigo

      Desculpe, foi um erro meu mesmo. O #post eu uso em meu exemplo local e esqueci de remover. Obrigado pelo aviso.

  2. Avatar de edu Villas
    edu Villas

    Muito bom cara … espetacular.
    Faltou a cidade mas ta facil

    1. Avatar de Portillo Rodrigo

      Não entendi. Faltou a cidade?

      1. Avatar de edu Villas
        edu Villas

        Não tem no form a Cidade. Consulte la pra ver: 54374525000116. A cidade é Piracicaba

        1. Avatar de Portillo Rodrigo

          Existe sim, mas não estava no formulário que eu deixei acima, mas estava no código. Explore o WebService e verifique todos os dados que ele retorna, pois são bem mais do que estão no formulário.

  3. Avatar de Samuca Samuca
    Samuca Samuca

    Excelente trabalho, estou usando o Netbeans porem não funcionou alguém poderia me ajudar? eu tirei o #post e /pasta/
    obrigado

    1. Avatar de Portillo Rodrigo

      Você precisa verificar qual foi o erro, pois podem ser vários. Se você colocou o caminho correto pode ser permissão ou o json não está imprimindo direito.

      Para testar o PHP, coloque no começo do seu código:
      ini_set(‘display_errors’, 1);
      ini_set(‘display_startup_errors’, 1);
      error_reporting(E_ALL);

      … e teste diretamente pela URL.

      Se estiver OK, abra o console no seu navegador (Ferramentas de Desenvolvedor).

      Quando há um erro no Javascript, o console acusa o erro. Lembre-se de que caso você esteja em servidores diferentes, deverá permitir acesso externo via .htaccess ou pelo header.

      1. Avatar de Samuca Samuca
        Samuca Samuca

        Boa noite muito obrigado por responder:
        Apareceu “null”
        e no console do navegador:

        A codificação de caracteres do documento de texto sem formatação não foi declarada. O documento será exibido com texto corrompido em algumas configurações de navegadores se o documento contiver caracteres fora da faixa US-ASCII. A codificação de caracteres do arquivo deve ser declarada no protocolo de transferência ou o arquivo precisa usar uma indicação da ordem de bytes (BOM) como uma assinatura da codificação.

        cnpj.php

        estou acessando 127.0.0.1

        Muito agradecido

  4. Avatar de Samuca Samuca
    Samuca Samuca

    o navegador retornou erro “Erro interno no Servidor” Error 500

    1. Avatar de Portillo Rodrigo

      Erro 500 usualmente ocorre quando há um erro no código fonte ou erro de permissão de pasta. Verifique se não há algo errado no seu código e depois as permissões de pasta.

      Se você estiver acessando externamente, verifique o CORS ou o .htaccess para liberar o acesso externo.

      1. Avatar de Samuca Samuca
        Samuca Samuca

        Agora funcionou, o problema estava no servidor, porem agora meu form.html não funciona e o console não mostra nenhum erro… obrigado

  5. Avatar de Augusto
    Augusto

    Localmente funcionou certinho, porém em produção(on) não funciona retorna como null :/ , alguma ideia do que pode ser?

  6. Avatar de Samuca Samuca
    Samuca Samuca

    Bom dia a todos, verifiquei no console o possível erro “http/1.1 304 not modified”

    1. Avatar de Portillo Rodrigo

      Aparentemente você está colocando errado o valor da URL.

  7. Avatar de Matheus Mota
    Matheus Mota

    Boa dia, o cnpj está retornando nulo na variável $cnpj . Poderia deixa o download? já verifiquei o código e não achei o erro

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *