Seguindo este tutorial http://www.gigasystems.com.br/artigo/88/consultar-cnpj-pela-receita-federal-com-php consegui retornar valor de índice específico que preciso e atribui à uma variável sem problemas.
Quando implemento na minha aplicação, faço do mesmo modo mas simplesmente não funciona. O valor não é repassado pra variável. Pode ser por causa das funções que tenho pra session da minha aplicação?
form:
<form action="reg.php" method="post" enctype="multipart/form-data"> <label>Empresa (nome fantasia)</label> <input type="text" name="casa" required /> <label>CNPJ (somente números)</label> <input type="text" name="cnpj" maxlength="19" onblur='clearTimeout()' required /> <img id="captcha" src="includes/getcaptcha.php" border="0"/><br> <a id="reload" style="color:#06C;">Atualizar imagem</a> <script> $('#reload').click(function(){ //$('#captcha').attr('src', 'includes/getcaptcha.php'); só funciona no chrome $("#captcha").attr("src", "includes/getcaptcha.php?"+(new Date()).getTime()); }); </script> <input type="text" name="captcha" maxlength="6" required style="width:150px;" placeholder="letras minúsculas" /> <input type="submit" name="Enviar" value="Enviar" class="button" /> </form>
reg.php resumido (pretendo atribuir o nome fantasia da empresa à $nome_fant, mas não está atribuindo, fica vazia)
<?php include_once 'includes/db_connect.php'; include_once 'includes/functions.php'; sec_session_start(); ?> <body> <?php if (login_check($mysqli) == true) : ?> <?php if(isset($_SESSION['username'])){ $username = $_SESSION['username']; $members_username = "SELECT username FROM members WHERE username = '$username' "; $result = $mysqli->query($members_username); if($result->num_rows > 0){ while($row = $result->fetch_assoc()){ $user = $row['username']; }}} $casa = $_POST['casa']; echo "casa: ".$casa; require('includes/funcoes.php'); $cnpj = $_POST['cnpj']; // cnpj do form somente números $captcha = $_POST['captcha']; // pega html resposta da receita $getHtmlCNPJ = getHtmlCNPJ($cnpj, $captcha); if($getHtmlCNPJ) { // coloca os dados em um array $campos = parseHtmlCNPJ($getHtmlCNPJ); var_dump($campos); $nome_fant = $campos[3]; } echo "fantasia: ".$nome_fant; if(!$resultado['status'] = 'OK'){ die("status nao funciona"); } if(!$situacao == $_POST['ATIVA']){ die("situaçao nao ativa"); } if($nome_fant != $casa){ die("nome da casa nao bate"); } if($resultado['status'] = 'OK' && $situacao == $_POST['ATIVA'] && $nome_fant == $casa){ if ($insert_stmt = $mysqli->prepare("INSERT INTO profiles (usuario, nome, sobrenome, telefone, cel_wts, rua, numero, bairro, cidade, estado, pais, casa, cnpj, cargo, cpf) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)")) { $insert_stmt->bind_param('ssssssssssssiss', $user, $nome, $sobrenome, $telefone, $cel_wts, $rua, $numero, $bairro, $cidade, $estado, $pais, $casa, $cnpj, $cargo, $cpf); if (! $insert_stmt->execute()) { echo "Algo saiu errado. Tente novamente."; echo "<script>setTimeout(function(){ window.location.href='profiles.php'; }, 5000);</script>"; }else{ echo '<div class="register_success">'; echo "Dados atualizados..."; echo '<img src="images/equalizer.GIF" width="256" height="70" alt="equalizer"/>'; echo "<script>setTimeout(function(){ window.location.href='delay_page.php'; }, 3000);</script>"; echo '</div>'; } } }else{ echo '<div class="register_success">'; echo "Há algo de errado com a validação do seu CNPJ. Tente novamente."; echo "<script>setTimeout(function(){ window.location.href='profile.php'; }, 3000);</script>"; echo '</div>'; } ?> <?php else : ?> <p> <span class="error">Você não tem autorização para acessar esta página.</span> Please <a href="index.php">login</a>. </p> <?php endif; ?> </body> </html>
funcoes.php
<?php // define caminho absoluto e relativo para arquivo cookie $pasta_cookies = 'cookies_cnpj/'; define('COOKIELOCAL', str_replace('\\', '/', realpath('./')).'/'.$pasta_cookies); define('HTTPCOOKIELOCAL', 'http://'.$_SERVER['SERVER_NAME'].str_replace(pathinfo($_SERVER['SCRIPT_FILENAME'],PATHINFO_BASENAME),'',$_SERVER['SCRIPT_NAME']).$pasta_cookies); // inicia sessão @session_start(); // função para pegar o que interessa function pega_o_que_interessa($inicio,$fim,$total) { $interesse = str_replace($inicio,'',str_replace(strstr(strstr($total,$inicio),$fim),'',strstr($total,$inicio))); return($interesse); } // função para pegar a resposta html da consulta pelo CPF na página da receita function getHtmlCNPJ($cnpj, $captcha) { $cookieFile = COOKIELOCAL.session_id(); $cookieFile_fopen = HTTPCOOKIELOCAL.session_id(); if(!file_exists($cookieFile)) { return false; } else { // pega os dados de sessão gerados na visualização do captcha dentro do cookie $file = fopen($cookieFile_fopen, 'r'); while (!feof($file)) {$conteudo = fread($file, 1024);} fclose ($file); $explodir = explode(chr(9),$conteudo); $sessionName = trim($explodir[count($explodir)-2]); $sessionId = trim($explodir[count($explodir)-1]); // constroe o parâmetro de sessão que será passado no próximo curl $cookie = $sessionName.'='.$sessionId.';flag=1'; } // dados que serão submetidos a consulta por post $post = array ( 'submit1' => 'Consultar', 'origem' => 'comprovante', 'cnpj' => $cnpj, 'txtTexto_captcha_serpro_gov_br'=> $captcha, 'search_type' => 'cnpj' ); $post = http_build_query($post, NULL, '&'); $ch = curl_init('http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/valida.asp'); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $post); // aqui estão os campos de formulário curl_setopt($ch, CURLOPT_COOKIEFILE, $cookieFile); // dados do arquivo de cookie curl_setopt($ch, CURLOPT_COOKIEJAR, $cookieFile); // dados do arquivo de cookie curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:8.0) Gecko/20100101 Firefox/8.0'); curl_setopt($ch, CURLOPT_COOKIE, $cookie); // dados de sessão e flag=1 curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); curl_setopt($ch, CURLOPT_MAXREDIRS, 3); curl_setopt($ch, CURLOPT_REFERER, 'http://www.receita.fazenda.gov.br/pessoajuridica/cnpj/cnpjreva/Cnpjreva_Solicitacao2.asp'); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); $html = curl_exec($ch); curl_close($ch); return $html; } // Função para extrair o que interessa da HTML e colocar em array function parseHtmlCNPJ($html) { // respostas que interessam $campos = array( 'NÚMERO DE INSCRIÇÃO', // 0 'DATA DE ABERTURA', // 1 'NOME EMPRESARIAL', // 2 'TÍTULO DO ESTABELECIMENTO (NOME DE FANTASIA)', // 3 'CÓDIGO E DESCRIÇÃO DA ATIVIDADE ECONÔMICA PRINCIPAL', // 4 'CÓDIGO E DESCRIÇÃO DAS ATIVIDADES ECONÔMICAS SECUNDÁRIAS', // 5 'CÓDIGO E DESCRIÇÃO DA NATUREZA JURÍDICA', // 6 'LOGRADOURO', // 7 'NÚMERO', // 8 'COMPLEMENTO', // 9 'CEP', // 10 'BAIRRO/DISTRITO', // 11 'MUNICÍPIO', // 12 'UF', // 13 'ENDEREÇO ELETRÔNICO', // 14 'TELEFONE', // 15 'ENTE FEDERATIVO RESPONSÁVEL (EFR)', // 16 'SITUAÇÃO CADASTRAL', // 17 'DATA DA SITUAÇÃO CADASTRAL', // 18 'MOTIVO DE SITUAÇÃO CADASTRAL', // 19 'SITUAÇÃO ESPECIAL', // 20 'DATA DA SITUAÇÃO ESPECIAL'); // 21 // caracteres que devem ser eliminados da resposta $caract_especiais = array( chr(9), chr(10), chr(13), ' ', '</b>', ' ', '<b>MATRIZ<br>', '<b>FILIAL<br>' ); // prepara a resposta para extrair os dados $html = str_replace('<br><b>','<b>',str_replace($caract_especiais,'',strip_tags($html,'<b><br>'))); $html3 = $html; // faz a extração for($i=0;$i<count($campos);$i++) { $html2 = strstr($html,utf8_decode($campos[$i])); $resultado[] = trim(pega_o_que_interessa(utf8_decode($campos[$i]).'<b>','<br>',$html2)); $html=$html2; } // extrai os CNAEs secundarios , quando forem mais de um if(strstr($resultado[5],'<b>')) { $cnae_secundarios = explode('<b>',$resultado[5]); $resultado[5] = $cnae_secundarios; unset($cnae_secundarios); } // devolve STATUS da consulta correto if(!$resultado[0]) { if(strstr($html3,utf8_decode('O número do CNPJ não é válido'))) {$resultado['status'] = 'CNPJ incorreto ou não existe';} else {$resultado['status'] = 'Imagem digitada incorretamente';} } else {$resultado['status'] = 'OK';} return $resultado; } ?>
arquivo functions.php que faz a session da minha aplicação:
<?php include_once 'psl-config.php'; function sec_session_start() { $session_name = 'sec_session_id'; // Estabeleça um nome personalizado para a sessão $secure = SECURE; // Isso impede que o JavaScript possa acessar a identificação da sessão. $httponly = true; // Assim você força a sessão a usar apenas cookies. if (ini_set('session.use_only_cookies', 1) === FALSE) { header("Location: ../error.php?err=Could not initiate a safe session (ini_set)"); exit(); } // Obtém params de cookies atualizados. $cookieParams = session_get_cookie_params(); session_set_cookie_params($cookieParams["lifetime"], $cookieParams["path"], $cookieParams["domain"], $secure, $httponly); // Estabelece o nome fornecido acima como o nome da sessão. session_name($session_name); session_start(); // Inicia a sessão PHP session_regenerate_id(); // Recupera a sessão e deleta a anterior. } function login($email, $password, $mysqli) { // Usando definições pré-estabelecidas significa que a injeção de SQL (um tipo de ataque) não é possível. if ($stmt = $mysqli->prepare("SELECT id, username, password, salt FROM members WHERE email = ? LIMIT 1")) { $stmt->bind_param('s', $email); // Relaciona "$email" ao parâmetro. $stmt->execute(); // Executa a tarefa estabelecida. $stmt->store_result(); // obtém variáveis a partir dos resultados. $stmt->bind_result($user_id, $username, $db_password, $salt); $stmt->fetch(); // faz o hash da senha com um salt excusivo. $password = hash('sha512', $password . $salt); if ($stmt->num_rows == 1) { // Caso o usuário exista, conferimos se a conta está bloqueada // devido ao limite de tentativas de login ter sido ultrapassado if (checkbrute($user_id, $mysqli) == true) { // A conta está bloqueada // Envia um email ao usuário informando que a conta está bloqueada return false; } else { // Verifica se a senha confere com o que consta no banco de dados // a senha do usuário é enviada. if ($db_password == $password) { // A senha está correta! // Obtém o string usuário-agente do usuário. $user_browser = $_SERVER['HTTP_USER_AGENT']; // proteção XSS conforme imprimimos este valor $user_id = preg_replace("/[^0-9]+/", "", $user_id); $_SESSION['user_id'] = $user_id; // proteção XSS conforme imprimimos este valor $username = preg_replace("/[^a-zA-Z0-9_\-]+/", "", $username); $_SESSION['username'] = $username; $_SESSION['login_string'] = hash('sha512', $password . $user_browser); // Login concluído com sucesso. return true; } else { // A senha não está correta // Registramos essa tentativa no banco de dados $now = date('Y-m-d H:m:s'); $mysqli->query("INSERT INTO login_attempts(user_id, time) VALUES ('$user_id', '$now')"); return false; } } } else { // Tal usuário não existe. return false; } } } function checkbrute($user_id, $mysqli) { // Registra a hora atual $now = time(); // Todas as tentativas de login são contadas dentro do intervalo das últimas 2 horas. $valid_attempts = $now - (2 * 60 * 60); if ($stmt = $mysqli->prepare("SELECT time FROM login_attempts <code><pre> WHERE user_id = ? AND time > '$valid_attempts'")) { $stmt->bind_param('i', $user_id); // Executa a tarefa pré-estabelecida. $stmt->execute(); $stmt->store_result(); // Se houve mais do que 5 tentativas fracassadas de login if ($stmt->num_rows > 5) { return true; } else { return false; } } } function login_check($mysqli) { // Verifica se todas as variáveis das sessões foram definidas if (isset($_SESSION['user_id'], $_SESSION['username'], $_SESSION['login_string'])) { $user_id = $_SESSION['user_id']; $login_string = $_SESSION['login_string']; $username = $_SESSION['username']; // Pega a string do usuário. $user_browser = $_SERVER['HTTP_USER_AGENT']; if ($stmt = $mysqli->prepare("SELECT password FROM members WHERE id = ? LIMIT 1")) { // Atribui "$user_id" ao parâmetro. $stmt->bind_param('i', $user_id); $stmt->execute(); // Execute the prepared query. $stmt->store_result(); if ($stmt->num_rows == 1) { // Caso o usuário exista, pega variáveis a partir do resultado. $stmt->bind_result($password); $stmt->fetch(); $login_check = hash('sha512', $password . $user_browser); if ($login_check == $login_string) { // Logado!!! return true; } else { // Não foi logado return false; } } else { // Não foi logado return false; } } else { // Não foi logado return false; } } else { // Não foi logado return false; } } function esc_url($url) { if ('' == $url) { return $url; } $url = preg_replace('|[^a-z0-9-~+_.?#=!&;,/:%@$\|*\'()\\x80-\\xff]|i', '', $url); $strip = array('%0d', '%0a', '%0D', '%0A'); $url = (string) $url; $count = 1; while ($count) { $url = str_replace($strip, '', $url, $count); } $url = str_replace(';//', '://', $url); $url = htmlentities($url); $url = str_replace('&', '&', $url); $url = str_replace("'", ''', $url); if ($url[0] !== '/') { // Estamos interessados somente em links relacionados provenientes de $_SERVER['PHP_SELF'] return ''; } else { return $url; } } ?>