Ir para conteúdo
  • Cadastre-se

dev botao

ACBrReinf - Fontes


Ver Solução Respondido por Renato Rubinho,
  • Este tópico foi criado há 2496 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

  • Consultores
Postado

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

  • Curtir 1
Postado

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 

Postado
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

  • Consultores
Postado

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.

  • Consultores
Postado

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

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

Postado
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!

  • Consultores
Postado

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

Postado
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

Postado (editado)
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

Editado por fidel
  • Consultores
Postado
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');

 

  • Fundadores
Postado
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.

Postado

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;

Postado
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');

  • Consultores
Postado
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.

 

Postado
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

  • Consultores
  • Solution
Postado (editado)

@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

 

Editado por Renato Rubinho
  • Obrigado 1
Postado
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.

Postado
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.

Postado
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

Postado
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

 

 

Postado

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;

 

 

Postado
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.

Postado
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

  • Este tópico foi criado há 2496 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.
Visitante
Este tópico está agora fechado para novas respostas
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.