Programação,Tutoriais -
Como Preencher Dados da Empresa pelo CNPJ Dinamicamente (com PHP ou Java)
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.
Download