[php] teste

Viewer

  1. <?php 
  2. $var = '<?php
  3.  
  4. namespace DownloadNFeSefaz;
  5.  
  6. use DOMDocument;
  7. use Exception;
  8.  
  9. /*
  10.  * API Para download de XML da NF-e direto pelo site da secretária da fazenda
  11.  */
  12.  
  13. /**
  14.  * Description of DownloadNFeSefaz
  15.  *
  16.  * @author Edimário Gomes <[email protected]>
  17.  * @license GPL
  18.  */
  19. class DownloadNFeSefaz {
  20.  
  21.     /**
  22.      * CNPJ da empresa emitente 
  23.      * @var String
  24.      */
  25.     private $CNPJ;
  26.  
  27.     /**
  28.      * Pasta onde se encontram os arquivos .pem
  29.      * {CNPJ}_priKEY.pem
  30.      * {CNPJ}_certKEY.pem
  31.      * {CNPJ}_pubKEY.pem
  32.      * do certificado A1 (pasta certs do nfe php)
  33.      * ($this->aConfig[\'pathCertsFiles\'])
  34.      * @var type String
  35.      */
  36.     private $pathCertsFiles;
  37.  
  38.     /**
  39.      * Senha do certificado
  40.      * @var type 
  41.      */
  42.     private $certPass;
  43.  
  44.     public function __construct() {
  45.         error_reporting(E_ERROR | ~E_WARNING);
  46.     }
  47.  
  48.     /**
  49.      * Faz o download da NF-e no site da sefaz usando o certificado digital do cliente
  50.      * @param type $txtCaptcha Captcha fornecedo por getDownloadXMLCaptcha
  51.      * @param type $chNFe Chave de acesso da NF-e
  52.      * @return String XML da NF-e
  53.      */
  54.     public function downloadXmlSefaz($txtCaptcha, $chNFe, $CNPJ, $pathCertsFiles, $certPass) {
  55.  
  56.         ini_set(\'display_errors\', 1);
  57.         ini_set(\'display_startup_errors\', 1);
  58.  
  59.         // TODO: Validar CNPJ
  60.         $this->CNPJ = $CNPJ;
  61.         // TODO: Validar se existe a pasta e os arquivos .pem
  62.         $this->pathCertsFiles = $pathCertsFiles;
  63.         // TODO: Validar senha do certificado
  64.         $this->certPass = $certPass;
  65.  
  66.         // TODO: validar chNFe 44 digitos
  67.  
  68.         /* Verificando se a session já não foi aberta */
  69.         if (session_status() == PHP_SESSION_NONE)
  70.             session_start();
  71.  
  72.         // URL onde a sefaz fornece o botão de download
  73.         $url = "https://www.nfe.fazenda.gov.br/portal/consultaResumoCompletaAntiga.aspx?tipoConteudo=XbSeqxE8pl8=&tipoConsulta=completa";
  74.         // Arquivo de coockie para armazenar a session
  75.         $cookie = sys_get_temp_dir() . DIRECTORY_SEPARATOR . \'cookies1.txt\';
  76.         // Simula um browser pelo curl
  77.         $useragent = \'Mozilla/5.0 (X11; Linux i686) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/13.0.782.99 Safari/535.1\';
  78.  
  79.         /* Start Login process */
  80.         $ch = curl_init($url);
  81.         curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
  82.         curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
  83.         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  84.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  85.         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  86.         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
  87.         curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
  88.         //$verbose = fopen(\'log.txt\', \'w+\');
  89.         //curl_setopt($ch, CURLOPT_STDERR, $verbose);
  90.         //curl_setopt($ch, CURLOPT_VERBOSE, true);
  91.  
  92.         // Collecting all POST fields
  93.         $postfields = array();
  94.         $postfields[\'__EVENTTARGET\'] = "";
  95.         $postfields[\'__EVENTARGUMENT\'] = "";
  96.         $postfields[\'__VIEWSTATE\'] = $_SESSION[\'viewstate\'];
  97.         $postfields[\'__VIEWSTATEGENERATOR\'] = $_SESSION[\'stategen\'];
  98.         $postfields[\'__EVENTVALIDATION\'] = $_SESSION[\'eventValidation\'];
  99.  
  100.         $postfields[\'ctl00$txtPalavraChave\'] = "";
  101.  
  102.         $postfields[\'ctl00$ContentPlaceHolder1$txtChaveAcessoCompleta\'] = $chNFe;
  103.         $postfields[\'ctl00$ContentPlaceHolder1$txtCaptcha\'] = $txtCaptcha;
  104.         $postfields[\'ctl00$ContentPlaceHolder1$btnConsultar\'] = \'Continuar\';
  105.         $postfields[\'ctl00$ContentPlaceHolder1$token\'] = $_SESSION[\'token\'];
  106.         $postfields[\'ctl00$ContentPlaceHolder1$captchaSom\'] = $_SESSION[\'captchaSom\'];
  107.         $postfields[\'hiddenInputToUpdateATBuffer_CommonToolkitScripts\'] = \'1\';
  108.  
  109.         curl_setopt($ch, CURLOPT_POST, 1);
  110.         curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
  111.  
  112.         // Result
  113.         $html = curl_exec($ch);
  114.  
  115.         preg_match(\'~Dados da NF-e~\', $html, $tagTeste);
  116.  
  117.         if (isset($tagTeste[0])) {
  118.             $tagDownload = $tagTeste[0];
  119.         } else {
  120.             throw new Exception(\'Sessão expirada ou captcha inválido, gere um novo captcha e tente novamente.\');
  121.         }
  122.  
  123.         $document = new DOMDocument();
  124.         $document->loadHTML($html);
  125.  
  126.         $viewstate = $document->getElementById(\'__VIEWSTATE\')->getAttribute(\'value\');
  127.         $stategen = $document->getElementById(\'__VIEWSTATEGENERATOR\')->getAttribute(\'value\');
  128.         $eventValidation = $document->getElementById(\'__EVENTVALIDATION\')->getAttribute(\'value\');
  129.  
  130.         curl_close($ch);
  131.         //fclose($verbose);
  132.  
  133.         // Parãmetro teste para saber se a página veio corretamente
  134.         if ($tagDownload == "Dados da NF-e") {
  135.  
  136.             // URL onde a sefaz fornece o download do xml
  137.             $url_download = "https://www.nfe.fazenda.gov.br/portal/consultaCompleta.aspx?tipoConteudo=XbSeqxE8pl8=";
  138.  
  139.             // Verifica se o certificado existe na pasta
  140.             if (!file_exists($this->pathCertsFiles . $this->CNPJ . \'_priKEY.pem\') ||
  141.                     !file_exists($this->pathCertsFiles . $this->CNPJ . \'_priKEY.pem\') ||
  142.                     !file_exists($this->pathCertsFiles . $this->CNPJ . \'_priKEY.pem\')) {
  143.                 throw new Exception(\'Certificado digital não encontrado na pasta: \' . $this->pathCertsFiles . \'!\');
  144.             }
  145.  
  146.             /** Download do xml * */
  147.             $ch_download = curl_init($url_download);
  148.  
  149.             curl_setopt($ch_download, CURLOPT_COOKIEJAR, $cookie);
  150.             curl_setopt($ch_download, CURLOPT_COOKIEFILE, $cookie);
  151.             curl_setopt($ch_download, CURLOPT_FOLLOWLOCATION, true);
  152.             curl_setopt($ch_download, CURLOPT_RETURNTRANSFER, true);
  153.             curl_setopt($ch_download, CURLOPT_SSL_VERIFYPEER, 0);
  154.             curl_setopt($ch_download, CURLOPT_SSL_VERIFYHOST, 0);
  155.             curl_setopt($ch_download, CURLOPT_USERAGENT, $useragent);
  156.             //$verbose = fopen(\'log.txt\', \'w+\');
  157.             //curl_setopt($ch_download, CURLOPT_STDERR, $verbose);
  158.             //curl_setopt($ch_download, CURLOPT_VERBOSE, true);
  159.  
  160.             // this with CURLOPT_SSLKEYPASSWD 
  161.             curl_setopt($ch_download, CURLOPT_SSLKEY, $this->pathCertsFiles . $this->CNPJ . \'_priKEY.pem\');
  162.             // The --cacert option
  163.             curl_setopt($ch_download, CURLOPT_CAINFO, $this->pathCertsFiles . $this->CNPJ . \'_certKEY.pem\');
  164.             // The --cert option
  165.             curl_setopt($ch_download, CURLOPT_SSLCERT, $this->pathCertsFiles . $this->CNPJ . \'_pubKEY.pem\');
  166.             // Cert pass
  167.             curl_setopt($ch_download, CURLOPT_SSLCERTPASSWD, $this->certPass);
  168.  
  169.             // Collecting all POST fields
  170.             $postfields_download = array();
  171.             $postfields_download[\'__EVENTTARGET\'] = "";
  172.             $postfields_download[\'__EVENTARGUMENT\'] = "";
  173.             $postfields_download[\'__VIEWSTATE\'] = $viewstate;
  174.             $postfields_download[\'__VIEWSTATEGENERATOR\'] = $stategen;
  175.             $postfields_download[\'__EVENTVALIDATION\'] = $eventValidation;
  176.             $postfields_download[\'ctl00$txtPalavraChave\'] = \'\';
  177.             $postfields_download[\'ctl00$ContentPlaceHolder1$btnDownload\'] = \'Download do documento*\';
  178.             $postfields_download[\'ctl00$ContentPlaceHolder1$abaSelecionada\'] = \'\';
  179.             $postfields_download[\'hiddenInputToUpdateATBuffer_CommonToolkitScripts\'] = 1;
  180.  
  181.             curl_setopt($ch_download, CURLOPT_POST, 1);
  182.             curl_setopt($ch_download, CURLOPT_POSTFIELDS, $postfields_download);
  183.  
  184.             $response_xml = curl_exec($ch_download);
  185.  
  186.             // Verifica xml
  187.             $doc = simplexml_load_string($response_xml);
  188.  
  189.             if ($doc) {
  190.                 curl_close($ch_download);
  191.                 //fclose($verbose);
  192.                 return $response_xml;
  193.             } else {
  194.                 $document = new DOMDocument();
  195.                 $document->loadHTML($response_xml);
  196.                 $result = $document->getElementById(\'ctl00_ContentPlaceHolder1_lblResultadoConsulta\')->nodeValue;
  197.                 throw new Exception($result);
  198.             }
  199.  
  200.         } else {
  201.             throw new Exception(\'Não foi possível fazer o download do XML, verifique o debug\');
  202.         }
  203.     }
  204.  
  205.     /**
  206.      * Retorna o captcha da sefaz para download do XML
  207.      * no formato base64 (png)
  208.      * @return String base64 png
  209.      */
  210.     public function getDownloadXmlCaptcha() {
  211.  
  212.         /* Verificando se a session já não foi aberta */
  213.         if (session_status() == PHP_SESSION_NONE)
  214.             session_start();
  215.  
  216.         // Passo 1
  217.         $url = "https://www.nfe.fazenda.gov.br/portal/consultaResumoCompletaAntiga.aspx?tipoConteudo=XbSeqxE8pl8=&tipoConsulta=completa";
  218.         $cookie = sys_get_temp_dir() . DIRECTORY_SEPARATOR . \'cookies1.txt\';
  219.         $useragent = \'Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/533.2 (KHTML, like Gecko) Chrome/5.0.342.3 Safari/533.2\';
  220.  
  221.         $ch = curl_init($url);
  222.         curl_setopt($ch, CURLOPT_COOKIEJAR, $cookie);
  223.         curl_setopt($ch, CURLOPT_COOKIEFILE, $cookie);
  224.         curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  225.         curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
  226.         curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
  227.         curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
  228.         curl_setopt($ch, CURLOPT_USERAGENT, $useragent);
  229.         //$verbose = fopen(\'log.txt\', \'w+\');
  230.         //curl_setopt($ch, CURLOPT_STDERR, $verbose);
  231.         //curl_setopt($ch, CURLOPT_VERBOSE, TRUE);
  232.  
  233.         $html = curl_exec($ch);
  234.  
  235.         $document = new DOMDocument();
  236.         $document->loadHTML($html);
  237.  
  238.         $viewstate = $document->getElementById(\'__VIEWSTATE\')->getAttribute(\'value\');
  239.         $stategen = $document->getElementById(\'__VIEWSTATEGENERATOR\')->getAttribute(\'value\');
  240.         $eventValidation = $document->getElementById(\'__EVENTVALIDATION\')->getAttribute(\'value\');
  241.         $token = $document->getElementById(\'ctl00_ContentPlaceHolder1_token\')->getAttribute(\'value\');
  242.         $captchaSom = $document->getElementById(\'ctl00_ContentPlaceHolder1_captchaSom\')->getAttribute(\'value\');
  243.  
  244.         preg_match(\'~<img id=\\"ctl00_ContentPlaceHolder1_imgCaptcha\\" src=\\"(.*)\\" ~\', $html, $_captcha);
  245.  
  246.         $_SESSION[\'viewstate\'] = $viewstate;
  247.         $_SESSION[\'stategen\'] = $stategen;
  248.         $_SESSION[\'eventValidation\'] = $eventValidation;
  249.         $_SESSION[\'token\'] = $token;
  250.         $_SESSION[\'captchaSom\'] = $captchaSom;
  251.  
  252.         $captcha = $_captcha[1];
  253.  
  254.         curl_close($ch);
  255.         //fclose($verbose);
  256.  
  257.         return $captcha;
  258.     }
  259.  
  260. }
  261. ';

Editor

You can edit this paste and save as new:


File Description
  • teste
  • Paste Code
  • 02 Dec-2022
  • 10.68 Kb
You can Share it: