Ir para conteúdo
  • Cadastre-se

dev botao

Access Violation Assinar XML


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

Recommended Posts

Boa tarde a todos, 

Estou com problema para assinar o XML, estou realizando as implementações para realizar o cancelamento da NFSe para o município de Chapecó, estou fazendo as alterações para tentar solucionar a assinatura, sendo que no XML é utilizado o atributo 'id' não 'Id'.

Realizei algumas alterações, deixei o arquivo semelhante ao arquivo de exemplo, porém, recebo erro de Access Violation na Unit ACBrDFeXsMsXml, linha 204:

// Assinando com MSXML e CryptoLib //
      signedKey := xmldsig.sign(dsigKey, CERTIFICATES);

Realizei as seguinte alterações:

1) Definir id no elemento <InfPedidoCancelamento> (<InfPedidoCancelamento id="C201900000000005">)

  Em 10/01/2019 at 09:47, Italo Jurisato Junior disse:

João,

Unit ACBrNFSeWebSerices:

procedure TNFSeCancelarNfse.DefinirDadosMsg;
 

      proEquiplano,
      proISSCuritiba,
      proPronimv2,
//      proPublica,       <== Linha 4611 comentar essa linha
      proSP,
      proNotaBlu,
      proSMARAPD,
      proIPM: FURI := '';
 

Se os seus fontes estão atualizados é essa linha que você deve comentar

Ao invés de comentar essa linha sugeria fiz a seguinte alteração:

proPublica: FURI := 'C'+FNumeroNFSe;

Ou seja, vamos deixar a URI conforme o exemplo 'C'+NumeroNFs.

2) Atribuir ID no <Reference> herdada da TAG <Signature> (<Reference URI="#C201900000000005">).

Na unit ACBrDFeUtil é construída a TAG:

 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="'+MethodAlgorithm+'" />' +
      '<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="'+DigestAlgorithm+'" />' +
        '<DigestValue></DigestValue>' +
      '</Reference>' +
    '</SignedInfo>' +
    '<SignatureValue></SignatureValue>' +
    '<KeyInfo>' +
    IfThen(AddX509Data,
      '<X509Data>' +
        '<X509Certificate></X509Certificate>'+
      '</X509Data>',
      '')+
    '</KeyInfo>'+
  '</Signature>';

É utilizado o parâmetro URI para definir o ID. Esse parâmetro é definido na função ExtraiURI, unit ACBRDFeUtil:

function ExtraiURI(const AXML: String; IdAttr: String): String;
var
  I, J: integer;
begin
  Result := '';
  if IdAttr = '' then
    IdAttr := 'Id';

  I := PosEx(IdAttr+'=', AXML);
  if I = 0 then       // XML não tem URI
    Exit;

  I := PosEx('"', AXML, I + 2);
  if I = 0 then
    raise EACBrDFeException.Create('Não encontrei inicio do URI: aspas inicial');

  J := PosEx('"', AXML, I + 1);
  if J = 0 then
    raise EACBrDFeException.Create('Não encontrei inicio do URI: aspas final');

  Result := copy(AXML, I + 1, J - I - 1);
end;

A função busca no XML o atributo 'Id', pois atualmente o parâmetro IdAttr vem vazio, então é definido fixo o IdAttr := 'Id' (Note que está com o I MAIÚSCULO), já no elemento <InfPedidoCancelamento id="C201900000000005"> está minusculo, ou seja, não é encontrado o id, por isso não seta a TAG <Reference> com o ID necessário.

Para fazer os testes defini de forma fixa o 'id' (minusculo) na chamada da assinatura unit ACBrNFSeWebServices:

// O procedimento recebe como parametro o XML a ser assinado e retorna o
  // mesmo assinado da propriedade FPDadosMsg
  if (FPConfiguracoesNFSe.Geral.ConfigAssinar.Cancelar) and (FPDadosMsg <> '') then
    AssinarXML(FPDadosMsg, FdocElemento, FinfElemento, 'Falha ao Assinar - Cancelar NFS-e: ','','','id');

Para funcionar também alterei a chamada de assinatura na unit ACBRDFeWebService: (Adicionei o parâmetro vazio '')

FPDadosMsg := FPDFeOwner.SSL.Assinar(AXML, docElement, infElement,
                     SignatureNode, SelectionNamespaces,'', IdSignature);

LEMBRANDO FIZ ESSES ALTERAÇÕES APENAS PARA TESTE.

Feito isso, consegui gerar o XML (em anexo) igual o exemplo, exceto a assinatura devido o erro de AV.

Porém, conforme relatei no inicio, recebo o erro de Access Violation,.

Lembro de ter visto algo aqui no fórum referente a esse Id, alguém tem alguma sugestão de como resolver?

 

Exemplo Publica.xml

Contruido-NãoAssinado.xml

Link para o comentário
Compartilhar em outros sites

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

The popup will be closed in 10 segundos...