Jump to content

dev botao

ACBrReinf - Fontes


Leivio Fontenele
Go to solution Solved by Renato Rubinho,
  • Este tópico foi criado há 2453 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Consultores

Boa tarde,

@Juliomar Marchetti, segue o fonte sem os IFDefs e incorporado no projeto de exemplo o controle dos parâmetros via .ini "clonado" do Demo de NFe

@Leivio Fontenele, consegue fazer uma teste para validar ? Não sei se é meu ambiente, mas na geração do XML o valor de "URI" da tag "Reference" fica em branco conforme exemplo que estou enviando (E_Reinf_Soap-15045_111.xml). É a única diferença perante o seu exemplo (E_Reinf_Soap-175429_9.xml) que indicou que funcionou.

 

 

ACBrReinfD7.rar

  • Like 1
Link to comment
Share on other sites

Então eu estou com este problema também, se ajusto o ACBRDFeSSl para informar a URI com o id ocorre o erro de 'Erro: Falha ao interpretar o XML "xmlParseDoc"' ,

se  informo em branco a URI envia o lote, mas vem com o erro  **Ocorrencias
   codigo: MS0030
   descricao: A estrutura do arquivo XML esta em desconformidade com o esquema XSD. The 'URI' attribute is invalid - The value '' is invalid according to its datatype 'AnyUri' - The actual length is less than the MinLength 

Link to comment
Share on other sites

22 horas atrás, Renato Rubinho disse:

Boa tarde,

@Juliomar Marchetti, segue o fonte sem os IFDefs e incorporado no projeto de exemplo o controle dos parâmetros via .ini "clonado" do Demo de NFe

@Leivio Fontenele, consegue fazer uma teste para validar ? Não sei se é meu ambiente, mas na geração do XML o valor de "URI" da tag "Reference" fica em branco conforme exemplo que estou enviando (E_Reinf_Soap-15045_111.xml). É a única diferença perante o seu exemplo (E_Reinf_Soap-175429_9.xml) que indicou que funcionou.

 

 

ACBrReinfD7.rar

Testei o seus fontes e exemplo no Delphi XE6, funcionou ok, mas está com o mesmo problema do meu teste tambem.

Retorno do Evento ao enviar: (R-1000) - creio que o problema tem a ver com a tag Reference URI = ""

 

 

ideTransmissor: 33683111000107
cdStatus: 0
retornoEventos
Evento Id: 
*ideContrib 
 ideContrib: 1
 NrInsc: 24195293
*dadosRecepcaoEvento 
 dhProcessamento 25/10/2017
 tipoEvento 1000
 IdEvento ID1241952930000002017102515202000001
 Hash bGZOe/fgCX5biTXNqijcBlM4j4O/k8AV0eqG+Vyie+s=
*Status 
 cdRetorno 1
 descRetorno ERRO
 **Ocorrencias
   codigo: MS0030
   descricao: A estrutura do arquivo XML esta em desconformidade com o esquema XSD. The 'URI' attribute is invalid - The value '' is invalid according to its datatype 'AnyUri' - The actual length is less than the MinLength value.
   tipo: 1
   localizacaoErroAviso: 
 

 

 

 

 

Reinf2_Retorno.txt

Reinf1_Envio.txt

Link to comment
Share on other sites

  • Consultores

Buenas,

 

Encontrei o problema e fiz todos os testes possíveis (até onde entendo), mas aparentemente existe um "conflito" no fonte
Pelo que vi nos históricos, o problema ocorreu no item 2 (descrito abaixo). Estou fazeno mais testes e até amanhã passo a solução completa.

Vamos lá, do final para o começo:

1. O erro no Reinf acontece aqui:

//#######
ACBrDFeUtil->SignatureElement(
.
.
.
  '<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"' + IdSignature + '>' +
//#######

1.1. Por que ?
- Nesta linha, a função utiliza o conteúdo do parâmetro IdSignature como se fosse um atributo de "Signature"

1.2. IdSignature está recebendo o conteúdo 'id', o que gera o erro, pois era previsto um atributo (Ex: 'id="1234"' ao invés de 'id' ).

2. Onde está o "Conflito" ?

//#######
ACBrDFeSSL->TDFeSSLXmlSignClass.AdicionarSignatureElement(
.
.
.
  URI := ExtraiURI(ConteudoXML, IdSignature);
//#######

2.1. Nesta linha, foi  previsto que IdSignature receberia apenas o nome do atributo "id" para "Extrair" o valor e alimentar na variável "URI"

3. Como simular o erro ?

//#######
ACBrReinfEventosBase->TEventoReinf.Assinar(
.
.
.
    XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento), '', '', 'id');
//#######

Preencher o parâmetro IdSignature da função SSL.Assinar com 'id', com isso, a função ACBrDFeSSL->TDFeSSLXmlSignClass.AdicionarSignatureElement conseguirá extrar o valor da URI, mas a função ACBrDFeUtil->SignatureElement irá gerar o atributo incorreto em Signature.

Link to comment
Share on other sites

  • Consultores

Buenos,

Segue a correção do DFeComum (Estou mandando separado o fonte do DFeComum do fonte do Reinf, devido ao Reinf ainda não fazer parte do componente)

- Adicionado novo parâmetro IdAttr para receber o nome do atributo de identificação da assinatura quando for diferente de "Id"
- Com a criação do novo parâmetro, mantido o parâmetro IdSignature para receber uma identificação de assinatura completa, que é utilizada em ACBrDFeUtil.SignatureElement

Implementações do IdAttr:  

-- ACBrDFeSSL
TDFeSSLXmlSignClass.AdicionarSignatureElement

TDFeSSLXmlSignClass.Assinar
TDFeSSLXmlSignClass.VerificarAssinatura
TDFeSSL.Assinar
TDFeSSL.VerificarAssinatura

-- ACBrDFeXsXmlSec
TDFeSSLXmlSignXmlSec.Assinar
TDFeSSLXmlSignXmlSec.VerificarAssinatura

-- ACBrDFeXsMsXmlCapicom
TDFeSSLXmlSignMsXmlCapicom.Assinar

-- ACBrDFeXsMsXml
TDFeSSLXmlSignMsXml.Assinar
TDFeSSLXmlSignMsXml.VerificarAssinatura

-- ACBrDFeUtil
ExtraiURI

 

// ##################

Pelo que vi, o problema ocorreu na revisão 13850, de acordo com as descrições abaixo:

-- ACBrDFeSSL, ACBrDFeXsMsXml, ACBrDFeXsXmlSec --
[*] Método "TDFeSSLXmlSignClass.VerificarAssinatura", modificado para receber
    como parâmetro: IdSignature: String = '' (ficando igual ao método "Assinar")
    Isso permitirá a verificação de assinaturas que usa um padrão de ID diferente
    de "Id"

-- ACBrDFeXsXmlSec --
[*] Métodos "Assinar" e "VerificarAssinatura" modificados para fazer uso do
    parâmetro "IdSignature".

-- ACBrDFeUtil --
[*] Método "ExtraiURI" modificado para receber como parâmetro extra
    "IdSignature: String = ''". Isso permite diferente tipos de ID como por
    exemplo: "Id", "id", etc
    (por: DSA)ACBrDFe.rar

// ##################

Link to comment
Share on other sites

Agora, Renato Rubinho disse:

Buenos,

Segue a correção do DFeComum (Estou mandando separado o fonte do DFeComum do fonte do Reinf, devido ao Reinf ainda não fazer parte do componente)

- Adicionado novo parâmetro IdAttr para receber o nome do atributo de identificação da assinatura quando for diferente de "Id"
- Com a criação do novo parâmetro, mantido o parâmetro IdSignature para receber uma identificação de assinatura completa, que é utilizada em ACBrDFeUtil.SignatureElement

Implementações do IdAttr:  

-- ACBrDFeSSL
TDFeSSLXmlSignClass.AdicionarSignatureElement

TDFeSSLXmlSignClass.Assinar
TDFeSSLXmlSignClass.VerificarAssinatura
TDFeSSL.Assinar
TDFeSSL.VerificarAssinatura

-- ACBrDFeXsXmlSec
TDFeSSLXmlSignXmlSec.Assinar
TDFeSSLXmlSignXmlSec.VerificarAssinatura

-- ACBrDFeXsMsXmlCapicom
TDFeSSLXmlSignMsXmlCapicom.Assinar

-- ACBrDFeXsMsXml
TDFeSSLXmlSignMsXml.Assinar
TDFeSSLXmlSignMsXml.VerificarAssinatura

-- ACBrDFeUtil
ExtraiURI

 

// ##################

Pelo que vi, o problema ocorreu na revisão 13850, de acordo com as descrições abaixo:

-- ACBrDFeSSL, ACBrDFeXsMsXml, ACBrDFeXsXmlSec --
[*] Método "TDFeSSLXmlSignClass.VerificarAssinatura", modificado para receber
    como parâmetro: IdSignature: String = '' (ficando igual ao método "Assinar")
    Isso permitirá a verificação de assinaturas que usa um padrão de ID diferente
    de "Id"

-- ACBrDFeXsXmlSec --
[*] Métodos "Assinar" e "VerificarAssinatura" modificados para fazer uso do
    parâmetro "IdSignature".

-- ACBrDFeUtil --
[*] Método "ExtraiURI" modificado para receber como parâmetro extra
    "IdSignature: String = ''". Isso permite diferente tipos de ID como por
    exemplo: "Id", "id", etc
    (por: DSA)ACBrDFe.rar

// ##################

ok Renato, irei testar o seu fonte com as correções pela manhã e te aviso, obrigado por enquanto!

Link to comment
Share on other sites

  • Consultores

Segunda parte - ACBrReinf,

Segue o fonte do Reinf após implementação do IdAttr no DFeComum, passando "id" no novo parâmetro:

-- ACBrReinfEventosBase

TEventoReinf.Assinar(

    XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento), '', '', '', 'id');
 

@Sandro Felipe Adad e @Leivio Fontenele

Quando puderem, vejam se ficou OK para vocês. Estou com um Certificado A3 e não estou conseguindo, pois parece que o Crypt SHA 256 apenas funciona com o OpenSSL, mas ao tentar utilizar o OpenSSL dá erro.

image.png.a6bc8fc994a30e2b97897dd141da4779.png

Preciso fazer mais testes com o A3, caso alguém tenha uma dica, agradeço.

ACBrReinf.rar

E_Reinf_Soap-85424_585.xml

Link to comment
Share on other sites

41 minutos atrás, Renato Rubinho disse:

Segunda parte - ACBrReinf,

Segue o fonte do Reinf após implementação do IdAttr no DFeComum, passando "id" no novo parâmetro:

-- ACBrReinfEventosBase

TEventoReinf.Assinar(

    XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento), '', '', '', 'id');
 

@Sandro Felipe Adad e @Leivio Fontenele

Quando puderem, vejam se ficou OK para vocês. Estou com um Certificado A3 e não estou conseguindo, pois parece que o Crypt SHA 256 apenas funciona com o OpenSSL, mas ao tentar utilizar o OpenSSL dá erro.

image.png.a6bc8fc994a30e2b97897dd141da4779.png

Preciso fazer mais testes com o A3, caso alguém tenha uma dica, agradeço.

ACBrReinf.rar

E_Reinf_Soap-85424_585.xml

Renato, perfeito, funcionou certinho a tag Reference e o lote foi aceito.

Eu uso o certificado de arquivo pfx, mas não informo o numero de série, apenas o arquivo e a senha.

 

R_Reinf_Soap-94521_607.xml

E_Reinf_Soap-94521_293.xml

evtInfoContri.xml

Link to comment
Share on other sites

2 horas atrás, Renato Rubinho disse:

Segunda parte - ACBrReinf,

Segue o fonte do Reinf após implementação do IdAttr no DFeComum, passando "id" no novo parâmetro:

-- ACBrReinfEventosBase

TEventoReinf.Assinar(

    XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento), '', '', '', 'id');
 

@Sandro Felipe Adad e @Leivio Fontenele

Quando puderem, vejam se ficou OK para vocês. Estou com um Certificado A3 e não estou conseguindo, pois parece que o Crypt SHA 256 apenas funciona com o OpenSSL, mas ao tentar utilizar o OpenSSL dá erro.

image.png.a6bc8fc994a30e2b97897dd141da4779.png

Preciso fazer mais testes com o A3, caso alguém tenha uma dica, agradeço.

ACBrReinf.rar

E_Reinf_Soap-85424_585.xml

 

XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento)); esta dando erro

 

image.png.1ae76e3b2f8a4f187df11287e9a72557.pngimage.png.1ae76e3b2f8a4f187df11287e9a72557.png

Edited by fidel
Link to comment
Share on other sites

  • Consultores
1 hora atrás, Juliomar Marchetti disse:

Esse é um dos tratamentos que vi ao compilar pois primeiro fiz no lazarus rodar.

@Juliomar Marchetti, apenas confirmando, para implantarem as alterações que fiz no DFeComum abro um tópico com o fonte ou esse aqui será utilizado ?

ACBrDFe.rar

 

 

@fidel,

- Primeiro atualize o fonte ACBrDFe.rar e recompile o ACBr_DFeComum

- Atualize o ACBrReinf.rar 

A linha que você postou que está dando erro do Reinf:

XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento)); 

conforme meu exemplo, foi substituída por:

    XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento), '', '', '', 'id');

 

Link to comment
Share on other sites

  • Fundadores
4 horas atrás, Renato Rubinho disse:

- Adicionado novo parâmetro IdAttr para receber o nome do atributo de identificação da assinatura quando for diferente de "Id"
- Com a criação do novo parâmetro, mantido o parâmetro IdSignature para receber uma identificação de assinatura completa, que é utilizada em ACBrDFeUtil.SignatureElement

Não compreendi a necessidade dessas modificações... na sua opinião, qual a diferença entre "IdSignature" e "IdAttr" ? 

Porque precisamos de ambos e não apenas de "IdSignature" ?

Consultor SAC ACBr

Daniel Simões de Almeida
O melhor TEF, é com o Projeto ACBr - Clique e Conheça
Ajude o Projeto ACBr crescer - Assine o SAC

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.

Link to comment
Share on other sites

Obrigado. mas continua dando erro agora nesta linha   XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento), '', '', '', 'id');

 

image.png.57a28f013b049c54479186ba05187187.png

em anexo rotina do  ACBrReinfEventosBase.

 

function TEventoReinf.Assinar(AXMLEvento, ANomeEvento: AnsiString): AnsiString;
var
  XMLAss: string;
  ArqXML: string;
begin
  Result := '';

  ArqXML := string(AXMLEvento);

  ArqXML := ConverteXMLtoUTF8(ArqXML);
  FXMLOriginal := ArqXML;

  with TACBrReinf(FACBrReinf) do
  begin
    //XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento));
    //XMLAss := SSL.Assinar(ArqXML, 'Reinf', '','','', Self.Id());
    XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento), '', '', '', 'id');

    FXMLAssinado := XMLAss;
    FXMLOriginal := XMLAss;

    XMLAss := StringReplace(XMLAss, '<' + ENCODING_UTF8_STD + '>', '', [rfReplaceAll]);
    XMLAss := StringReplace(XMLAss, '<' + XML_V01 + '>', '', [rfReplaceAll]);

    ANomeEvento := ANomeEvento + '.xml';

    if Configuracoes.Arquivos.Salvar then
       Gravar(string(ANomeEvento), XMLAss,Configuracoes.Arquivos.PathSalvar);

    Result := AnsiString(XMLAss);

    {$IFDEF DEBUG}
      With TStringList.Create do
      try
        Text := XMLAss;
        SaveToFile(IncludeTrailingPathDelimiter(ExtractFileDir(ParamStr(0))) + 'Docs\' + ANomeEvento);
      finally
        Free;
      end;
    {$ENDIF}
  end;
end;

Link to comment
Share on other sites

1 hora atrás, fidel disse:

Obrigado. mas continua dando erro agora nesta linha   XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento), '', '', '', 'id');

 

image.png.57a28f013b049c54479186ba05187187.png

em anexo rotina do  ACBrReinfEventosBase.

 

function TEventoReinf.Assinar(AXMLEvento, ANomeEvento: AnsiString): AnsiString;
var
  XMLAss: string;
  ArqXML: string;
begin
  Result := '';

  ArqXML := string(AXMLEvento);

  ArqXML := ConverteXMLtoUTF8(ArqXML);
  FXMLOriginal := ArqXML;

  with TACBrReinf(FACBrReinf) do
  begin
    //XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento));
    //XMLAss := SSL.Assinar(ArqXML, 'Reinf', '','','', Self.Id());
    XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento), '', '', '', 'id');

    FXMLAssinado := XMLAss;
    FXMLOriginal := XMLAss;

    XMLAss := StringReplace(XMLAss, '<' + ENCODING_UTF8_STD + '>', '', [rfReplaceAll]);
    XMLAss := StringReplace(XMLAss, '<' + XML_V01 + '>', '', [rfReplaceAll]);

    ANomeEvento := ANomeEvento + '.xml';

    if Configuracoes.Arquivos.Salvar then
       Gravar(string(ANomeEvento), XMLAss,Configuracoes.Arquivos.PathSalvar);

    Result := AnsiString(XMLAss);

    {$IFDEF DEBUG}
      With TStringList.Create do
      try
        Text := XMLAss;
        SaveToFile(IncludeTrailingPathDelimiter(ExtractFileDir(ParamStr(0))) + 'Docs\' + ANomeEvento);
      finally
        Free;
      end;
    {$ENDIF}
  end;
end;

Tive que alterar, retirando um dos parâmetros vazios.

    XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento), '', '', 'id');

Link to comment
Share on other sites

  • Consultores
1 hora atrás, Daniel Simoes disse:

Não compreendi a necessidade dessas modificações... na sua opinião, qual a diferença entre "IdSignature" e "IdAttr" ? 

Porque precisamos de ambos e não apenas de "IdSignature" ?

@Daniel Simoes, pelo que entendi nas reviões o IdSignature foi criado prevendo um atributo para concatenar seu valor em ACBrDFeUtil.SignatureElement, na linha:

  '<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"' + IdSignature + '>' +

Se passarmos algum valor que não seja um atributo neste parâmetro ( 'id' no caso do Reinf ), esse valor será concatenado na linha acima destacada, gerando erro "Erro: Falha ao interpretar o XML "xmlParseDoc" porque o "Signature" ficará errado.

-- ACBrDFeUtil

function SignatureElement(const URI: String; AddX509Data: Boolean; IdSignature: String = ''; Asha256: Boolean = False): String;
begin
  if Asha256 then
    Result :=
    '<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"' + IdSignature + '>' +
      '<SignedInfo>' +
        '<CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" />' +
        '<SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256" />' +
        '<Reference URI="' + IfThen(URI = '', '', '#' + URI) + '">' +
          '<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/2001/04/xmlenc#sha256" />' +
          '<DigestValue></DigestValue>' +
        '</Reference>' +
      '</SignedInfo>' +
      '<SignatureValue></SignatureValue>' +
      '<KeyInfo>' +
      IfThen(AddX509Data,
        '<X509Data>' +
          '<X509Certificate></X509Certificate>'+
        '</X509Data>',
        '')+
      '</KeyInfo>'+
    '</Signature>'
  else
    Result :=
    '<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"' + IdSignature + '>' +
      '<SignedInfo>' +

 

O problema se origina no ACBrDFeSSL->TDFeSSLXmlSignClass.AdicionarSignatureElement , pois na linha que destaquei abaixo, é previsto receber o IdSignature como o nome do atributo ( apenas 'id', por exemplo )

  URI := ExtraiURI(ConteudoXML, IdSignature);
 

Mas na linha que destaquei abaixo, o mesmo IdSignature é passado para a SignatureElement, gerando o erro no xml

  Result := copy(ConteudoXML, 1, I - 1) +
            SignatureElement(URI, AddX509Data, IdSignature, FpDFeSSL.SSLDgst) +
            TagEndDocElement;

 

function TDFeSSLXmlSignClass.AdicionarSignatureElement(ConteudoXML: String;
  AddX509Data: Boolean; docElement, IdSignature: String): String;
var
  URI, TagEndDocElement: String;
  I: Integer;
begin
  URI := ExtraiURI(ConteudoXML, IdSignature);

  TagEndDocElement := '</' + docElement + '>';
  I := PosLast(TagEndDocElement, ConteudoXML);
  if I = 0 then
    raise EACBrDFeException.Create('Não encontrei final do elemento: ' + TagEndDocElement);

  Result := copy(ConteudoXML, 1, I - 1) +
            SignatureElement(URI, AddX509Data, IdSignature, FpDFeSSL.SSLDgst) +
            TagEndDocElement;
end;

Espero que tenha conseguido explicar, pois como envolve uma cadeia de chamadas de funções pode ser um pouco confuso.

Me avise se ficou alguma dúvida.

 

Link to comment
Share on other sites

1 hora atrás, Adilson Pereira disse:

Tive que alterar, retirando um dos parâmetros vazios.

    XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento), '', '', 'id');

Obrigado.  agora OK.

 

Desculpa. mas agora esta dando o seguinte erro.

 

image.png.746efc4fbc40f436d51d23d0a9ccf3d9.png

Link to comment
Share on other sites

  • Consultores
  • Solution

@fidel e @Adilson Pereira,

Conforme informei acima, sigam estes passos:

1. Primeiro atualize o fonte ACBrDFe.rar e recompile o ACBr_DFeComum, pois existem alterações que se não gerar novamente as dcus vão ter problemas de incompatibilidade entra as classes

2. Atualize o ACBrReinf.rar

3. Após recompilar o ACBr_DFeComum, a função SSL.Assinar receberá o sétimo parâmetro sem ocorrer o erro que mencionaram.

4. A linha correta de ACBrReinfEventosBase->TEventoReinf.Assinar( é

   XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento), '', '', '', 'id');

O erro "Erro: Falha ao interpretar o XML "xmlParseDoc" ocorre porque algum dos passos acima não foi feito

 

Edited by Renato Rubinho
  • Thanks 1
Link to comment
Share on other sites

11 minutos atrás, Renato Rubinho disse:

@fidel e @Adilson Pereira,

Conforme informei acima, siga estes passos:

1. Primeiro atualize o fonte ACBrDFe.rar e recompile o ACBr_DFeComum, pois existem alterações que se não gerar novamente as dcus vão ter problemas de incompatibilidade entra as classes

2. Atualize o ACBrReinf.rar

3. Após recompilar o ACBr_DFeComum, a função SSL.Assinar receberá o sétimo parâmetro sem ocorrer o erro que mencionaram.

4. A linha correta de ACBrReinfEventosBase->TEventoReinf.Assinar( é

   XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento), '', '', '', 'id');

O erro "Erro: Falha ao interpretar o XML "xmlParseDoc" ocorre porque algum dos passos acima não foi feito

 

 

11 minutos atrás, Renato Rubinho disse:

@fidel e @Adilson Pereira,

Conforme informei acima, sigam estes passos:

1. Primeiro atualize o fonte ACBrDFe.rar e recompile o ACBr_DFeComum, pois existem alterações que se não gerar novamente as dcus vão ter problemas de incompatibilidade entra as classes

2. Atualize o ACBrReinf.rar

3. Após recompilar o ACBr_DFeComum, a função SSL.Assinar receberá o sétimo parâmetro sem ocorrer o erro que mencionaram.

4. A linha correta de ACBrReinfEventosBase->TEventoReinf.Assinar( é

   XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento), '', '', '', 'id');

O erro "Erro: Falha ao interpretar o XML "xmlParseDoc" ocorre porque algum dos passos acima não foi feito

 

Você está certo Renato, é porque eu tinha compilado pelo ACBrInstall_Trunk2.exe, porém quando compilei separado resolveu.

Há, desculpe pela resposta anterior vazia.

Link to comment
Share on other sites

32 minutos atrás, Renato Rubinho disse:

@fidel e @Adilson Pereira,

Conforme informei acima, sigam estes passos:

1. Primeiro atualize o fonte ACBrDFe.rar e recompile o ACBr_DFeComum, pois existem alterações que se não gerar novamente as dcus vão ter problemas de incompatibilidade entra as classes

2. Atualize o ACBrReinf.rar

3. Após recompilar o ACBr_DFeComum, a função SSL.Assinar receberá o sétimo parâmetro sem ocorrer o erro que mencionaram.

4. A linha correta de ACBrReinfEventosBase->TEventoReinf.Assinar( é

   XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento), '', '', '', 'id');

O erro "Erro: Falha ao interpretar o XML "xmlParseDoc" ocorre porque algum dos passos acima não foi feito

 

Exato, eu estava com esta mensagem  "Erro: Falha ao interpretar o XML "xmlParseDoc" , e com a  alteração do Renato funcionou certinho , tanto para o e-social quanto para o Reinf.

Link to comment
Share on other sites

16 horas atrás, Renato Rubinho disse:

@fidel e @Adilson Pereira,

Conforme informei acima, sigam estes passos:

1. Primeiro atualize o fonte ACBrDFe.rar e recompile o ACBr_DFeComum, pois existem alterações que se não gerar novamente as dcus vão ter problemas de incompatibilidade entra as classes

2. Atualize o ACBrReinf.rar

3. Após recompilar o ACBr_DFeComum, a função SSL.Assinar receberá o sétimo parâmetro sem ocorrer o erro que mencionaram.

4. A linha correta de ACBrReinfEventosBase->TEventoReinf.Assinar( é

   XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento), '', '', '', 'id');

O erro "Erro: Falha ao interpretar o XML "xmlParseDoc" ocorre porque algum dos passos acima não foi feito

 

Estou implementando o e-Social, e usando as units do ACBrDFe.rar e adaptando o método de assinar do e-Social baseado no que vc enviou pelo ACBrReinf consegui transmitir e consultar o lote de eventos com sucesso no layput 3.0

Link to comment
Share on other sites

22 horas atrás, Renato Rubinho disse:

@fidel e @Adilson Pereira,

Conforme informei acima, sigam estes passos:

1. Primeiro atualize o fonte ACBrDFe.rar e recompile o ACBr_DFeComum, pois existem alterações que se não gerar novamente as dcus vão ter problemas de incompatibilidade entra as classes

2. Atualize o ACBrReinf.rar

3. Após recompilar o ACBr_DFeComum, a função SSL.Assinar receberá o sétimo parâmetro sem ocorrer o erro que mencionaram.

4. A linha correta de ACBrReinfEventosBase->TEventoReinf.Assinar( é

   XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento), '', '', '', 'id');

O erro "Erro: Falha ao interpretar o XML "xmlParseDoc" ocorre porque algum dos passos acima não foi feito

 

 

eu

22 horas atrás, Renato Rubinho disse:

@fidel e @Adilson Pereira,

Conforme informei acima, sigam estes passos:

1. Primeiro atualize o fonte ACBrDFe.rar e recompile o ACBr_DFeComum, pois existem alterações que se não gerar novamente as dcus vão ter problemas de incompatibilidade entra as classes

2. Atualize o ACBrReinf.rar

3. Após recompilar o ACBr_DFeComum, a função SSL.Assinar receberá o sétimo parâmetro sem ocorrer o erro que mencionaram.

4. A linha correta de ACBrReinfEventosBase->TEventoReinf.Assinar( é

   XMLAss := SSL.Assinar(ArqXML, 'Reinf', String(ANomeEvento), '', '', '', 'id');

O erro "Erro: Falha ao interpretar o XML "xmlParseDoc" ocorre porque algum dos passos acima não foi feito

 

 

Link to comment
Share on other sites

eu atualizei o ACBrReinf.rar e compilei o ACBr_DFeComum mas continua dando o mesmo erro nesta rotina grifada em vermelho.

nao sei onde estou errando.

 

ACBRDFESSL

function TDFeSSL.Assinar(const ConteudoXML, docElement, infElement: String;
  SignatureNode: String; SelectionNamespaces: String; IdSignature: String;
  IdAttr: String ): String;
Var
  XmlAss, DeclaracaoXMLAntes, DeclaracaoXMLDepois: String;
  Assinado: Boolean;
begin
  // Nota: ConteudoXML, DEVE estar em UTF8 //
  // Lendo Header antes de assinar, Se Header não for UTF8 não usa... //
  if XmlEhUTF8(ConteudoXML) then
    DeclaracaoXMLAntes := ObtemDeclaracaoXML(ConteudoXML)
  else
    DeclaracaoXMLAntes := '';

  Assinado := False;

  if Assigned(FAntesDeAssinar) then
  begin
    XmlAss := ConteudoXML;
    FAntesDeAssinar( XmlAss, docElement, infElement, SignatureNode,
                     SelectionNamespaces, IdSignature);
    Assinado := (XmlAss <> ConteudoXML);
  end;

  if not Assinado then
  begin
    XmlAss := FSSLXmlSignClass.Assinar( ConteudoXML, docElement, infElement,
                                        SignatureNode, SelectionNamespaces,
                                        IdSignature, IdAttr);

    // Verificando se modificou o Header do XML assinado, e voltando para o anterior //
    if (DeclaracaoXMLAntes <> '') then
    begin
      DeclaracaoXMLDepois := ObtemDeclaracaoXML(XmlAss);

      if (DeclaracaoXMLDepois = '') then
        XmlAss := DeclaracaoXMLAntes + XmlAss
      else if (DeclaracaoXMLAntes <> DeclaracaoXMLDepois) then
        XmlAss := StringReplace(XmlAss, DeclaracaoXMLAntes, DeclaracaoXMLDepois, []);
    end;
  end;

  Result := XmlAss;
end;

 

 

Link to comment
Share on other sites

1 hora atrás, fidel disse:

eu atualizei o ACBrReinf.rar e compilei o ACBr_DFeComum mas continua dando o mesmo erro nesta rotina grifada em vermelho.

nao sei onde estou errando.

 

ACBRDFESSL

function TDFeSSL.Assinar(const ConteudoXML, docElement, infElement: String;
  SignatureNode: String; SelectionNamespaces: String; IdSignature: String;
  IdAttr: String ): String;
Var
  XmlAss, DeclaracaoXMLAntes, DeclaracaoXMLDepois: String;
  Assinado: Boolean;
begin
  // Nota: ConteudoXML, DEVE estar em UTF8 //
  // Lendo Header antes de assinar, Se Header não for UTF8 não usa... //
  if XmlEhUTF8(ConteudoXML) then
    DeclaracaoXMLAntes := ObtemDeclaracaoXML(ConteudoXML)
  else
    DeclaracaoXMLAntes := '';

  Assinado := False;

  if Assigned(FAntesDeAssinar) then
  begin
    XmlAss := ConteudoXML;
    FAntesDeAssinar( XmlAss, docElement, infElement, SignatureNode,
                     SelectionNamespaces, IdSignature);
    Assinado := (XmlAss <> ConteudoXML);
  end;

  if not Assinado then
  begin
    XmlAss := FSSLXmlSignClass.Assinar( ConteudoXML, docElement, infElement,
                                        SignatureNode, SelectionNamespaces,
                                        IdSignature, IdAttr);

    // Verificando se modificou o Header do XML assinado, e voltando para o anterior //
    if (DeclaracaoXMLAntes <> '') then
    begin
      DeclaracaoXMLDepois := ObtemDeclaracaoXML(XmlAss);

      if (DeclaracaoXMLDepois = '') then
        XmlAss := DeclaracaoXMLAntes + XmlAss
      else if (DeclaracaoXMLAntes <> DeclaracaoXMLDepois) then
        XmlAss := StringReplace(XmlAss, DeclaracaoXMLAntes, DeclaracaoXMLDepois, []);
    end;
  end;

  Result := XmlAss;
end;

 

 

Desculpa , o erro esta nesta rotina em vermelho, o doc esta retorna ndo nil

function TDFeSSLXmlSignXmlSec.XmlSecSign(const ConteudoXML: AnsiString; SignatureNode,
  SelectionNamespaces, InfElement: AnsiString): AnsiString;
var
  doc: xmlDocPtr;
  SignNode: xmlNodePtr;
  buffer: PAnsiChar;
  bufSize, SignResult: integer;
  xmlsecMsg: PAnsiChar;
begin
  doc := Nil;
  Result := '';

  if Trim(ConteudoXML) = '' then
    Exit;

  CreateCtx;
  try
    { load template }
    doc := xmlParseDoc(PAnsiChar(ConteudoXML));
    if (doc = nil) then
      raise EACBrDFeException.Create(cErrParseDoc);

    { Dispara Exception se não encontrar o SignNode }
    SignNode := XmlSecFindSignatureNode(doc, SignatureNode, SelectionNamespaces, InfElement);

    { sign the template }
    SignResult := xmlSecDSigCtxSign(FdsigCtx, SignNode);
    if (SignResult < 0) then
    begin
      xmlsecMsg := xmlSecErrorsGetMsg(2);
      raise EACBrDFeException.CreateFmt(cErrDSigSign + sLineBreak + xmlsecMsg, [SignResult]);
    end;

    { print signed document to stdout }
    // xmlDocDump(stdout, doc);
    // Can't use "stdout" from Delphi, so we'll use xmlDocDumpMemory instead...
    buffer := nil;
    xmlDocDumpMemory(doc, @buffer, @bufSize);
    if (buffer <> nil) then
      { success }
      Result := buffer;
  finally
    { cleanup }
    if (doc <> nil) then
      xmlFreeDoc(doc);

    DestroyCtx ;
  end;
end;

 

 

Obs: esta rotina esta no ACBrDFeXsXmlSec.

Link to comment
Share on other sites

1 hora atrás, fidel disse:

Desculpa , o erro esta nesta rotina em vermelho, o doc esta retorna ndo nil

function TDFeSSLXmlSignXmlSec.XmlSecSign(const ConteudoXML: AnsiString; SignatureNode,
  SelectionNamespaces, InfElement: AnsiString): AnsiString;
var
  doc: xmlDocPtr;
  SignNode: xmlNodePtr;
  buffer: PAnsiChar;
  bufSize, SignResult: integer;
  xmlsecMsg: PAnsiChar;
begin
  doc := Nil;
  Result := '';

  if Trim(ConteudoXML) = '' then
    Exit;

  CreateCtx;
  try
    { load template }
    doc := xmlParseDoc(PAnsiChar(ConteudoXML));
    if (doc = nil) then
      raise EACBrDFeException.Create(cErrParseDoc);

    { Dispara Exception se não encontrar o SignNode }
    SignNode := XmlSecFindSignatureNode(doc, SignatureNode, SelectionNamespaces, InfElement);

    { sign the template }
    SignResult := xmlSecDSigCtxSign(FdsigCtx, SignNode);
    if (SignResult < 0) then
    begin
      xmlsecMsg := xmlSecErrorsGetMsg(2);
      raise EACBrDFeException.CreateFmt(cErrDSigSign + sLineBreak + xmlsecMsg, [SignResult]);
    end;

    { print signed document to stdout }
    // xmlDocDump(stdout, doc);
    // Can't use "stdout" from Delphi, so we'll use xmlDocDumpMemory instead...
    buffer := nil;
    xmlDocDumpMemory(doc, @buffer, @bufSize);
    if (buffer <> nil) then
      { success }
      Result := buffer;
  finally
    { cleanup }
    if (doc <> nil) then
      xmlFreeDoc(doc);

    DestroyCtx ;
  end;
end;

 

 

Obs: esta rotina esta no ACBrDFeXsXmlSec.

Obs estou usando o delphi XE7

Link to comment
Share on other sites

  • Este tópico foi criado há 2453 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Guest
This topic is now closed to further replies.
×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.