Soap 1.2 + NFe 2.0

448 views
Skip to first unread message

Evantoni Fuchs

unread,
Nov 2, 2010, 5:36:58 PM11/2/10
to phpav...@googlegroups.com
Buenas pessoal!!!

Me Ajudem!!!

Estou com uma grande dificuldade implementando a NF-e 2.0...
O XML que meu programa gera, esta tudo certinho conforme o manual de integração 4.01-NT2009.006

O grande problema é com o SOAP...

Na versão da NF-e 1.10 usavamos a classe NuSoap e estava tudo em paz.
Agora ao implementar a NF-e 2.0, descobri que só funciona com a versao Soap 1.2
O problema é que a classe NuSoap não tem suporte a versao 1.2 (Nusoap suporta apenas versao 1.1)

Entao comecei os testes com a classe Soap Nativa do PHP que tem suporte a versão 1.2
A versão do PHP que estou usando é 5.3.2-1

Segue parte do meu código, acredito que seja o bastante para entender o que estou fazendo....

                $wsdl="NfeStatusServico";
                $URL = "https://homologacao.nfe.sefaz.rs.gov.br/ws/NfeStatusServico/NfeStatusServico2.asmx";
                $xURL = "https://homologacao.nfe.sefaz.rs.gov.br/ws/NfeStatusServico/NfeStatusServico2.asmx?WSDL";
                $param['nfeCabecMsg']='<cabecmsg versao="1.02" xmlns="http://www.portalfiscal.inf.br/nfe"><versaodados>2.00</versaodados></cabecmsg>';
                $param['nfeDadosMsg']='<consstatserv xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" versao="2.00" xmlns="http://www.portalfiscal.inf.br/nfe"><tpamb>2</tpamb><cuf>43</cuf><xserv>STATUS</xserv></consstatserv>';

                $client = new SoapClient(null, array (
                    'location'      => "$xURL",
                    'uri'           => "$URL",
                    'encoding'      => "utf-8",
                    'verifypeer'    => false,
                    'verifyhost'    => false,
                    'soap_version'  => SOAP_1_2,
                    'trace'         => true,
                    'exceptions'    => false,
                    'local_cert'    => "/var/www/hardness_v200/dados_usuarios/e003/nfe/certs/2.pem",
                    'style'         => SOAP_DOCUMENT,
                    'use'           => SOAP_LITERAL,
                    'passphrase'    => $this->passKey)
                );
                

                //-- CABEÇALHO
                $headers = array();
                $var_cabec = new SoapVar($param['nfeCabecMsg'], XSD_ANYXML);
               
                $header = new SOAPHeader($URL, 'nfeCabecMsg', $var_cabec);
                              
                $client->__setSoapHeaders($header);

                // MENSAGEM E REQUISIÇÃO
                $params = array('any' => $param['nfeDadosMsg']);
               
                 $xmlresp = $client->__soapCall($wsdl, array('parameters' => $params));
               
                $result = $xmlresp->any;

                echo "<pre>";              
                echo $xmlresp;
                echo "</pre>";

A variavel $result retorna vazia e a variavel $xmlresp retorna isso:

SoapFault exception: [HTTP] Forbidden in /var/www/hardness_v200/class/nfe_ext.class.php:2288
Stack trace:
#0 [internal function]: SoapClient->__doRequest('__soapCall('NfeStatusServic...', Array)
#2 /var/www/hardness_v200/class/nfe_ext.class.php(2348): classeNFeExt->sendSOAP(Array, 'NfeStatusServic...')
#3 /var/www/hardness_v200/almoxarifado/enviar_xml.php(190): classeNFeExt->statusServico()
#4 {main}  

Bem, Eu estou a 2 semanas trabalhando e pesquisando sobre webservices e ja fiz testes de tudo um pouco.
Não sei se estou no caminho correto, por favor, me dêem uma luz.

Obrigado.


Evantoni Fuchs



Evantoni Fuchs

unread,
Nov 2, 2010, 5:37:24 PM11/2/10
to phpav...@googlegroups.com

Walber da silva sales

unread,
Nov 2, 2010, 10:15:58 PM11/2/10
to phpav...@googlegroups.com
Olá Pessoal,


       Vamos montar um grupo de trabalho para migrar da 1.10 para 2.0?
       Podemos nos reunir fisicamente em algum hotel.
       Se algum candidato se oferecer a ser o mestre, poderia  'descolar' a estadia, transporte  e valor cuso hora.
       O que acham?

      Pré-requisito: XML NFE  2.0
      

      Att:

     Walber Sales





--
Você recebeu esta mensagem porque está inscrito no Google Groups "PHP Avançado".
Para postar nesse grupo, envie e-mail phpav...@googlegroups.com
Para cancelar a sua inscrição neste grupo, envie um e-mail para phpavancado...@googlegroups.com
Para mais opções, visitem este grupo em http://groups.google.com.br/group/phpavancado
Tudo sobre php: http://www.phpavancado.net/
Documentação PHP: www.php.net

Lucas R. A. Carvalho

unread,
Nov 3, 2010, 9:09:51 AM11/3/10
to phpav...@googlegroups.com

Aproveitando a deixa Evantoni, como você esta fazendo para assinar o arquivo XML  com o PHP ?

Evantoni Fuchs

unread,
Nov 3, 2010, 9:59:30 PM11/3/10
to phpav...@googlegroups.com
Rapaz....
"Eu quero te ajudar! Mas agora você tem que me ajudar a te ajudar. ..."

Brincadeira...

Quando eu estava desenvolvendo a nota fiscal no ano passado, encontrei o seguinte metodo na internet:


    public function assinaPHPNF($nfe, $tagid='infCanc',$taginicio='cancNFe', $outDir=''){
            //carrega as chaves do certifciado p12
            $key = file_get_contents($this->pathCert);
            $resp = openssl_pkcs12_read ($key,$x509certdata,$this->passKey);
            $rPrivkey = openssl_pkey_get_private($x509certdata['pkey']);
            $rPubkey =  openssl_pkey_get_public($x509certdata['cert']);

            $certX509= '';
            $data = '';
            $arCert = explode("\n", $x509certdata['cert']);
            foreach ($arCert AS $curData) {
                if (strncmp($curData, '-----BEGIN CERTIFICATE', 22) != 0 && strncmp($curData, '-----END CERTIFICATE', 20) != 0 ) {
                    $data .= trim($curData);
                }
            }
            // certificado que sera incluso no xml
            $certX509 = $data;

            // limpeza do xml com a retirada dos CR e LF
            $order = array("\r\n", "\n", "\r");
            $replace = '';
            $nfe = str_replace($order, $replace, $nfe);
            // carrega o documento no DOM
            $xmldoc = new DOMDocument();
            $xmldoc->preservWhiteSpace = FALSE; //elimina espaços em branco
            $xmldoc->formatOutput = FALSE;
            // muito importante deixar ativadas as opçoes para limpar os espacos em branco
            // e as tags vazias

            $xmldoc->loadXML("$nfe",LIBXML_NOBLANKS | LIBXML_NOEMPTYTAG);

            //extrair a tag com os dados a serem assinados
            $infNFe = $xmldoc->getElementsByTagName($tagid)->item(0);
            $id = trim($infNFe->getAttribute("Id"));
            $outname = $this->getPastaArquivoXML().'assinado/'.$id.'.xml';
            //extrai os dados da tag para uma string
            $dados = $infNFe->C14N(FALSE,FALSE,NULL,NULL);
            //calcular o hash dos dados
            $hashValue = hash('sha1',$dados,TRUE);
            //converte o valor para base64 para serem colocados no xml
            $digValue = base64_encode($hashValue);
            //monta a tag da assinatura digital
            $templsign = '<Signature xmlns="'.$this->URLdsig.'"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" /><Reference URI="#'.$id.'"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /><Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" /><DigestValue>'.$digValue.'</DigestValue></Reference></SignedInfo><SignatureValue></SignatureValue><KeyInfo><X509Data><X509Certificate>'.$certX509.'</X509Certificate></X509Data></KeyInfo></Signature>';
            //salva o xml normalizado
            $nfe = $xmldoc->saveXML();
            //remove a tag de fechamento final da NFe </NFe>
            $nfe = str_replace("</$taginicio>","",$nfe);
            //acrescenta o template da assinatura
            $nfe = $nfe . $templsign."</$taginicio>";

            // limpa algumas variaveis da memoria
            unset($xmldoc);
            unset($dados);
            unset($hashValue);
            unset($digValue);
            unset($id);
            unset($infNFe);
            unset($order);
            unset($replace);
            unset($templsign);
            unset($data);

            //carrega novamente o DOM com a NFe
            $xmldoc = new DOMDocument();
            $xmldoc->preservWhiteSpace = FALSE; //elimina espaços em branco
            $xmldoc->formatOutput = FALSE;

            $xmldoc->loadXML($nfe,LIBXML_NOBLANKS | LIBXML_NOEMPTYTAG);
            //obtem a tag com as informaçoes da assinatura
            // esta informaçoes e que serao assinadas
            $SignedInfo = $xmldoc->getElementsByTagName('SignedInfo')->item(0);
            // extrai os dados a serem assinados para uma string
            $dados = $SignedInfo->C14N(FALSE,FALSE,NULL,NULL);
            $signature = '';
            //executa a assinatura digital usando o resource da chave privada
            $resp = openssl_sign($dados,$signature,$rPrivkey);
            //codifica assinatura para o padrao base64
            $signatureValue = base64_encode($signature);
            $SignValue = $xmldoc->getElementsByTagName('SignatureValue')->item(0);
            $SignValue->nodeValue = $signatureValue;
            $nfe = $xmldoc->saveXML();

            //se for passado parametro de destino salvar o xml como arquvo
            $ret = $xmldoc->save($outname);
            return $nfe;
    }

Isso resolveu meus problemas com assinatura.
Mais hoje estou com o problema do SOAP para resolver, se puder me ajudar, fico agradecido.

Evantoni Fuchs

Gilmar de Paula

unread,
Nov 10, 2010, 2:35:15 PM11/10/10
to PHP Avançado
Boa tarde a todos,

Realmente o nusoap, mesmo na versao atual (0.9.5) nao da suporte ao
Soap 1.2...
Utilizo a classe NFeTools, adaptei para minhas necessidades...
Na versao da NFe 2.0, vou ter de modificar a classe para usar o Soap
nativo do PHP.

Talvez o amigo "Roberto Leite Machado" possa nos ajudar aqui.
Na versao atual do NFeTools vc ja alterou para usar o Soap nativo do
PHP ?

Grato,
Gilmar de Paula Fiocca
Reply all
Reply to author
Forward
0 new messages