1. java
  2. android
  3. c#
  4. .net
  5. javascript
  6. php
  7. jquery
  8. html
  9. sql

Erro consulta CNPJ usando CURL - PHP

Prezados(as),

Tenho um script em PHP que adaptei baseado no artigo do <a href="http://goo.gl/Zj9a3P">Mayk Brito</a> que traz o captcha da consulta de CNPJ para dentro do sistema que estou desenvolvendo isso é para facilitar na consulta do dados e ajudar na recuperação do dado na hora de salvar no BD. Estou utilizando o cURL para buscar a imagem do captcha e para passar os dados via post para a pagina da receita porem a consulta não esta funcionando e acredito ser algo relacionado aos cookies que são capturado da pagina e passados no momento em que os dados do captcha e do CNPJ são enviados para consultar o comprovante do CNPJ. Segue o código de exemplo:

<span>Formulário onde é digitado o CNPJ e o Captcha</span>

<?php

class ReceitaForm extends TPage{

    private $form; //formulario
    private $imagem; //imagem do captcha

    /**
     * metodo consturor cria o fomulario com a imagem do captcha
     */
     public function __construct(){
        parent::__construct();

        $this->form =  new TForm('receita_form');
        $table = new TTable;
        $this->form->add($table);

        $letras = new TEntry('letras');
        $cnpj = new TEntry('cnpj');

        //Esta função retorna a imagem do captcha
        $img = $this->recebeImagem("http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/captcha/gerarCaptcha.asp", "receita.gif");
        $imagem =  new TImage($img);

        $row0 = $table->addRow();
        $row0->addCell(new TLabel('CNPJ: '));
        $row0->addCell($cnpj);

        $row1 = $table->addRow();
        $row1->addCell(' ');
        $row1->addCell($imagem);

        $row2 = $table->addRow();
        $row2->addCell(' ');
        $row2->addCell(new TLabel('Digite os caracteres acima no campo abaixo: '));

        $row3 = $table->addRow();
        $row3->addCell(' ');
        $row3->addCell($letras);

        // cria um botão de ação para o formulário
        $button1=new TButton('action1');

        // define a ação do botão
        $button1->setAction(new TAction(array($this, 'buscaReceita')), 'Buscar');

        $button2 = new TButton('Action2');
        $button2->setAction(new TAction(array($this, 'onClear')), 'Limpar');

        $row3 = $table->addRow();
        $row3->addCell($button1);
        $row3->addCell($button2);

        $this->form->setFields(array($cnpj, $letras, $button1, $button2));

        parent::add($this->form);
     }

    /** 
     *     Nesta função iremos baixar a imagem do captcha
     *     Parametro $url: Coloque a url que o captcha usa para reproduzir a imagem
     *     Parametro $arquivo: 
     *  Coloque o arquivo para salvar a imagem. 
     *  IMPORTANTE que o arquivo já exista e tenha permissão CHMOD 777
     */
    function recebeImagem($url, $arquivo) {

      $cookie = $_SERVER['DOCUMENT_ROOT'].'/fortrade/app.control/rand/receita.txt'; //Importantissimo que o caminho esteja correto e com permissão CHMOD 777

      echo $cookie;

      $ch = curl_init ();

      curl_setopt_array($ch, array(
        CURLOPT_URL => $url, //url que produz a imagem do captcha.
        CURLOPT_COOKIEFILE => $cookie, //esse mais o debaixo fazem a mágica do captcha
        CURLOPT_COOKIEJAR => $cookie,  //esse mais o de cima fazem a mágica do.. ah já falei isso;
        CURLOPT_FOLLOWLOCATION => 1, //não sei, mas funciona :D
        CURLOPT_RETURNTRANSFER => 1, //retorna o conteúdo.
        CURLOPT_BINARYTRANSFER => 1, //essa tranferencia é binária.
        CURLOPT_HEADER => 0, //não imprime o header.
      ));    

      $data = curl_exec($ch);

      curl_close ($ch);

      //salva a imagem
      $fp = fopen($arquivo,'w');
      fwrite($fp, $data);
      fclose($fp);

      //retorna a imagem
      return $arquivo;
    }

    public function buscaReceita(){
        $receitaResponde = new ReceitaResponde;
    }

}

<span>Script que passa o CNPJ e o Captcha para pagina da receita e retorna o comprovante</span>

<?php
class ReceitaResponde extends TPage{

    public function __construct(){
        //executa a função que passa os paramentros CNPJ e CPF para site da receita
        $this->getComprovante();
    }

    public function getComprovante(){
        // Pega os valores dos campos que foram enviados pelo formulário
        // *sem validação mesmo, é só pra exemplo tá?
        $cnpj = $_POST['cnpj'];
        $letras = $_POST['letras'];

        #Coisas importantes para dizer ao $ch logo mais
        //IMPORTANTE que o caminho esteja correto e tenha permissão CHMOD 777
        $cookie = $_SERVER['DOCUMENT_ROOT'].'/fortrade/app.control/rand/receita.txt'; 

        // não sei.. coloquei pra garantir
        $reffer = "http://google.com"; 

        //sempre é bom ter para garantir a entrada do seu serviço
        $agent = "Mozilla/5.0 (Windows; U; Windows NT 5.0; en-US; rv:1.4) Gecko/20030624 Netscape/7.1 (ax)"; 

        //url da receita que valida o formulário
        $url ="http://www.receita.fazenda.gov.br/PessoaJuridica/CNPJ/cnpjreva/valida.asp"; 

        //dados do POST do formulário da receita. 
        //** Muito importante entender os formulários que você esteja trabalhando **
        //os campos NESTA EXATA ordem funcionaram legal ;)
        $post_fields = "origem=comprovante&cnpj={$cnpj}&txtTexto_captcha_serpro_gov_br={$letras}&submit1=Consultar&search_type=cnpj";  

        //agora sim.. 1, 2, 3 VALENDO! 
        $ch = curl_init();

        curl_setopt_array($ch, array(
          CURLOPT_URL => $url, //sem isso, seu cURL é imprestável
          CURLOPT_POST => 1, //afirmo que ele irá fazer um POST
          CURLOPT_POSTFIELDS => $post_fields, //quais são os campos que estarei enviando ao valida.asp?
          CURLOPT_USERAGENT => $agent, //ahh é importante sempre ter né =D
          CURLOPT_REFERER => $reffer, //não sei.. coloquei pra garantir
          CURLOPT_COOKIEFILE => $cookie, //lembra dos cookies que guardamos qndo digitamos o captcha? 
          CURLOPT_COOKIEJAR => $cookie,  //então, precisamos deles :)
          CURLOPT_FOLLOWLOCATION => 1, // não quero explicar, mas é importante. pesquisa ae depois ;)
          CURLOPT_RETURNTRANSFER => 1, // quer ver os dados? então sempre ative esta opção no seu script
          CURLOPT_HEADER => 0, // sem header
        ));

        $result = curl_exec($ch);

        curl_close($ch);

        //Se deu algum erro, a Receita mostra a mesma página do formulario do captcha
        //Vamos descobrir se é a mesma página do formulário do captcha e redirecionar para a nossa página.
        if (preg_match("/<title>Emiss.*<\/title>/siU", $result)) {
          //Então volta pro nosso formulário para preenchimento dos dados.
          //Estava com preguiça de pensar algo mais útil, então fiz esse só de exemplo mesmo.
          new ReceitaForm();
          return;
        }

        print $result;    

         /*$arq = $_SERVER['DOCUMENT_ROOT'].'/app.control/rand/comprovante.html';
        echo $arq;

        //salva o documento
          $fp = fopen($arq,'w');
          fwrite($fp, $result);
          fclose($fp); 
        */

    }
 }

Desde já grato pela atenção de todos. :-)

  1. Você vai ver essas setas em qualquer página de pergunta. Com elas, você pode dizer se uma pergunta ou uma resposta foram relevantes ou não.
  2. Edite sua pergunta ou resposta caso queira alterar ou adicionar detalhes.
  3. Caso haja alguma dúvida sobre a pergunta, adicione um comentário. O espaço de respostas deve ser utilizado apenas para responder a pergunta.
  4. Se o autor da pergunta marcar uma resposta como solucionada, esta marca aparecerá.
  5. Clique aqui para mais detalhes sobre o funcionamento do GUJ!

1 resposta

Não é a resposta que estava procurando? Procure outras perguntas com as tags php post cookies ou faça a sua própria pergunta.