/// <summary> /// Retorna o WebService de Recepção do MDFe. (Produção) /// </summary> /// <param name="manifestoEletronico">O Manifesto Eletronico que será enviado.</param> /// <param name="caminhoCert">O caminho da pasta que contém o certificado. Pode ser null ou vazio para usar a pasta padrão.</param> /// <returns></returns> public static wsPSVRSMDFeRecepcao.MDFeRecepcao PSVRSMDFeRecepcao(ManifestoEletronico manifestoEletronico, string caminhoCert) { wsPSVRSMDFeRecepcao.MDFeRecepcao retorno = new wsPSVRSMDFeRecepcao.MDFeRecepcao(); // Define 90 segundos de espera, para evitar timeout retorno.Timeout = 90000; // Recupera o participante para buscar o certificado e preenche a UF do emitente var participante = manifestoEletronico.Participantes.Where(f => f.TipoParticipante == TipoParticipanteEnum.Emitente).FirstOrDefault(); // Define o certificado a ser utilizado na comunicação retorno.ClientCertificates.Add(GetCertificado((uint)participante.IdLoja.Value, caminhoCert)); // Monta o cabeçalho do SOAP retorno.SoapVersion = System.Web.Services.Protocols.SoapProtocolVersion.Soap12; retorno.mdfeCabecMsgValue = new wsPSVRSMDFeRecepcao.mdfeCabecMsg(); retorno.mdfeCabecMsgValue.cUF = LojaDAO.Instance.GetElement((uint)participante.IdLoja.Value).CodUf; // Cód UF do Emissor retorno.mdfeCabecMsgValue.versaoDados = ConfigMDFe.VersaoRecepcao; // Versão da mensagem envelopada no SOAP return(retorno); }
/// <summary> /// Envia pedido de encerramento do MDFe para SEFAZ /// </summary> /// <param name="idManifestoEletronico"></param> /// <returns></returns> public static string EnviaEncerramento(int idManifestoEletronico) { ManifestoEletronico mdfe = null; try { // Busca dados do MDFe mdfe = ManifestoEletronicoDAO.Instance.ObterManifestoEletronicoPeloId(idManifestoEletronico); // Busca XML de encerramento XmlDocument xmlEncerramento = ManifestoEletronicoDAO.Instance.GerarXmlMDFeEncerramento(mdfe); #region Envia XML // Salva o callback padrão do WebService System.Net.Security.RemoteCertificateValidationCallback callback = System.Net.ServicePointManager.ServerCertificateValidationCallback; // Instancia xml de retorno XmlNode xmlRetorno = null; // Realiza 3 tentativas de envio, se não funcionar, gera mensagem de erro for (int i = 0; i < 3; i++) { try { // Altera o callback de validação do WebService System.Net.ServicePointManager.ServerCertificateValidationCallback = delegate(object sender, System.Security.Cryptography.X509Certificates.X509Certificate cert, System.Security.Cryptography.X509Certificates.X509Chain chain, System.Net.Security.SslPolicyErrors error) { // Verifica se a data do certificado é válida DateTime beginDate = DateTime.Parse(cert.GetEffectiveDateString()); DateTime endDate = DateTime.Parse(cert.GetExpirationDateString()); bool isDateValid = (DateTime.Now >= beginDate) && (DateTime.Now <= endDate); // Retorna o resultado da função return(isDateValid); }; #region Envia o arquivo e recebe o retorno if (mdfe.TipoEmissao == TipoEmissao.Normal) { if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao) { xmlRetorno = GetWebService.PSVRSMDFeRecepcaoEvento(mdfe, null).mdfeRecepcaoEvento(xmlEncerramento); } // TipoAmbienteMDFe.Homologacao else { xmlRetorno = GetWebService.HSVRSMDFeRecepcaoEvento(mdfe, null).mdfeRecepcaoEvento(xmlEncerramento); } } // TipoEmissao.Contingencia else { if (ConfigMDFe.TipoAmbiente == ConfigMDFe.TipoAmbienteMDFe.Producao) { xmlRetorno = GetWebService.PSVRSMDFeRecepcaoEvento(mdfe, null).mdfeRecepcaoEvento(xmlEncerramento); } // TipoAmbienteMDFe.Homologacao else { xmlRetorno = GetWebService.HSVRSMDFeRecepcaoEvento(mdfe, null).mdfeRecepcaoEvento(xmlEncerramento); } } #endregion break; } catch (Exception ex) { if (i == 2) { LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Encerramento", 1, "Falha ao encerrar MDFe. " + ex.Message); ManifestoEletronicoDAO.Instance.AlteraSituacao(idManifestoEletronico, SituacaoEnum.FalhaEncerrar); throw new Exception(ex.Message); } } finally { // Restaura o callback padrão para o WebService System.Net.ServicePointManager.ServerCertificateValidationCallback = callback; } } #endregion #region Lê Xml de retorno do envio do encerramento // Realiza procedimentos de encerramento de MDFe return(ManifestoEletronicoDAO.Instance.RetornoEventoMDFe(idManifestoEletronico, xmlRetorno, "110112")); #endregion } catch (Exception ex) { LogMDFeDAO.Instance.NewLog(idManifestoEletronico, "Encerramento", 1, "Falha ao encerrar MDFe. " + ex.Message); if (mdfe.Situacao != SituacaoEnum.Encerrado) { ManifestoEletronicoDAO.Instance.AlteraSituacao(idManifestoEletronico, SituacaoEnum.FalhaEncerrar); } throw ex; } }
/// <summary> /// Retorna o WebService de recepção do MDFe. (Produção) /// </summary> /// <param name="manifestoEletronico">O Manifesto Eletronico do evento</param> /// <param name="caminhoCert">O caminho da pasta que contém o certificado. Pode ser null ou vazio para usar a pasta padrão.</param> /// <returns></returns> public static wsPSVRSMDFeRecepcaoEvento.MDFeRecepcaoEvento PSVRSMDFeRecepcaoEvento(ManifestoEletronico manifestoEletronico, string caminhoCert) { try { wsPSVRSMDFeRecepcaoEvento.MDFeRecepcaoEvento retorno = new wsPSVRSMDFeRecepcaoEvento.MDFeRecepcaoEvento(); // Define 200 segundos de espera, para evitar timeout retorno.Timeout = 200000; // Recupera o participante para buscar o certificado e preenche a UF do emitente var participante = manifestoEletronico.Participantes.Where(f => f.TipoParticipante == TipoParticipanteEnum.Emitente).FirstOrDefault(); // Define o certificado a ser utilizado na comunicação retorno.ClientCertificates.Add(GetCertificado((uint)participante.IdLoja.Value, caminhoCert)); // Monta o cabeçalho do SOAP retorno.SoapVersion = System.Web.Services.Protocols.SoapProtocolVersion.Soap12; retorno.mdfeCabecMsgValue = new wsPSVRSMDFeRecepcaoEvento.mdfeCabecMsg(); retorno.mdfeCabecMsgValue.cUF = LojaDAO.Instance.GetElement((uint)participante.IdLoja.Value).CodUf; // Cód UF do Emissor retorno.mdfeCabecMsgValue.versaoDados = ConfigMDFe.VersaoRecepcaoEvento; // Versão da mensagem (lote) envelopada no SOAP return(retorno); } catch (Exception ex) { //LogNfDAO.Instance.NewLog(manifestoEletronico.IdNf, "Instaciar Webservice", 3, Glass.MensagemAlerta.FormatErrorMsg("Falha ao instanciar webservice.", ex)); return(null); } }