Ir para conteúdo
  • Cadastre-se

dev botao

Importar e enviar XML já assinado


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

Recommended Posts

Olá. Estou com uma particularidade e não consigo encontrar uma solução. Segue:

Para o município de Salvador utilizo uma DLL própria da prefeitura para assinar o arquivo XML do Lote, já que eles não seguem o padrão. Esse seria o fluxo que acredito que seria o correto:

1. Alimentar o componente com os dados da NFSe.

2. Gerar o Lote RPS. GerarLote().

3. Assinar com a DLL o arquivo gerado pelo componente e salvar no mesmo local. Busca o arquivo gerado (NotasFiscais.Items[0].NomeArqRPS).

4. Importar o arquivo assinado pela DLL. NotasFiscais.LoadFromFile(NotasFiscais.Items[0].NomeArqRPS).

5. Enviar o XML assinado. Enviar(NotasFiscais.NumeroLote);

No arquivo INI do provedor já alterei para não assinar o Lote e a Nota.

Porém, parece que quando importo o XML assinado, ele perde a assinatura.

Alguém já fez algo parecido ou sabe quais rotinas exatamente eu teria que chamar pra conseguir enviar um XML assinado por um componente externo?

Grato!

 

 

 

Link para o comentário
Compartilhar em outros sites

  • 2 semanas depois ...
  • 5 meses depois ...
Em 12/04/2017 at 10:00, dougue disse:

Resolvi o problema passando a rotina de assinatura pela DLL para o evento AntesDeAssinar do ACBrDFeSSL.

 

Dougue, vc tem o fonte desta unit alterada? Tbm precisarei fazer isto para Salvador pois direto pelo ACBr não esta funcionando.

Link para o comentário
Compartilhar em outros sites

3 horas atrás, rubenstz disse:

Dougue, vc tem o fonte desta unit alterada? Tbm precisarei fazer isto para Salvador pois direto pelo ACBr não esta funcionando.

na minha unit ficou assim:

if UpperCase(NFSeACBR.Configuracoes.Geral.xProvedor) = 'SALVADOR' then
begin
  //A assinatura do XML de salvador é feita por uma DLL da própria prefeitura, pois não segue o padrão.
  NFSeACBR.SSL.AntesDeAssinar := AssinaXMLSalvador;
end;
procedure TNFSe.AssinaXMLSalvador(var ConteudoXML: String; const docElement,
  infElement, SignatureNode, SelectionNamespaces, IdSignature: String);
  var
  Temp_XML: IXml;
  XMLAssinar: String;
begin
  Temp_XML     := CoXML.Create;

  XMLAssinar := ConteudoXML;
  XMLAssinar   := Temp_XML.AssinarXmlString(XMLAssinar,'Rps'               ,'My',Configuracao.NOMECERTIFICADO);
  XMLAssinar   := Temp_XML.AssinarXmlString(XMLAssinar,'EnviarLoteRpsEnvio','My',Configuracao.NOMECERTIFICADO);

  ConteudoXML := XMLAssinar;

end;

O Tipo IXml pode ser encontrado na unit NfseUtil_TLB, quem vem no exemplo da prefeitura. 

Lembrando que o certificado tem que estar obrigatoriamente instalado no repositório My do computador e não do usuário como é feito automaticamente.

Também se atentar ao fato que devemos passar o nome do certificado e não o número de série para o componente que faz a assinatura.

Link para o comentário
Compartilhar em outros sites

Em 04/10/2017 at 14:53, dougue disse:

na minha unit ficou assim:


if UpperCase(NFSeACBR.Configuracoes.Geral.xProvedor) = 'SALVADOR' then
begin
  //A assinatura do XML de salvador é feita por uma DLL da própria prefeitura, pois não segue o padrão.
  NFSeACBR.SSL.AntesDeAssinar := AssinaXMLSalvador;
end;

procedure TNFSe.AssinaXMLSalvador(var ConteudoXML: String; const docElement,
  infElement, SignatureNode, SelectionNamespaces, IdSignature: String);
  var
  Temp_XML: IXml;
  XMLAssinar: String;
begin
  Temp_XML     := CoXML.Create;

  XMLAssinar := ConteudoXML;
  XMLAssinar   := Temp_XML.AssinarXmlString(XMLAssinar,'Rps'               ,'My',Configuracao.NOMECERTIFICADO);
  XMLAssinar   := Temp_XML.AssinarXmlString(XMLAssinar,'EnviarLoteRpsEnvio','My',Configuracao.NOMECERTIFICADO);

  ConteudoXML := XMLAssinar;

end;

O Tipo IXml pode ser encontrado na unit NfseUtil_TLB, quem vem no exemplo da prefeitura. 

Lembrando que o certificado tem que estar obrigatoriamente instalado no repositório My do computador e não do usuário como é feito automaticamente.

Também se atentar ao fato que devemos passar o nome do certificado e não o número de série para o componente que faz a assinatura.

Olá Dougue, obrigado pela ajuda em primeiro lugar, consegui fazer alguns testes com certificados do tipo A1 ou certificados com extensão .pfx que levam a chave privada para o repositório 'MY' exigido pela DLL assinou o retorno normalmente. Porém com um certificado do tipo A3 instalado eu não consegui porque sempre instala no repositório 'PERSONAL', você ou alguém esta conseguindo fazer o envio com este tipo de certificado?

Link para o comentário
Compartilhar em outros sites

  • Este tópico foi criado há 2362 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • 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.