From d19fbc7b05fca858fb6092ba65925049d92bf43f Mon Sep 17 00:00:00 2001 From: Transis ERP Date: Tue, 12 Apr 2022 16:45:54 -0300 Subject: [PATCH] Update AssessorPublicoServiceClient.cs --- .../AssessorPublicoServiceClient.cs | 93 ++++++++++++++++--- 1 file changed, 79 insertions(+), 14 deletions(-) diff --git a/src/OpenAC.Net.NFSe/Providers/AssessorPublico/AssessorPublicoServiceClient.cs b/src/OpenAC.Net.NFSe/Providers/AssessorPublico/AssessorPublicoServiceClient.cs index ceb1ace8..a07a3a93 100644 --- a/src/OpenAC.Net.NFSe/Providers/AssessorPublico/AssessorPublicoServiceClient.cs +++ b/src/OpenAC.Net.NFSe/Providers/AssessorPublico/AssessorPublicoServiceClient.cs @@ -32,17 +32,18 @@ using OpenAC.Net.Core.Extensions; using OpenAC.Net.DFe.Core; using System; +using System.Collections.Specialized; using System.Security.Cryptography.X509Certificates; using System.Text; using System.Xml.Linq; namespace OpenAC.Net.NFSe.Providers { - internal sealed class AssessorPublicoServiceClient : NFSeHttpServiceClient, IServiceClient + internal sealed class AssessorPublicoServiceClient : NFSeSoapServiceClient, IServiceClient { #region Constructors - public AssessorPublicoServiceClient(ProviderAssessorPublico provider, TipoUrl tipoUrl, X509Certificate2 certificado) : base(provider, tipoUrl, certificado) + public AssessorPublicoServiceClient(ProviderAssessorPublico provider, TipoUrl tipoUrl, X509Certificate2 certificado) : base(provider, tipoUrl, SoapVersion.Soap12) { //MessageVersion = SoapVersion.Soap11; } @@ -51,6 +52,26 @@ public AssessorPublicoServiceClient(ProviderAssessorPublico provider, TipoUrl ti #region Methods + private static string GeraHashMD5(string texto) + { + byte[] btyScr = System.Text.ASCIIEncoding.ASCII.GetBytes(texto); + + System.Security.Cryptography.MD5CryptoServiceProvider ObjMd5 = new System.Security.Cryptography.MD5CryptoServiceProvider(); + byte[] BtyRes = ObjMd5.ComputeHash(btyScr); + int Parte1 = BtyRes.Length * 2; + int Parte2 = BtyRes.Length / 8; //esta certo aqui sem (decimal) + int intTotal = Parte1 + Parte2; + StringBuilder strRes = new StringBuilder(intTotal); + + for (int intI = 0; intI <= BtyRes.Length - 1; intI++) + { + strRes.Append(BitConverter.ToString(BtyRes, intI, 1)); + } + ObjMd5?.Dispose(); + + return (strRes.ToString().TrimEnd(new char[] { ' ' })).ToLowerInvariant(); ; + } + public string Enviar(string cabec, string msg) => throw new NotImplementedException("Enviar nao implementada/suportada para este provedor."); public string EnviarSincrono(string cabec, string msg) @@ -59,9 +80,9 @@ public string EnviarSincrono(string cabec, string msg) message.Append(""); message.Append("1"); message.Append($"{Provider.Configuracoes.WebServices.Usuario}"); - message.Append($"{Provider.Configuracoes.WebServices.Senha}"); + message.Append($"{GeraHashMD5(Provider.Configuracoes.WebServices.Senha)}"); message.Append(""); - message.AppendCData(msg); + message.Append(msg); message.Append(""); message.Append(""); @@ -115,7 +136,7 @@ private string Execute(string action, string message, params string[] responseTa var result = ValidarUsernamePassword(); if (!result) throw new DFe.Core.OpenDFeCommunicationException("Faltou informar username e/ou password"); - return Execute(action, message, responseTag); + return Execute(action, message, responseTag, new string[0]); } private bool ValidarUsernamePassword() @@ -123,16 +144,60 @@ private bool ValidarUsernamePassword() return !string.IsNullOrEmpty(Provider.Configuracoes.WebServices.Usuario) && !string.IsNullOrEmpty(Provider.Configuracoes.WebServices.Senha); } - //protected override string TratarRetorno(XElement xmlDocument, string[] responseTag) - //{ - // var element = xmlDocument?.ElementAnyNs("Fault"); - // if (element == null) - // return xmlDocument?.ElementAnyNs("return")?.Value; + protected override string Execute(string soapAction, string message, string soapHeader, string[] responseTag, params string[] soapNamespaces) + { + string contetType; + NameValueCollection headers; + //switch (MessageVersion) + //{ + // case SoapVersion.Soap11: + // contetType = $"text/xml; charset={CharSet}"; + // headers = new NameValueCollection { { "SOAPAction", soapAction } }; + // break; + + // case SoapVersion.Soap12: + contetType = $"application/soap+xml; charset={CharSet};action={soapAction}"; + headers = null; + // break; + + // default: + // throw new ArgumentOutOfRangeException(); + //} + + var envelope = new StringBuilder(); + envelope.Append(""); + + envelope.Append(""); + envelope.Append(""); + envelope.Append(message); + envelope.Append(""); + envelope.Append(""); + EnvelopeEnvio = envelope.ToString(); + + Execute(contetType, "POST", headers); + + var xmlDocument = XDocument.Parse(EnvelopeRetorno); + var body = xmlDocument.ElementAnyNs("Envelope"); + var EnvelopeBody = xmlDocument.ElementAnyNs("Envelope")?.ElementAnyNs("Body")?.ElementAnyNs("Nfse.ExecuteResponse"); + if (EnvelopeBody != null) + body = EnvelopeBody; + + var retorno = TratarRetorno(body, responseTag); + if (retorno.IsValidXml()) return retorno; + + throw new OpenDFeCommunicationException(retorno); + } + + protected override string TratarRetorno(XElement xmlDocument, string[] responseTag) + { + var element = xmlDocument?.ElementAnyNs("Fault"); + if (element == null) + return xmlDocument?.ElementAnyNs("return")?.Value; - // var exMessage = $"{element.ElementAnyNs("faultcode").GetValue()} - {element.ElementAnyNs("faultstring").GetValue()}"; - // throw new OpenDFeCommunicationException(exMessage); - //} + var exMessage = $"{element.ElementAnyNs("faultcode").GetValue()} - {element.ElementAnyNs("faultstring").GetValue()}"; + throw new OpenDFeCommunicationException(exMessage); + } #endregion Methods } -} \ No newline at end of file +}