none
Retorno de Autorização Nfe 3.10 (MG) C# RRS feed

  • Pergunta

  • Estou com uma dificuldade na hora do retorno da autorização da NF-e utilizando C# (Visual Studio 2008). Está retornando um objeto vazio.

    Para ser feita a chamada do WS estou utilizando o seguinte código:

    public string NFeAutorizacao(string XmlEnvio, string VersaoSchema, short Ambiente, short CodIbgeUfEmi, string SiglaWS, string PathCertificado, string SenhaCertificado, ref string MsgErr, ref short FlagErr)
        {
            try
            {
                // Converte dados do xml para XmlNode
                XmlDocument oXmlDoc = new XmlDocument();
                oXmlDoc.LoadXml(XmlEnvio);
                XmlNode oNode = oXmlDoc.DocumentElement;
                // Carrega o certificado
                X509Certificate certificado = new X509Certificate();
                certificado = SelecionarCertificado(PathCertificado, SenhaCertificado, ref MsgErr, ref FlagErr);
    
                // Se conseguiu localizar o certificado digital
                if (FlagErr == 0)
                {
                    // Identifica  o WebService a ser utilizado: "SEFAZ Estadual", "Ambiente Nacional" ou "SCAN"
                    switch (SiglaWS)
                    {
                        case "SEFAZEST": // WebService da SEFAZ Estadual ou Virtual
                            // Identifica o ambiente a ser utilizado
                            switch (Ambiente)
                            {
                                //Ambiente de Homologação
                                #region
                                case 2: // HOMOLOGAÇÃO
                                    // Identifica o código IBGE do Estado
                                    switch (CodIbgeUfEmi)
                                    {
                                        case 31: // MG
                                            // Declara as variáveis do WebService
    
                                            MG.NfeAutorizacao.Homologacao.NfeAutorizacao wsMG = new BibliotecaNFe.MG.NfeAutorizacao.Homologacao.NfeAutorizacao();
                                            MG.NfeAutorizacao.Homologacao.nfeCabecMsg nfeCabecMsgMG = new BibliotecaNFe.MG.NfeAutorizacao.Homologacao.nfeCabecMsg();
                                            MG.NfeAutorizacao.Homologacao.nfeDadosMsg nfeDadosMsgMG = new BibliotecaNFe.MG.NfeAutorizacao.Homologacao.nfeDadosMsg();
    
                                            // Coloca os valores no cabeçalho
    
                                            nfeCabecMsgMG.cUF = CodIbgeUfEmi.ToString().Trim();
                                            nfeCabecMsgMG.versaoDados = VersaoSchema;
                                            wsMG.nfeCabecMsgValue = nfeCabecMsgMG;
                                            nfeDadosMsgMG.Any = new XmlNode[] {oXmlDoc};
                                            nfeDadosMsgMG.Any[0] = oNode;
    
                                            // Coloca o certificado
                                            wsMG.ClientCertificates.Add(certificado);
                                            wsMG.Timeout = 120000;
    
                                            // Comunica com o WebService
                                            string obj = nfeDadosMsgMG.Any[0].OuterXml;
                                            Console.WriteLine(obj);
    
                                            string retorno = wsMG.NfeAutorizacaoLote(nfeDadosMsgMG).ToString();
                                            Console.WriteLine(retorno);
    
    
                                            return wsMG.NfeAutorizacaoLote(nfeDadosMsgMG).ToString();
                                        default: // Código não foi informado ou é inválido
                                            FlagErr = 1;
                                            MsgErr = "Erro: Código da UF informada " + CodIbgeUfEmi.ToString().Trim() + ". Código inválido ou SEFAZ não possui WebService próprio.";
                                            return "";
                                    }  // switch (CodIbgeUfEmi)
    
                                default: // Ambiente incorreto (Diferente de 1 e 2)
                                    FlagErr = 1;
                                    MsgErr = "Erro: Ambiente informado: " + Ambiente.ToString().Trim() + ". Informe um código de ambiente válido.";
                                    return "";
                            }  // switch (Ambiente)
                                #endregion
    
                        default: // WebService não informadou ou parâmetro incorreto
                            FlagErr = 1;
                            MsgErr = "Erro: Sigla do WebService a ser utilizado " + SiglaWS.Trim() + ". Informe um código válido.";
                            return "";
                    }  // switch (SiglaWS)
                }
                else
                {
                    return ""; // Retorno em branco pois houve erro
                }  // if (FlagErr == 0)
            }
            catch (Exception e)
            {
                FlagErr = 1;
                MsgErr = "Erro: Não foi possível enviar o lote de NF-e à SEFAZ. " + e.Message + " - " + e.StackTrace.ToString();//"Erro: Não foi possível enviar o lote de NF-e à SEFAZ. " + e.Message + "\n" + e.InnerException.ToString() + "\n" + e.StackTrace.ToString();
                return "";
            }
        }

    Beleza... É realizada a comunicação com a SeFaz e autorizada a nota (se você consultar a chave de acesso, ela estará lá normalmente) Porém dentro do método do WS, quando é realizado o "Invoke", é retornado um objeto vazio.

    No webservice, é nessa linha:

    object[] results = this.Invoke("NfeAutorizacaoLote", new object[] {
                        nfeDadosMsg});

    o Results[] retorna um objeto sem valores...

    Estou com essa dificuldade pois necessitava do XML de retorno para atualizar a NF-e em meu sistema.

    Gostaria de saber o que estou fazendo errado nessa chamada ou na instanciação do retorno?

    Se necessário, posso enviar um vídeo com breakpoints e o projeto.

    sexta-feira, 13 de fevereiro de 2015 13:37

Todas as Respostas

  • me envia que eu olho gmsoft.informatica@gmail.com
    sexta-feira, 13 de fevereiro de 2015 13:42
  • Entrei em contato Mr. GMSOFT. Por favor, verifique seu e-mail!

    sexta-feira, 13 de fevereiro de 2015 16:55
  • Ok vou verificar
    sexta-feira, 13 de fevereiro de 2015 17:14
  • Olá, alguma novidade com o tópico?

    Acho que a declaração dos serviços de MG estão erradas minha linguagem de programação é VB mas estou com o mesmo problema, um exemplo é o serviço de Status, o retorno é do tipo lista de Object.

    Public Function nfeStatusServicoNF2(nfeDadosMsg As Fiscal.MGH_NfeStatusServico2.nfeDadosMsg) As Object()


    Att

    Valdeir

    sexta-feira, 27 de fevereiro de 2015 18:11
  • Faz um breakpoint nessa variável e verifica se a mesma esta recebendo valores
    nfeDadosMsg

    A vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    segunda-feira, 2 de março de 2015 13:37
  • Minha função está assim:

        Public Function Autorizacao(ByVal Doc As System.Xml.XmlDocument) As System.Xml.XmlDocument
            Dim Consulta As New MGH_NfeAutorizacao.NfeAutorizacao
            Consulta.ClientCertificates.Add(Certificado)
            Consulta.nfeCabecMsgValue = New MGH_NfeAutorizacao.nfeCabecMsg
            Consulta.nfeCabecMsgValue.cUF = CodigoUF(UF)
            Consulta.nfeCabecMsgValue.versaoDados = "3.00"
            Dim NFeDados As New MGH_NfeAutorizacao.nfeDadosMsg()
            NFeDados.Any = New System.Xml.XmlNode() {Doc}
            Dim Retorno As Object = Consulta.NfeAutorizacaoLote(NFeDados)
            Autorizacao= New Xml.XmlDocument
            '..:Tentei fazer a conversão do retorno, mas ele vem como uma lista de object vazia
            'Autorizacao.LoadXml(CType(Retorno, System.Xml.XmlDocument).OuterXml)
    
        End Function
    Os outros estados estão funcionando perfeitamente!


    segunda-feira, 2 de março de 2015 16:26
  • Me mostra os valores que essa linha gera no breakpoint

     Dim Retorno As Object = Consulta.NfeAutorizacaoLote(NFeDados)

    A vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    segunda-feira, 2 de março de 2015 18:34
  • Retorno.Length = 0
    segunda-feira, 2 de março de 2015 20:47
  • Estou com o mesmo problema MG 3.10, já tentei alterar a classe do webservice para receber xmlNode e não consegui nada, além de retornos [0], null e exceptions

    Eu achei esse site que dizem que conseguiram mas também não consegui

    https://ideiasdefenestradas.wordpress.com/2014/09/11/trabalhando-de-graca-para-o-governo-nf-e-3-10/

    Não aguento mais a SEFAZ, todos os outros estão funcionando normalmente

    segunda-feira, 2 de março de 2015 21:12
  • KKKK você não entendeu o que estou questionando, eu quero saber se antes de você atribuir para Retorno se a variavel NFeDados possui valores

    A vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    terça-feira, 3 de março de 2015 11:46
  • No meu caso sim, eu atribui o meu xml no Any[0] 
    terça-feira, 3 de março de 2015 12:15
  • Então Dacceto você possui valores mais depois que atribui a variavel permanece com esses valores, como você a chama Retorno.Any[0] ou somente Retorno?

    A vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    terça-feira, 3 de março de 2015 12:22
  • Somente retorno, e dentro do retorno tem um array de nada
    terça-feira, 3 de março de 2015 13:07
  • Estou com o mesmo problema...alguem já conseguiu?

    O retorno é vazio, porem, se consultar a NFe no portal, ela foi enviada e autorizada com sucesso.

    quarta-feira, 4 de março de 2015 17:49
  • Consegui resolver com esse link, mas ainda não sei onde atribuir dados de lote, porque pelo que entendi cada posição do any é uma nfe mas os dados de lote onde vão?

    http://pt.stackoverflow.com/questions/50629/retorno-de-autoriza%C3%A7%C3%A3o-nfe-3-10-mg-c/50720#50720

    Fora isso, o retorno disso é péssimo, é um array por cada posição do any e dentro um array de xmlnode, pq eles não retornam o XML!?!!??!!? AQUIII É O BRASIL!!!!  


    sexta-feira, 6 de março de 2015 12:26
  • Infelizmente para esse pessoal que criam essas obrigações o importante é recolher tão pouco importa para os demais detalhes e fazem as coisas as pressas sem ao menos testar seu funcionamento.

    A vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    sexta-feira, 6 de março de 2015 12:37
  • Você sabe esse negócio do lote, onde eu informo? 
    sexta-feira, 6 de março de 2015 14:48
  • Você esta baixando/enviando  por lote ou individual?

    A vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    sexta-feira, 6 de março de 2015 14:51
  • Enviando por lote

    Pelo que entendi nesse Any não vai lote.

    sexta-feira, 6 de março de 2015 16:49
  • E por que não faz um foreach para ler todos os elementos ao invés de usar Any?

    A vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    sexta-feira, 6 de março de 2015 16:51
  • o Any é a propriedade do webService.

    é um array que coloco uma nf em cada posição. Nos outros ws eu envio um xml com varias nfs de uma vez e valores de lote tambem agrupando as nfs

    sexta-feira, 6 de março de 2015 17:00
  • A solução foi criar a classe do webservice na mão, um outro dev tinha criado, ficou assim:

    public partial class nfeCabecMsg : SoapHeader
    {
        private string _cUF;
    
        public string cUF
        {
            get { return _cUF; }
            set { _cUF = value; }
        }
        private string _versaoDados;
    
        public string versaoDados
        {
            get { return _versaoDados; }
            set { _versaoDados = value; }
        }
    }
    
    [WebServiceBindingAttribute(Name = "NfeRetAutorizacaoSoap12", Namespace = "http://www.portalfiscal.inf.br/nfe/wsdl/NfeRetAutorizacao")]
    public partial class NfeRetAutorizacao : System.Web.Services.Protocols.SoapHttpClientProtocol
    {
    
        private nfeCabecMsg nfeCabecMsgValueField;
    
        private bool useDefaultCredentialsSetExplicitly;
    
        /// <remarks/>
        public NfeRetAutorizacao()
        {
            this.SoapVersion = System.Web.Services.Protocols.SoapProtocolVersion.Soap12;
            this.Url = global::Skill.T10.NFe.Properties.Settings.Default.Skill_T10_NFe_wsMGPRetAutorizacao_NfeRetAutorizacao;
            if ((this.IsLocalFileSystemWebService(this.Url) == true))
            {
                this.UseDefaultCredentials = true;
                this.useDefaultCredentialsSetExplicitly = false;
            }
            else
            {
                this.useDefaultCredentialsSetExplicitly = true;
            }
        }
    
        public nfeCabecMsg nfeCabecMsgValue
        {
            get
            {
                return this.nfeCabecMsgValueField;
            }
            set
            {
                this.nfeCabecMsgValueField = value;
            }
        }
    
        public new string Url
        {
            get
            {
                return base.Url;
            }
            set
            {
                if ((((this.IsLocalFileSystemWebService(base.Url) == true)
                            && (this.useDefaultCredentialsSetExplicitly == false))
                            && (this.IsLocalFileSystemWebService(value) == false)))
                {
                    base.UseDefaultCredentials = false;
                }
                base.Url = value;
            }
        }
    
        public new bool UseDefaultCredentials
        {
            get
            {
                return base.UseDefaultCredentials;
            }
            set
            {
                base.UseDefaultCredentials = value;
                this.useDefaultCredentialsSetExplicitly = true;
            }
        }
    
    
        private bool IsLocalFileSystemWebService(string url)
        {
            if (((url == null)
                        || (url == string.Empty)))
            {
                return false;
            }
            System.Uri wsUri = new System.Uri(url);
            if (((wsUri.Port >= 1024)
                        && (string.Compare(wsUri.Host, "localHost", System.StringComparison.OrdinalIgnoreCase) == 0)))
            {
                return true;
            }
            return false;
        }
    
        [SoapHeaderAttribute("nfeCabecMsgValue", Direction = SoapHeaderDirection.InOut)]
        [SoapDocumentMethodAttribute("http://www.portalfiscal.inf.br/nfe/wsdl/NfeRetAutorizacao/nfeRetAutorizacaoLote", Use = System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle = System.Web.Services.Protocols.SoapParameterStyle.Bare)]
        public XmlNode nfeRetAutorizacaoLote(XmlNode nfeDadosMsg)
        {
            XmlNode _retorno = null;
    
            object[] results = this.Invoke("nfeRetAutorizacaoLote", new object[] { nfeDadosMsg });
    
            _retorno = (System.Xml.XmlNode)(results[0]);
    
    
            return (_retorno);
        }
    }

    • Sugerido como Resposta Mr. GMSOFT sexta-feira, 13 de março de 2015 01:08
    quinta-feira, 12 de março de 2015 20:20
  • Caso tenha conseguido a solução finalize sua Thread marcando a resposta

    GTSA vantagem de ser inteligente é que podemos fingir que somos imbecis enquanto ao contrario é completamente impossivel

    domingo, 28 de junho de 2015 14:13