Ir para conteúdo
  • Cadastre-se

dev botao

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

Recommended Posts

Postado

O trecho da unit ACBrDFeCapicom, quando passa na função, XmlEstaAssinado() não deveria ter um exit ?

Pois quando o xml já assinado é submetido novamente está gerando um erro desconhecido na linha:

 

      // Assinando com MSXML e CryptoLib //
      signedKey := xmldsig.sign(dsigKey, $00000002); << Erro aqui
      if (signedKey = nil) then
        raise EACBrDFeException.Create('Assinatura Falhou.');

 

Segue trecho do código para analise:

function TDFeCapicom.Assinar(const ConteudoXML, docElement, infElement: String): String;
var
  PosIni, PosFim: integer;
  URI, AXml, TagEndDocElement, XmlAss: String;
  xmldoc: IXMLDOMDocument3;
  xmldsig: IXMLDigitalSignature;
  dsigKey: IXMLDSigKey;
  signedKey: IXMLDSigKey;
  PrivateKey: IPrivateKey;
begin
  CoInitialize(nil);
  try
    CarregarCertificadoSeNecessario;

    AXml := ConteudoXML;
    XmlAss := '';

    if not XmlEstaAssinado(AXml) then
    begin
      URI := ExtraiURI(AXml);

      TagEndDocElement := '</' + docElement + '>';
      AXml := copy(AXml, 1, PosLast(TagEndDocElement, AXml) - 1);

      AXml := AXml + SignatureElement(URI, False) + TagEndDocElement;
    end;

 

Postado
11 minutos atrás, acgubamg disse:

O trecho da unit ACBrDFeCapicom, quando passa na função, XmlEstaAssinado() não deveria ter um exit ?

Pois quando o xml já assinado é submetido novamente está gerando um erro desconhecido na linha:

 

      // Assinando com MSXML e CryptoLib //
      signedKey := xmldsig.sign(dsigKey, $00000002); << Erro aqui
      if (signedKey = nil) then
        raise EACBrDFeException.Create('Assinatura Falhou.');

 

Segue trecho do código para analise:

function TDFeCapicom.Assinar(const ConteudoXML, docElement, infElement: String): String;
var
  PosIni, PosFim: integer;
  URI, AXml, TagEndDocElement, XmlAss: String;
  xmldoc: IXMLDOMDocument3;
  xmldsig: IXMLDigitalSignature;
  dsigKey: IXMLDSigKey;
  signedKey: IXMLDSigKey;
  PrivateKey: IPrivateKey;
begin
  CoInitialize(nil);
  try
    CarregarCertificadoSeNecessario;

    AXml := ConteudoXML;
    XmlAss := '';

    if not XmlEstaAssinado(AXml) then
    begin
      URI := ExtraiURI(AXml);

      TagEndDocElement := '</' + docElement + '>';
      AXml := copy(AXml, 1, PosLast(TagEndDocElement, AXml) - 1);

      AXml := AXml + SignatureElement(URI, False) + TagEndDocElement;
    end;

 

Ao debugar, identifiquei o problema no procedimento abaixo, olhe o trecho em vermelho.

Segue trecho e código  fonte alterado

 

 

procedure NotaFiscal.Assinar(Assina: Boolean);
var
  XMLStr: String;
  XMLUTF8: AnsiString;
  Leitor: TLeitor;
  CNPJEmitente, CNPJCertificado: String;
begin
  // VErificando se pode assinar esse XML (O XML tem o mesmo CNPJ do Certificado ??)
  CNPJEmitente    := OnlyNumber(NFSe.Prestador.CNPJ);
  CNPJCertificado := OnlyNumber(TACBrNFSe(TNotasFiscais(Collection).ACBrNFSe).SSL.CertCNPJ);

  // verificar somente os 8 primeiros digitos, para evitar problemas quando
  // a filial estiver utilizando o certificado da matriz
  {if Copy(CNPJEmitente, 1, 8) <> Copy(CNPJCertificado, 1, 8) then
    raise EACBrNFSeException.Create('Erro ao Assinar. O XML informado possui CNPJ diferente do Certificado Digital' );}

  // Gera novamente, para processar propriedades que podem ter sido modificadas
  XMLStr := GerarXML;

  // XML já deve estar em UTF8, para poder ser assinado //
  XMLUTF8 := ConverteXMLtoUTF8(XMLStr);
  FXMLOriginal := XMLUTF8;

  with TACBrNFSe(TNotasFiscais(Collection).ACBrNFSe) do
  begin
    if Assina then
    FXMLAssinado := SSL.Assinar(String(XMLUTF8), 'Rps',
                           Configuracoes.Geral.ConfigGeral.Prefixo3 + 'InfRps')
    else
    FXMLAssinado := FXMLOriginal;

//    FXMLOriginal := FXMLAssinado;

    Leitor := TLeitor.Create;
    try
      leitor.Grupo := FXMLAssinado;
      NFSe.signature.URI := Leitor.rAtributo('Reference URI=');
      NFSe.signature.DigestValue := Leitor.rCampo(tcStr, 'DigestValue');
      NFSe.signature.SignatureValue := Leitor.rCampo(tcStr, 'SignatureValue');
      NFSe.signature.X509Certificate := Leitor.rCampo(tcStr, 'X509Certificate');
    finally
      Leitor.Free;
    end;

    if Configuracoes.Arquivos.Salvar then
      Gravar(CalcularNomeArquivoCompleto(), ifThen(Assina, FXMLAssinado, FXMLOriginal));
  end;
end;

 

 

Outro ponto que do meu ponto de vista está com problema, trata-se do retorno da consulta, as variaveis i  e ii foram usadas de forma indiscriminada, incrementou a variavel para um colletion, e usou em outro, com isso as vezes a consulta retorna erro de List of bounds (-1).

 

Segue unit ACBrNFSeWebServices.pas devida apreciação do moderador

ACBrNFSeNotasFiscais.pas

ACBrNFSeWebServices.pas

  • Este tópico foi criado há 3290 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.