Consultar CNPJ na receita federal via CURL (2017)

Estou tentando consultar cnpj pela receita federal mas não to conseguindo. Seguindo alguns tutoriais tenho o seguinte:

receita.php
<?php
ini_set(‘display_errors’, 1);
ini_set(‘display_startup_erros’, 1);
error_reporting(E_ALL);

function recebe_imagem($url, $arquivo) {
    $cookie = 'receita.txt'; 

    $ch = curl_init();

    curl_setopt_array($ch, array(
        CURLOPT_URL => $url, //url que produz a imagem do captcha.
        CURLOPT_COOKIE => 1,
        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;
}

$img = recebe_imagem("http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/captcha/gerarCaptcha.asp", "receita.gif");

print "<img src='{$img}' />" .
        '<form action="receita_respond.php" method="POST">
         captcha
         <input size="8" maxlength="9" name="idLetra">
         cnpj
         <input size="16" maxlength="14" name="cnpj">
         <input type="submit">
      </form>';
?>

receita_respond.php
<?php

ini_set('display_errors', 1);
ini_set('display_startup_erros', 1);
error_reporting(E_ALL);

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

#Coisas importantes para dizer ao $ch logo mais
//IMPORTANTE que o caminho esteja correto e tenha permissão CHMOD 777
$cookie = 'receita.txt';

// não sei.. coloquei pra garantir
$reffer = "http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/Cnpjreva_Solicitacao2.asp?cnpj=";

//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}&idSom=&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_COOKIE => 1,
    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.
  $host  = $_SERVER['HTTP_HOST'];
  $uri   = rtrim(dirname($_SERVER['PHP_SELF']), '/\\');
  $extra = 'receita.php';
  header("Location: http://meusite.com.br/cnpj/receita.php");
  return;
  } */

print $result . '0';
?>

Não está funcionando, provavelmente é algum erro bobo, ou eu que não entendo o suficiente mesmo. De qualquer forma agradeço a resposta de vocês :slight_smile:

Qual é o CURL gerado desse código?
Executou no Postman ou qualquer outro cliente pra testar?

Só um detalhe que vi no comentário do seu código

//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 :wink:
$post_fields = “origem=comprovante&cnpj={$cnpj}&txtTexto_captcha_serpro_gov_br={$letras}&idSom=&submit1=Consultar&search_type=cnpj”;

QueryParams não têm ordem a serem executadas, então não precisam ser exatamente nessa ordem, como diz o comentário

Bom dia, Igor.

O resultado: https://goo.gl/Qe0u9u

Se quiser ver a página: https://goo.gl/0aKp0C

Testei direto acessando a página que te passei aqui em cima. Pode testar.

To achando que o problema está no cookie. Mas n sei oq pode estar errado.

Ninguém faz menor ideia?
Dá uma ajuda aí gente…

Na verdade não é que ninguem sabe como fazer. Mas você tem que ajudar. Minha ultima resposta foi pedindo o CURL gerado, pra ver se tá gerando certo ou não, e vc não passou. Apenas passou o link de algo que pouco importa.

@igor_ks, achei que o CURL gerado fosse o resultado da execução do CURL. Aí mandei o print do echo dele.

Como eu pego o CURL gerado?

Amigo
utilize meu código para consultas de CNPJ e CPF na receita federal, esta atualizado e funcionando 100%
https://github.com/Massa191/Consultas_CNPJ_CPF_Receita_Federal

Abraço
Marcos Peli

Marcos, estou tendo problema de conexão usando o seu código para obter o captcha do cpf. O curl no getcapcha.php retorna um erro dizendo que não conseguiu identificar um protocolo, acredito que isto esta acontecendo porque o www.receita.fazenda.gov.br alterou a raiz do certificado e esta dando certificado inválido.
O acesso ao captcha do cnpj funciona sem problema porque a url nao esta com problema de certificado.
Você está tendo este problema? Alguma ideia de como resolvê-lo?
Um abraço,

Esta funcionando normal
sem nenhum problema

Olá. para quem precisar, tenho webservice para resolver automaticamente os captchas da receita/nfe;
Outros: consulta de cnpj, cpf (sem data de nascimento), sintegra, xml nfe.
Contato: powersistemasautomacao@gmail.com

@powersistemaautomac, não precisa ficar reabrindo tópicos sem o intuito de ajudar. Se você quer fazer uma divulgação, abre um tópico novo e diz que criou uma API. Isso facilita tanto pra você, tanto pra quem estiver participando do fórum…

Ok amigo :wink:

1 curtida