Membros Pro TimeB256 Postado 2 Janeiro Membros Pro Postado 2 Janeiro Prezados, bom dia !! Eu gostaria de tirar algumas dúvidas acerca da configuração acbr. Eu tenho um projeto para captura de CTE. Toda vez que eu mudo de empresa, para realizar a captura, eu faço o seguinte código: Instancio a classe de serviço... acbrcteservico = new AcbrCTeServico(empresacteselecaomodel, certificadodigitalkeevo); E chamo o método de distribuicaoDfe var resposta = acbrcteservico.DistribuicaoDFe(); A minha dúvida é a seguinte... qdo instancio a classe, chamo o método ConfigurarCertificado. Esse método está todo descrito abaixo. 1) Gostaria de saber se está faltando alguma configuração que não foi passada.. 2) Ao final do método, eu chamo o acbrCTe.ConfigGravar(); É necessário ? 3) A propriedade acbrCTe.Config.Principal.LogPath é apenas caso eu queria gravar log ? 4) Eu preciso preencher a prop PathCTe ? Desde já agradeço a atenção !!! CÓDIGO DA CLASSE DE SERVICO (AcbrCTeServico) using Dfe.Pacotes.Infra.IntegracaoApi.Models.Passaporte; using Keevo.Pacotes.Infra.ACBrLib.Core.DFe; using Keevo.Pacotes.Infra.ACBrLib.CTe; using Keevo.Pacotes.Infra.ACBrLib.CTe.Models; using Keevo.Pacotes.Infra.Utils.Conversao; using Keevo.Pacotes.Infra.Utils.Criptografia; using Keevo.Pacotes.Infra.Utils.Diretorio; using Keevocenter.Pacotes.Infra.IntegracaoApi.Models.Certificado; namespace Dfe.Monitor.CapturaCte.Servicos { public class AcbrCTeServico : IDisposable { public ACBrCTe acbrcte { get; set; } public EmpresaParametrosCteSelecaoModel empresacte { get; set; } public CertificadoPorParametrosModel certificadodigitalkeevo { get; set; } public AcbrCTeServico(EmpresaParametrosCteSelecaoModel empresacte, CertificadoPorParametrosModel certificadodigitalkeevo) { try { acbrcte = new(); this.empresacte = empresacte; this.certificadodigitalkeevo = certificadodigitalkeevo; ConfigurarCertificado(acbrcte, certificadodigitalkeevo); } catch (Exception e) { Console.WriteLine($"AcbrCTeServico - Schemas: {acbrcte?.Config.PathSchemas} - StackTrace - {e.StackTrace}"); } } public DistribuicaoDFeResposta<TipoCTe> DistribuicaoDFe() { Console.WriteLine($"Código NFE: {empresacte.codigonfe.ToInt()} - CNPJ: {empresacte.cnpj} - NSU: {empresacte.ultimonsu ?? ("0").PadLeft(15, '0')} Schemas: {acbrcte.Config.PathSchemas}"); return TratarDfeResposta(acbrcte.DistribuicaoDFe(empresacte.codigonfe.ToInt(), empresacte.cnpj, empresacte.ultimonsu ?? ("0").PadLeft(15, '0'), "")); } public DistribuicaoDFeResposta<TipoCTe> DistribuicaoDFe(long ultimonsu) => DistribuicaoDFe(ultimonsu.ToString().PadLeft(15, '0')); public DistribuicaoDFeResposta<TipoCTe> DistribuicaoDFe(string ultimonsu) => TratarDfeResposta(acbrcte.DistribuicaoDFe(empresacte.codigonfe.ToInt(), empresacte.cnpj, ultimonsu, "")); public DistribuicaoDFeResposta<TipoCTe> DistribuicaoCtePorNSU(long nsu) => DistribuicaoCtePorNSU(nsu.ToString().PadLeft(15, '0')); public DistribuicaoDFeResposta<TipoCTe> DistribuicaoCtePorNSU(string nsu) => TratarDfeResposta(acbrcte.DistribuicaoDFePorNSU(empresacte.codigonfe.ToInt(), empresacte.cnpj, nsu)); public DistribuicaoDFeResposta<TipoCTe> DistribuicaoCtePorChave(string chave) => DistribuicaoCtePorChave(empresacte, chave); public DistribuicaoDFeResposta<TipoCTe> DistribuicaoCtePorChave(EmpresaParametrosCteSelecaoModel empresacte, string chave) => TratarDfeResposta(acbrcte.DistribuicaoDFePorChave(empresacte.codigonfe.ToInt(), empresacte.cnpj, chave)); public DistribuicaoDFeResposta<TipoCTe> TratarDfeResposta(string resposta) => DistribuicaoDFeResposta<TipoCTe>.LerResposta(resposta); public void ConfigurarCertificado() { ConfigurarCertificado(acbrcte, certificadodigitalkeevo); } public static void ConfigurarCertificado(ACBrCTe acbrCTe, CertificadoPorParametrosModel certificadodigitalkeevo) { acbrCTe.Config.DFe.SSLCryptLib = GetSSLCryptLib(); acbrCTe.Config.DFe.SSLHttpLib = GetSSLHttpLib(); acbrCTe.Config.DFe.SSLXmlSignLib = SSLXmlSignLib.xsLibXml2; acbrCTe.Config.DFe.DadosPFX = certificadodigitalkeevo.arquivocertificado; acbrCTe.Config.DFe.Senha = KeevoCrypto.Decrypt(certificadodigitalkeevo.senha); acbrCTe.Config.Ambiente = TipoAmbiente.taProducao; //acbrCTe.Config.SalvarArq = false; //acbrCTe.Config.SalvarGer = false; //Configurações para processamento acbrCTe.Config.SSLType = SSLType.LT_TLSv1_2; acbrCTe.Config.Timeout = 25000; acbrCTe.Config.AguardarConsultaRet = 0; acbrCTe.Config.Tentativas = 5; acbrCTe.Config.IntervaloTentativas = 1000; acbrCTe.Config.DFe.TimeZoneModo = TimezoneMode.tzManual; acbrCTe.Config.DFe.TimeZoneStr = "-03:00"; //acbrCTe.Config.PathSchemas = KeevoDiretorio.AppPath() + @"/Schemas/CTe"; acbrCTe.Config.PathSchemas = Path.Combine(KeevoDiretorio.AppPath(), "Schemas", "CTe"); //acbrCTe.Config.Principal.LogNivel = Keevo.Pacotes.Infra.ACBrLib.Core.NivelLog.logParanoico; //acbrCTe.Config.Principal.LogPath = KeevoDiretorio.AppPath(); acbrCTe.ConfigGravar(); } private static SSLCryptLib GetSSLCryptLib() => ACBrCTe.IsWindows ? SSLCryptLib.cryWinCrypt : SSLCryptLib.cryOpenSSL; private static SSLHttpLib GetSSLHttpLib() => ACBrCTe.IsWindows ? SSLHttpLib.httpWinHttp : SSLHttpLib.httpOpenSSL; public void Dispose() { acbrcte.Dispose(); } } }
Consultores Diego Foliene Postado 2 Janeiro Consultores Postado 2 Janeiro Boa tarde! 1 hour ago, TimeB256 said: 1) Gostaria de saber se está faltando alguma configuração que não foi passada.. No geral as configurações me parecem estar em ordem. Você definiu SSLCryptLib, SSLHttpLib, SSLXmlSignLib, DadosPFX, Senha e SSLType. Essas sãos a configurações mínimas para poder utilizar certificado. Você definiu o ambiente e o PathSchemas que são importantes e necessárias. Como você mencionou que o contexto é utilizar para distribuição DFe, acrescentaria essas duas propriedades: //Define o caminho onde os arquivos da DistribuiçãoDFe serão salvos ACBrCTe.Config.Download.PathDownload = ""; //Define se os arquivos serão salvos separando por nome do tipo do XML. ACBrCTe.Config.Download.SepararPorNome = "1"; 1 hour ago, TimeB256 said: 2) Ao final do método, eu chamo o acbrCTe.ConfigGravar(); É necessário ? Sim, é necessário para que as informações sejam devidamente alteradas no arquivo ACBrLib.ini 1 hour ago, TimeB256 said: 3) A propriedade acbrCTe.Config.Principal.LogPath é apenas caso eu queria gravar log ? O Log sempre é gravado a menos que você defina: ACBrCTe.Config.Principal.LogNivel = NivelLog.logNenhum; Se você não definir o LogPath, então vai ser gerado dentro da pasta do .EXE; No geral acredito que seja interessante manter um log para controle. Se sua preocupação é quanto ao tamanho do arquivo, você pode definir níveis de log mais simples e deixar os mais complexos para casos em que análises de problemas sejam necessárias. 2 hours ago, TimeB256 said: 4) Eu preciso preencher a prop PathCTe ? Ela define onde serão salvos os XMLs do CT-e. Para este contexto de DistribuicaoDFe e considerando que você definiu o valor false para o SalvarArq, diria que não há necessidade. Mas no geral, o preenchimento dela é sim necessário. Diego FolieniAjude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976. Discord Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!
Membros Pro TimeB256 Postado 2 Janeiro Autor Membros Pro Postado 2 Janeiro Muito obrigado, muito esclarecedor. Pode fechar o post. 1
Consultores Diego Foliene Postado 2 Janeiro Consultores Postado 2 Janeiro Obrigado por reportar. Fechando. Para novas dúvidas, criar um novo tópico. Diego FolieniAjude o Projeto ACBr crescer - Assine o SAC (15) 2105-0750 (15)99790-2976. Discord Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!
Recommended Posts