Ir para conteúdo
  • Cadastre-se

André Ferreira de Moraes

Moderadores
  • Total de ítens

    6.885
  • Registro em

  • Última visita

  • Days Won

    68

Tudo que André Ferreira de Moraes postou

  1. Debuque a procedure TNFeW.GerarDetImposto(const i: integer); da unit pcnNFeW.pas e veja oq pode estar errado.
  2. Use o ambiente do AM pra testar, está liberado para todos os estados.
  3. Se vc transformar em base64(Encode64) terá 56 caracteres.
  4. Veja Obs: Enquanto vc não conseguir acessar pelo browser não irá funcionar pelo componente.
  5. Qual windows e versão do IE que vc usa?
  6. Veja se existe uma impressora padrão cadastrada configurada com papel tamanho A4. Caso já tenha a impressora cadastrada, teste com a versão RaveCB.
  7. Não há solução conhecida para a versão Rave, existe é um bug conhecido a muito tempo, a única opção é usar a versão RaveCB.
  8. Seu XML está incompleto(não contém todas as informações do IPI por exemplo), anexe um XML que possa ser validado no site https://www.sefaz.rs.gov.br/nfe/nfe-val.aspx
  9. Usei a seguinte função e assinou normalmente(não comparei com a sua pra ver as diferenças): function AssinarMSXML(XML : AnsiString; Certificado : ICertificate2; out XMLAssinado : AnsiString): Boolean; var I, J, PosIni, PosFim : Integer; URI : String ; Tipo : Integer; xmlHeaderAntes, xmlHeaderDepois : AnsiString ; xmldoc : IXMLDOMDocument3; xmldsig : IXMLDigitalSignature; dsigKey : IXMLDSigKey; signedKey : IXMLDSigKey; begin if Pos('<Signature',XML) <= 0 then begin I := DFeUtil.PosEx('Id=',XML,6) ; if I = 0 then raise EACBrNFeException.Create('Não encontrei inicio do URI: Id=') ; I := DFeUtil.PosEx('"',XML,I+2) ; if I = 0 then raise EACBrNFeException.Create('Não encontrei inicio do URI: aspas inicial') ; J := DFeUtil.PosEx('"',XML,I+1) ; if J = 0 then raise EACBrNFeException.Create('Não encontrei inicio do URI: aspas final') ; URI := copy(XML,I+1,J-I-1) ; XML := copy(XML,1,pos('</DIe>',XML)-1); XML := XML + '<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1" />'; XML := XML + '<Reference URI="#'+URI+'">'; XML := XML + '<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/2000/09/xmldsig#sha1" />'; XML := XML + '<DigestValue></DigestValue></Reference></SignedInfo><SignatureValue></SignatureValue><KeyInfo></KeyInfo></Signature>'; XML := XML + '</DIe>'; end; // Lendo Header antes de assinar // xmlHeaderAntes := '' ; I := pos('?>',XML) ; if I > 0 then xmlHeaderAntes := copy(XML,1,I+1) ; xmldoc := CoDOMDocument50.Create; xmldoc.async := False; xmldoc.validateOnParse := False; xmldoc.preserveWhiteSpace := True; xmldsig := CoMXDigitalSignature50.Create; if (not xmldoc.loadXML(XML) ) then raise EACBrNFeException.Create('Não foi possível carregar o arquivo: '+XML); xmldoc.setProperty('SelectionNamespaces', DSIGNS); xmldsig.signature := xmldoc.selectSingleNode('.//ds:Signature'); if (xmldsig.signature = nil) then raise EACBrNFeException.Create('É preciso carregar o template antes de assinar.'); if NumCertCarregado <> Certificado.SerialNumber then CertStoreMem := nil; if CertStoreMem = nil then begin CertStore := CoStore.Create; CertStore.Open(CAPICOM_CURRENT_USER_STORE, 'My', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED); CertStoreMem := CoStore.Create; CertStoreMem.Open(CAPICOM_MEMORY_STORE, 'Memoria', CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED); Certs := CertStore.Certificates as ICertificates2; for i:= 1 to Certs.Count do begin Cert := IInterface(Certs.Item[i]) as ICertificate2; if Cert.SerialNumber = Certificado.SerialNumber then begin CertStoreMem.Add(Cert); NumCertCarregado := Certificado.SerialNumber; end; end; end; OleCheck(IDispatch(Certificado.PrivateKey).QueryInterface(IPrivateKey,PrivateKey)); xmldsig.store := CertStoreMem; dsigKey := xmldsig.createKeyFromCSP(PrivateKey.ProviderType, PrivateKey.ProviderName, PrivateKey.ContainerName, 0); if (dsigKey = nil) then raise EACBrNFeException.Create('Erro ao criar a chave do CSP.'); signedKey := xmldsig.sign(dsigKey, $00000002); if (signedKey <> nil) then begin XMLAssinado := xmldoc.xml; XMLAssinado := StringReplace( XMLAssinado, #10, '', [rfReplaceAll] ) ; XMLAssinado := StringReplace( XMLAssinado, #13, '', [rfReplaceAll] ) ; PosIni := Pos('<SignatureValue>',XMLAssinado)+length('<SignatureValue>'); XMLAssinado := copy(XMLAssinado,1,PosIni-1)+StringReplace( copy(XMLAssinado,PosIni,length(XMLAssinado)), ' ', '', [rfReplaceAll] ) ; PosIni := Pos('<X509Certificate>',XMLAssinado)-1; PosFim := DFeUtil.PosLast('<X509Certificate>',XMLAssinado); XMLAssinado := copy(XMLAssinado,1,PosIni)+copy(XMLAssinado,PosFim,length(XMLAssinado)); end else raise EACBrNFeException.Create('Assinatura Falhou.'); if xmlHeaderAntes <> '' then begin I := pos('?>',XMLAssinado) ; if I > 0 then begin xmlHeaderDepois := copy(XMLAssinado,1,I+1) ; if xmlHeaderAntes <> xmlHeaderDepois then XMLAssinado := StuffString(XMLAssinado,1,length(xmlHeaderDepois),xmlHeaderAntes) ; end else XMLAssinado := xmlHeaderAntes + XMLAssinado ; end ; dsigKey := nil; signedKey := nil; xmldoc := nil; xmldsig := nil; Result := True; end; Para carregar o arquivo: var vAssinada : AnsiString; FMsg : AnsiString; ArquivoFormatoXML : TStringList; begin OpenDialog1.Title := 'Selecione a NFE'; OpenDialog1.DefaultExt := '*-nfe.XML'; OpenDialog1.Filter := 'Arquivos NFE (*-nfe.XML)|*-nfe.XML|Arquivos XML (*.XML)|*.XML|Todos os Arquivos (*.*)|*.*'; OpenDialog1.InitialDir := ACBrNFe1.Configuracoes.Geral.PathSalvar; if OpenDialog1.Execute then begin ArquivoFormatoXML := TStringList.Create; try ArquivoFormatoXML.LoadFromFile(OpenDialog1.FileName); ArquivoFormatoXML.Text := StringReplace( ArquivoFormatoXML.Text, #10, '', [rfReplaceAll] ) ; ArquivoFormatoXML.Text := StringReplace( ArquivoFormatoXML.Text, #13, '', [rfReplaceAll] ) ; ArquivoFormatoXML.Text := StringReplace( ArquivoFormatoXML.Text, #$D#$A, '', [rfReplaceAll] ) ; if not(NotaUtil.Assinar(ArquivoFormatoXML.Text, ACBrNFe1.Configuracoes.Certificados.GetCertificado , vAssinada, FMsg)) then raise EACBrNFeException.Create('Falha ao assinar'); MemoAssinado.Clear; MemoAssinado.Lines.Add(vAssinada); finally ArquivoFormatoXML.Free; end; end; end; O arquivo a ser assinado deve começar a partir da chave <DIe... até o </DIe>, ou seja, depois de assinar que vc deverá completar o arquivo com as informações de envio, o arquivo anexo está assinado e foi validado com sucesso no site https://www.receita.fazenda.gov.br/Aplicacoes/SSL/ATBHE/assinadoc/ValidadorAssinaturas.app/valida.aspx teste_die.xml
  10. O campo vUnCom permite até 10 casas decimais. Use mais casas e a diferença será bem menor ou não existira com algum pequeno ajuste no preço.
  11. Sim. Basta trabalhar de uma forma que o ACBrNFeMonitor compreenda os comandos. Abre a unit DoACBrNFeUnit da pasta Projetos\ACBrNFeMonitor\Delphi e estude a melhor forma de adaptar seu sistema.
  12. O ACBrNFeMonitor roda localmente, então vc deve passar o path para um arquivo que exista na máquina. Ex: NFE.ASSINARNFE("c:\ACBrNFeMonitor\Arquivos\Tempo\35140603997115000190550010000121641435364663-NFe.xml")
  13. ACBrNFe1.WebServices.EnvEvento.EventoRetorno.retEvento.Items[0].RetInfEvento.cStat ACBrNFe1.WebServices.EnvEvento.EventoRetorno.retEvento.Items[0].RetInfEvento.xMotivo
  14. Todo comando que vou enviar verifico se obtive sucesso ou não. InetSetTimeout( sSOCKET, 3000 ) // Timeout de Envio 3 seg // if inetsendall( sSocket, CMD +'.'+ CR+LF) <= 0 RET_IMP := 'ERRO: Nao foi possivel transmitir dados para o ACBrNFeMonitor|'+; '('+AllTrim(Str(InetErrorCode( sSOCKET )))+') '+; InetErrorDesc( sSOCKET ) + ETX endif E fico aguardando a resposta com a opção do usuário cancelar a espera(alguns comandos podem demorar mais do que outros) //////// Lendo a resposta //////// InetSetTimeout( sSOCKET, 500 ) TINI := Seconds() do while (right(RET_IMP,1) <> ETX) MSG('Aguardando a resposta do ACBrNFeMonitor. Pressione <ESC> para cancelar.') do while ! CANCELOU .and. (right(RET_IMP,1) <> ETX) CANCELOU := ! VER_ESC() BLOCO := space(64) BYTES := inetrecv(sSOCKET, @BLOCO, 64) RET_IMP += left(BLOCO,BYTES) enddo if CANCELOU RET_IMP := 'ERRO: O ACBrNFeMonitor nao esta respondendo.' + ETX endif enddo
  15. ACBrNFe1.WebServices.EnvEvento.EventoRetorno.TpAmbACBrNFe1.WebServices.EnvEvento.EventoRetorno.verAplic ACBrNFe1.WebServices.EnvEvento.EventoRetorno.cStat ACBrNFe1.WebServices.EnvEvento.EventoRetorno.xMotivo ACBrNFe1.WebServices.EnvEvento.EventoRetorno.retEvento.Items[0].RetInfEvento.chNFe ACBrNFe1.WebServices.EnvEvento.EventoRetorno.retEvento.Items[0].RetInfEvento.dhRegEvento ACBrNFe1.WebServices.EnvEvento.EventoRetorno.retEvento.Items[0].RetInfEvento.nProt
  16. 1-Teste com a versão anterior e veja se o mesmo xml é assinado corretamente. 2-Teste com um XML menor para verificar se com todos acontecem o mesmo problema. 3-Remova quebras de linha. 4-Remova caracteres especiais. 5-Compare um arquivo assinado na versão anterior com a atual.
  17. Pelo demo vc consegue reproduzir o erro?
  18. Entre em contato com o SEFAZ, provavelmente é um problema na rotina de validação deles, pois o arquivo é validado normalmente no site https://www.sefaz.rs.gov.br/nfe/nfe-val.aspx
  19. Mas depois vc chama INetClose e acaba fechando a conexão. Então a cada comando vc abre novamente e dae pode receber alguma resposta q ficou perdida. Eu tenho basicamente 3 funções: NFE_INIT - Postei acima e abre uma conexão TCP e chamo apenas qdo inicializo o sistema. NFE_COMANDO - Uso para enviar os comandos e ler as respostas do ACBrNFeMonitor. NFE_END - Fecha a conexão qdo vou sair do sistema.
  20. Eu uso o envio de PDF e funciona normalmente. Teste com o demo e verifique se ocorre o mesmo problema.
  21. Testei agora e está funcionando.
  22. Não sei se entendi direito seu código, mas aparentemente vc abre a conexão para cada comando e ae está o problema.
×
×
  • 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.