nfephp-org / sped-nfe

API para geração e comunicação das NFe com as SEFAZ autorizadoras
Other
1.22k stars 536 forks source link

Os documentos se referem a diferentes objetos. Os digest são diferentes. #686

Closed Cassiano86 closed 5 years ago

Cassiano86 commented 5 years ago

Olá, gostaria primeiramente de parabenizar o projeto do sped-nfe, estou trabalhando em uma empresa e fiquei responsável pela implementação da nota fiscal, li várias etapas da documentação e cheguei (acredito eu) a 5° etapa para a emissão da NFe, que no caso se resume ao protocolo.

Já gostaria de adiantar as etapas que obtive sucesso que foram:

Porém não consigo obter sucesso com a protocolagem, estou utilizando o Complements::toAuthorize($xml_assinado, $recibo). Eu procurei bastante conteúdo que me desse suporte neste erro, porém não encontrei nada satisfatório.

Os digestValue e digVal retornam valores diferentes e eu não entendo porque, se puderem me ajudar agradeceria muito pelo tempo que estão disponibilizando para mim.

rabraga commented 5 years ago

Boa tarde!

Depois de enviar para a SEFAZ, provavelmente você está alterando o XML, o que não é permitido e causa a diferença entre digestValue e digVal.

Para dúvidas utilize o https://groups.google.com/forum/#!forum/nfephp.

------ Mensagem original ------ De: "cassiano86" notifications@github.com<mailto:notifications@github.com> Para: "nfephp-org/sped-nfe" sped-nfe@noreply.github.com<mailto:sped-nfe@noreply.github.com> Cc: "Subscribed" subscribed@noreply.github.com<mailto:subscribed@noreply.github.com> Enviado(s): 25/06/2019 14:52:14 Assunto: [nfephp-org/sped-nfe] Os documentos se referem a diferentes objetos. Os digest são diferentes. (#686)

Olá, gostaria primeiramente de parabenizar o projeto do sped-nfe, estou trabalhando em uma empresa e fiquei responsável pela implementação da nota fiscal, li várias etapas da documentação e cheguei (acredito eu) a 5° etapa para a emissão da NFe, que no caso se resume ao protocolo.

Já gostaria de adiantar as etapas que obtive sucesso que foram:

Porém não consigo obter sucesso com a protocolagem, estou utilizando o Complements::toAuthorize($xml_assinado, $recibo). Eu procurei bastante conteúdo que me desse suporte neste erro, porém não encontrei nada satisfatório.

Os digestValue e digVal retornam valores diferentes e eu não entendo porque, se puderem me ajudar agradeceria muito pelo tempo que estão disponibilizando para mim.

— You are receiving this because you are subscribed to this thread. Reply to this email directly, view it on GitHubhttps://github.com/nfephp-org/sped-nfe/issues/686?email_source=notifications&email_token=AD3IAGZ7TWGPGUUZOIC7I6TP4JLM5A5CNFSM4H3KYUVKYY3PNVWWK3TUL52HS4DFUVEXG43VMWVGG33NNVSW45C7NFSM4G3TSQIQ, or mute the threadhttps://github.com/notifications/unsubscribe-auth/AD3IAG6ZF2YM7N252ZQM4C3P4JLM5ANCNFSM4H3KYUVA.

Cassiano86 commented 5 years ago

rabraga, muito obrigado pela atenção, estou trabalhando com o Laravel, esse framework é 100% MVC, agora que você tocou neste ponto eu creio que esse possa ser o problema, quando você diz em enviar seria o recibo ou o XML assinado?

Agradeço desde já.

rabraga commented 5 years ago

você envia o XML assinado e a SEFAZ autoriza. Depois vc altera esse XML e tenta protocolar. Aí dá erro "Os digest são diferentes"

Cassiano86 commented 5 years ago

Entendo, vou trabalhar nesta etapa, obrigado pela ajuda.

Cassiano86 commented 5 years ago

rabraga, eu fiz o procedimento usando o mesmo XML assinado pela SEFAZ e o erro persiste, vou te enviar o código sem os campos de montagem do XML porque não vejo necessidade.

public function geraNFe(){ /Depois de montar todas as tags com stdClass/

        if($nfe->montaNFe()) {
            /*Gerando o arquivo XML*/
            $xml = $nfe->getXML();

            /*Gerando a assinatura*/
            $certificadoDigital=file_get_contents("C:/xampp/htdocs/ERP_REMAN_teste/vendor/nfephp-org/223PRONTAXINDUSTRIAECOMERCIO28062019.pfx");
            $this->tools=new Tools(json_encode($this->config), Certificate::readPfx($certificadoDigital, "**Ocultei a senha rabraga**"));
            try{
                $xml_assinado = $this->tools->signNFe($xml);                
            }catch(Exception $e) {
                exit($e->getMessage());
            }

            /*Gerando o envio do lote*/             
            try{
                $contingency = '{
                    "motive":"SEFAZ fora do AR",
                    "timestamp":1484747583,
                    "type":"SVCAN",
                    "tpEmis":6
                }';

                $idLote = str_pad(100, 15, '0', STR_PAD_LEFT);
                $indSinc = 0; //usar método assincrono preferencial !! Evite usar não funciona em todos os estados
                $compactar = false; //Evite usar não funciona em todos os estados
                $retxmls = []; //nessa variável serão retornados os XML já ajustados para mode de contingência

                $this->tools->contingency->load($contingency);

                /*Nesta etapa o lote está sendo enviado com sucesso, se retornar 103 é porque está tudo ok*/
                $resp = $this->tools->sefazEnviaLote([$xml_assinado],$idLote, $indSinc, $compactar, $retxmls);

                $st = new Standardize();
                $std = $st->toStd($resp);

                if ($std->cStat != 103) {
                    //erro registrar e voltar
                    return "[$std->cStat] $std->xMotivo";
                }

                $recibo = $std->infRec->nRec;
            }catch(Exception $e){
                echo str_replace("\n", "<br/>", $e->getMessage());
            }//esse recibo deve ser guardado para a próxima operação que é a consulta do recibo
            //NOTA: se o xml foi enviado em contingência a consulta do recibo também deverá ser feita nesse mesmo modo.

            /*Consultando o recibo*/
            $protocolo = $this->tools->sefazConsultaRecibo($recibo);

            /*Protocolando a nota*/

            $request  = $xml_assinado;
            $response = $protocolo;

            try{
                $protocol = new Complements();
                $xml = $protocol->toAuthorize($request, $response);
                header('Content-type: text/xml; charset=UTF-8');
                return $xml;
                /*file_put_contents('nota.xml',$xmlProtocolado);*/
            }catch(Exception $e) {
                echo "Erro: " . $e->getMessage();
            }

        } else {
            throw new Exception("ERRO AO GERAR NFE");

        }
    }
Cassiano86 commented 5 years ago

Com o retorno do protocolo eu passo para o Controller do Laravel desta forma bem simples.

$nfe_service = new NFEService([ "atualizacao"=>"2015-10-02 06:01:21", "tpAmb"=>2, "razaosocial"=>"PRONTAX INDUSTRIA E COMERCIO LTDA-ME", "siglaUF"=>"SP","cnpj"=>"27401351000160", "schemes"=>"PL_009_V4", "versao"=>"4.00", "tokenIBPT"=>"AAAAAAA", "CSC"=>"GPB0JBWLUR6HWFTVEAS6RJ69GPCROFPBBB8G", "CSCid"=>"000002"]);

    header('Content-Type: application/xml; charset=utf-8');

    //Gera o XML
    $xml=$nfe_service->geraNFe();
    echo $xml;
Cassiano86 commented 5 years ago

Agradeço a sua ajuda como sempre.

Cassiano86 commented 5 years ago

Erro sanado, estou encerrando o tópico.

vinidotdev commented 4 years ago

@cassiano86 como você resolveu o problema?

joaoroyosilva commented 4 years ago

o xml depois de assinado não pode mais ser alterado. O protocolo tem que ser adicionado nele usando a classe complements

thiagohenriqueslima commented 4 years ago

Estou passando pelo mesmo problema, o que difere é que o erro não é constante. Às vezes consigo emitir a nota, outras vezes é apresentado o erro "Os documentos se referem a diferentes objetos. Os digest são diferentes.".

Não estou alterando o XML depois de assinado. Para exemplificar, deixo abaixo o trecho do meu código onde o erro acontece (mas nem sempre)

try {
            $this->obterDadosNotaFiscal();
            $xml = $this->nfe->monta();

            $erros = $this->nfe->getErrors();

            if (count($erros) > 0) {
                throw new Exception(implode("@*@", $erros));
            }

            $config = $this->obterConfiguracao();
            $certificadoDigital = file_get_contents($this->emitente->certificado);

            $tools = new Tools($config, Certificate::readPfx($certificadoDigital, $this->emitente->senhacertificado));
            $xmlAssinado = $tools->signNFe($xml);

            $idLote = str_pad($this->dadosNotaFiscal->id, 15, '0', STR_PAD_LEFT);
            $resp = $tools->sefazEnviaLote([$xmlAssinado], $idLote);

            $st = new Standardize();
            $std = $st->toStd($resp);

            if ($std->cStat != 103) {
                return "[$std->cStat] $std->xMotivo";
            }

            $recibo = $std->infRec->nRec;
            $protocolo = $tools->seFazConsultaRecibo($recibo);
            $xmlProtocolado = Complements::toAuthorize($xmlAssinado, $protocolo);

            $this->salvarXml($xmlProtocolado);
}

Alguma ideia do que pode estar acontecendo?

Cassiano86 commented 4 years ago

Olá Thiago, desculpe pela demora em lhe responder, O SEFAZ do Rio Grande do Sul tem um validador de XML para nota fiscal, esse erro que acontecia era algo genérico, no meu caso as vezes era relacionado aos dados do cliente e outras pela assinatura digital ou a validade do certificado digital. Vou lhe deixar o endereço do validador e meu contato caso precise, é importante fazer uma varredura na função MontaNFE(), ela ajuda bastante em alguns casos.

Validador : https://www.sefaz.rs.gov.br/NFE/NFE-VAL.aspx

Meu Contato : (12) 99139-4899


De: Thiago Lima notifications@github.com Enviado: segunda-feira, 3 de agosto de 2020 21:51 Para: nfephp-org/sped-nfe sped-nfe@noreply.github.com Cc: cassiano86 cassiano_tst@hotmail.com; Mention mention@noreply.github.com Assunto: Re: [nfephp-org/sped-nfe] Os documentos se referem a diferentes objetos. Os digest são diferentes. (#686)

Estou passando pelo mesmo problema, o que difere é que o erro não é constante. Às vezes consigo emitir a nota, outras vezes é apresentado o erro "Os documentos se referem a diferentes objetos. Os digest são diferentes.".

Não estou alterando o XML depois de assinado. Para exemplificar, deixo abaixo o trecho do meu código onde o erro acontece (mas nem sempre)

try {

        $this->obterDadosNotaFiscal();

        $xml = $this->nfe->monta();

        $erros = $this->nfe->getErrors();

        if (count($erros) > 0) {

            throw new Exception(implode("@*@", $erros));

        }

        $config = $this->obterConfiguracao();

        $certificadoDigital = file_get_contents($this->emitente->certificado);

        $tools = new Tools($config, Certificate::readPfx($certificadoDigital, $this->emitente->senhacertificado));

        $xmlAssinado = $tools->signNFe($xml);

        $idLote = str_pad($this->dadosNotaFiscal->id, 15, '0', STR_PAD_LEFT);

        $resp = $tools->sefazEnviaLote([$xmlAssinado], $idLote);

        $st = new Standardize();

        $std = $st->toStd($resp);

        if ($std->cStat != 103) {

            return "[$std->cStat] $std->xMotivo";

        }

        $recibo = $std->infRec->nRec;

        $protocolo = $tools->seFazConsultaRecibo($recibo);

        $xmlProtocolado = Complements::toAuthorize($xmlAssinado, $protocolo);

        $this->salvarXml($xmlProtocolado);

}

Alguma ideia do que pode estar acontecendo?

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHubhttps://github.com/nfephp-org/sped-nfe/issues/686#issuecomment-668295364, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AFJXYU65QLZBM6GNIDOFCVDR65EOTANCNFSM4H3KYUVA.

thiagohenriqueslima commented 4 years ago

Obrigado pelo retorno @cassiano86!

Não acho que o erro esteja relacionado aos dados do cliente ou certificado, por que como eu disse, o erro acontece esporadicamente. Por exemplo, as vezes tento emitir uma nota para um cliente, ocorre o erro uma, duas ou até mais vezes consecutivas, e sem alterar dado nenhum, após nova tentativa a nota é emitida. Tem casos também em que a nota é emitida de primeira.

Vou debugar o método mencionado pra vê se encontro alguma coisa que esteja ocasionando esse erro, qualquer descoberta eu documentado aqui. Obrigado mais uma vez pelo feedback e disposição.

Cassiano86 commented 4 years ago

Se quiser eu posso enviar meu código, as notas estão sendo geradas de primeira e só acontece erros mais grotescos quando falta informação dos clientes.

Qualquer outro erro que ela possa gerar eu pego as exceções e gero arquivos para saber qual é o erro encontrado, a dica que eu te dei sobre o validador do Rio Grande do Sul é uma boa alternativa para saber desses erros primários que estão acontecendo em sua emissão.

O meu código está em laravel e estou tentando melhora-lo cada dia mais, não sei se vai conseguir entender, não que eu esteja duvidando de sua capacidade, longe disso, é que ele está meio complicado mesmo.


De: Thiago Lima notifications@github.com Enviado: sexta-feira, 4 de setembro de 2020 11:27 Para: nfephp-org/sped-nfe sped-nfe@noreply.github.com Cc: cassiano86 cassiano_tst@hotmail.com; Mention mention@noreply.github.com Assunto: Re: [nfephp-org/sped-nfe] Os documentos se referem a diferentes objetos. Os digest são diferentes. (#686)

Obrigado pelo retorno @cassiano86https://github.com/cassiano86!

Não acho que o erro esteja relacionado aos dados do cliente ou certificado, por que como eu disse, o erro acontece esporadicamente. Por exemplo, as vezes tento emitir uma nota para um cliente, ocorre o erro uma, duas ou até mais vezes consecutivas, e sem alterar dado nenhum, após nova tentativa a nota é emitida. Tem casos também em que a nota é emitida de primeira.

Vou debugar o método mencionado pra vê se encontro alguma coisa que esteja ocasionando esse erro, qualquer descoberta eu documentado aqui. Obrigado mais uma vez pelo feedback e disposição.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHubhttps://github.com/nfephp-org/sped-nfe/issues/686#issuecomment-687144910, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AFJXYU4VCFOTIVEYL7ACO5DSEDTNHANCNFSM4H3KYUVA.

thiagohenriqueslima commented 4 years ago

Imagina @cassiano86, entendi perfeitamente a sua colocação, e sim, adoraria receber o seu código para análise, também estou desenvolvendo a minha aplicação em Laravel. O meu e-mail é thiagohenriqueslima@gmail.com

O validador do RS eu já o conhecia, me ajudou muito no início do desenvolvimento, de fato é uma excelente alternativa para tratar esses erros primários.

Mais uma vez, muito obrigado pela ajuda e por disponibilizar o seu código.

Cassiano86 commented 4 years ago

Beleza, estou fazendo melhorias hoje, se tudo der certo até semana que vem eu te envio.


De: Thiago Lima notifications@github.com Enviado: sexta-feira, 4 de setembro de 2020 13:59 Para: nfephp-org/sped-nfe sped-nfe@noreply.github.com Cc: cassiano86 cassiano_tst@hotmail.com; Mention mention@noreply.github.com Assunto: Re: [nfephp-org/sped-nfe] Os documentos se referem a diferentes objetos. Os digest são diferentes. (#686)

Imagina @cassiano86https://github.com/cassiano86, entendi perfeitamente a sua colocação, e sim, adoraria receber o seu código para análise, também estou desenvolvendo a minha aplicação em Laravel. O meu e-mail é thiagohenriqueslima@gmail.commailto:thiagohenriqueslima@gmail.com

O validador do RS eu já o conhecia, me ajudou muito no início do desenvolvimento, de fato é uma excelente alternativa para tratar esses erros primários.

Mais uma vez, muito obrigado pela ajuda e por disponibilizar o seu código.

— You are receiving this because you were mentioned. Reply to this email directly, view it on GitHubhttps://github.com/nfephp-org/sped-nfe/issues/686#issuecomment-687237992, or unsubscribehttps://github.com/notifications/unsubscribe-auth/AFJXYU6F2Q2AJSLIFGFY67DSEEFEJANCNFSM4H3KYUVA.

rafaelFelixAfonso commented 3 years ago

Olá amigos olha eu sei que não é a melhor solução mais eu consegui resolver isso da seguinte forma :

try{

$xml = Complements::toAuthorize($xmlAssinado, $protocolo);

$filename = "../".$linha_patch3['caminho']."{$chave}-nfce.xml"; 

}catch (\Exception $e){

$erro = $e->getMessage();

if($erro == "Os documentos se referem a diferentes objetos. Os digest são diferentes."){

}else{

$_SESSION['msg'] = "

"; $s = "UPDATE lote_nf SET sta = 1 WHERE id_lote = '$nomejson'"; $query = mysqli_query($conn, $s); header("Location: ../cad_venda.php?id_ped=$id_pedido"); exit(); } colocando um if ai e tratando esse erro infelizmente fica uma "gambiarra" mais é oque eu consegui fazer aqui pra solucionar pois infelizmente vai ficar retornando mesmo o erro esporadicamente