Status NFe 4.00 - C#

6 respostas
programação
M

Pessoal, bom dia.

Gerei a Classe a partir do XSD da nota eletrônica. Gerei a classe também a partir do WSDL.

Segue:

Classe a partir do XSD

using NfeNFCe.infNFe.ide;
using NfeNFCe.util;
using System.Xml.Serialization;

[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.portalfiscal.inf.br/nfe")]
[System.Xml.Serialization.XmlRootAttribute("consStatServ", Namespace="http://www.portalfiscal.inf.br/nfe", IsNullable=false)]
public partial class TConsStatServ {
    
    private NfeNFCe.util.TAmb tpAmbField;
    
    private TCodUfIBGE cUFField;
    
    private TConsStatServXServ xServField;
    
    private string versaoField;
    
    /// <remarks/>
    public NfeNFCe.util.TAmb tpAmb {
        get {
            return this.tpAmbField;
        }
        set {
            this.tpAmbField = value;
        }
    }
    
    /// <remarks/>
    public TCodUfIBGE cUF {
        get {
            return this.cUFField;
        }
        set {
            this.cUFField = value;
        }
    }
    
    /// <remarks/>
    public TConsStatServXServ xServ {
        get {
            return this.xServField;
        }
        set {
            this.xServField = value;
        }
    }
    
    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="token")]
    public string versao {
        get {
            return this.versaoField;
        }
        set {
            this.versaoField = value;
        }
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("xsd", "4.6.1055.0")]
[System.SerializableAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(AnonymousType=true, Namespace="http://www.portalfiscal.inf.br/nfe")]
public enum TConsStatServXServ {
    
    /// <remarks/>
    STATUS,
}

E a classe, a partir do WSDL:

//------------------------------------------------------------------------------
// <auto-generated>
//     O código foi gerado por uma ferramenta.
//     Versão de Tempo de Execução:4.0.30319.42000
//
//     As alterações ao arquivo poderão causar comportamento incorreto e serão perdidas se
//     o código for gerado novamente.
// </auto-generated>
//------------------------------------------------------------------------------

using System;
using System.ComponentModel;
using System.Diagnostics;
using System.Web.Services;
using System.Web.Services.Protocols;
using System.Xml.Serialization;

// 
// This source code was auto-generated by wsdl, Version=4.6.1055.0.
// 


/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Web.Services.WebServiceBindingAttribute(Name="NFeStatusServico4Soap", Namespace="http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2")]
public partial class NFeStatusServico4 : System.Web.Services.Protocols.SoapHttpClientProtocol {
    
    private System.Threading.SendOrPostCallback nfeStatusServicoNFOperationCompleted;
    
    /// <remarks/>
    public NFeStatusServico4() {
        this.Url = "https://www.sefazvirtual.fazenda.gov.br/NFeStatusServico4/NFeStatusServico4.asmx";
    }
    
    /// <remarks/>
    public event nfeStatusServicoNFCompletedEventHandler nfeStatusServicoNFCompleted;
    
    /// <remarks/>
    [System.Web.Services.Protocols.SoapDocumentMethodAttribute("http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2/nfeStatusServicoNF", Use=System.Web.Services.Description.SoapBindingUse.Literal, ParameterStyle=System.Web.Services.Protocols.SoapParameterStyle.Bare)]
    [return: System.Xml.Serialization.XmlElementAttribute(Namespace="http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2")]
    public System.Xml.XmlNode nfeStatusServicoNF([System.Xml.Serialization.XmlElementAttribute(Namespace="http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2")] string nfeDadosMsg) {
        object[] results = this.Invoke("nfeStatusServicoNF", new object[] {
                    nfeDadosMsg});
        return ((System.Xml.XmlNode)(results[0]));
    }
    
    /// <remarks/>
    public System.IAsyncResult BeginnfeStatusServicoNF(string nfeDadosMsg, System.AsyncCallback callback, object asyncState) {
        return this.BeginInvoke("nfeStatusServicoNF", new object[] {
                    nfeDadosMsg}, callback, asyncState);
    }
    
    /// <remarks/>
    public System.Xml.XmlNode EndnfeStatusServicoNF(System.IAsyncResult asyncResult) {
        object[] results = this.EndInvoke(asyncResult);
        return ((System.Xml.XmlNode)(results[0]));
    }
    
    /// <remarks/>
    public void nfeStatusServicoNFAsync(string nfeDadosMsg) {
        this.nfeStatusServicoNFAsync(nfeDadosMsg, null);
    }
    
    /// <remarks/>
    public void nfeStatusServicoNFAsync(string nfeDadosMsg, object userState) {
        if ((this.nfeStatusServicoNFOperationCompleted == null)) {
            this.nfeStatusServicoNFOperationCompleted = new System.Threading.SendOrPostCallback(this.OnnfeStatusServicoNFOperationCompleted);
        }
        this.InvokeAsync("nfeStatusServicoNF", new object[] {
                    nfeDadosMsg}, this.nfeStatusServicoNFOperationCompleted, userState);
    }
    
    private void OnnfeStatusServicoNFOperationCompleted(object arg) {
        if ((this.nfeStatusServicoNFCompleted != null)) {
            System.Web.Services.Protocols.InvokeCompletedEventArgs invokeArgs = ((System.Web.Services.Protocols.InvokeCompletedEventArgs)(arg));
            this.nfeStatusServicoNFCompleted(this, new nfeStatusServicoNFCompletedEventArgs(invokeArgs.Results, invokeArgs.Error, invokeArgs.Cancelled, invokeArgs.UserState));
        }
    }
    
    /// <remarks/>
    public new void CancelAsync(object userState) {
        base.CancelAsync(userState);
    }
}

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
public delegate void nfeStatusServicoNFCompletedEventHandler(object sender, nfeStatusServicoNFCompletedEventArgs e);

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "4.6.1055.0")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
public partial class nfeStatusServicoNFCompletedEventArgs : System.ComponentModel.AsyncCompletedEventArgs {
    
    private object[] results;
    
    internal nfeStatusServicoNFCompletedEventArgs(object[] results, System.Exception exception, bool cancelled, object userState) : 
            base(exception, cancelled, userState) {
        this.results = results;
    }
    
    /// <remarks/>
    public System.Xml.XmlNode Result {
        get {
            this.RaiseExceptionIfNecessary();
            return ((System.Xml.XmlNode)(this.results[0]));
        }
    }
}

E aí o método de serviço que faz a consulta de Status

public TRetConsStatServ NfeStatusServico()
        {
            try
            {
                //Obtém Certificado Digital
                X509Certificate certificado = null;
                if(empresa.tipoCertificado == 1)
                    certificado = CertificadoDigital.SelecionarCertificadoA1(empresa.certificado, empresa.senhaCertificado);
                else if (empresa.tipoCertificado == 3)
                    certificado = CertificadoDigital.SelecionarCertificadoA3(empresa.certificado, empresa.senhaCertificado);

                //Objeto do Webservice
                //NfeStatusServico2 ws2 = new NfeStatusServico2();
                NFeStatusServico4 ws4 = new NFeStatusServico4();

                //Url Destino
                //ws2.Url = Conversoes.ObterUrlTipoServico(empresa, "STATUS");
                ws4.Url = "https://homologacao.nfe.fazenda.sp.gov.br/ws/nfestatusservico4.asmx";

                //Version SOAP
                ws4.SoapVersion = System.Web.Services.Protocols.SoapProtocolVersion.Soap12;

                //Cabecalho
                //ws2.nfeCabecMsgValue = new nfeCabecMsg();
                //ws2.nfeCabecMsgValue.cUF = Convert.ToString(cidade.codigoEstado);
                //ws2.nfeCabecMsgValue.versaoDados = "3.10";

                //Vinculação Certificado Digital do WebService
                //ws2.ClientCertificates.Add(certificado);
                ws4.ClientCertificates.Add(certificado);

                //Montagem do objeto
                TConsStatServ c = new TConsStatServ();
                c.cUF = Conversoes.ObterEstado(cidade);
                c.tpAmb = Conversoes.ObterTipoAmbiente(empresa);
                c.versao = "4.00";//Ou 3.10
                c.xServ = TConsStatServXServ.STATUS;
                
                //Conversao do objeto em XML
                String xmlConteudo = FuncoesXml.ClasseParaXmlString(c);

                //Validação
                //ValidarStatusServico.validar(empresa, xmlConteudo);

                //Encapular XML no XmlDocumento para envio ao serviço (Somente na 3.10)
                XmlDocument myXMLDoc = new XmlDocument();
                myXMLDoc.PreserveWhitespace = true;
                myXMLDoc.LoadXml(xmlConteudo);

                //Chamada ao servico de Status NFe e conversão do retorno
                //XmlNode respostaXml = ws2.nfeStatusServicoNF2(myXMLDoc);
                XmlNode respostaXml4 = ws4.nfeStatusServicoNF(xmlConteudo);
                
                //Conversão da Resposta do WebService
                //TRetConsStatServ retorno2 = FuncoesXml.XmlStringParaClasse<TRetConsStatServ>(respostaXml.OuterXml);
                TRetConsStatServ retorno4 = FuncoesXml.XmlStringParaClasse<TRetConsStatServ>(respostaXml4.OuterXml);

                return retorno4;
                //return retorno2;

            }catch(Exception e)
            {
                throw new Exception(e.Message);
            }
        }

Na versão 3.10 funciona normalmente.
Na 4 não.

Ele retorna o erro:
{“Unable to handle request. The action ‘http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2/nfeStatusServicoNF’ was not recognized.”}

Se alguém puder me ajudar por favor.
Obrigado.

6 Respostas

alex_usa23

estou com o mesmo problema!

P

Basta antes de fazer a comunicação com o webservice informar o tipo de protocolo de segurança que deseja usar na autenticação, neste caso informei o Tls12 que é o que a SEFAZ adotou:

<strong>System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;</strong>

NFeStatusServico4 nfeStatusServico4 = new NFeStatusServico4();

nfeStatusServico4.Url = <a href="https://nfeh.sefaz.ce.gov.br/nfe4/services/NFeStatusServico4?wsdl">https://nfeh.sefaz.ce.gov.br/nfe4/services/NFeStatusServico4?wsdl</a>”;

nfeStatusServico4.ClientCertificates.Add(certificado);

nfeStatusServico4.SoapVersion = System.Web.Services.Protocols.SoapProtocolVersion.Soap12;

XmlNode node = nfeStatusServico4.nfeStatusServicoNF(nfeDadosMsg);
M

Obrigado pela ajuda amigos! Deu certinho!

L

Poderia me dizer qual tool usou para gerar as classes? Se for o XSD.exe… quais foram os parametros e os arquivos utilizados?

A

ola tudo certo? Como vc fez a função para pegar o certificado digital A1 e A3?

M

Olá. Tudo bem?
Eu tenho uma classe que gera eles pra mim.

No caso do modelo A1 do Certificado, que é aquele arquivo, eu saldo o caminho do arquivo no computador. E depois de posse deste caminho e da senha do Certificado, para usar durante o processo de assinatura digital eu utilizo um objeto da classe X509Certificate2:

using System.Security.Cryptography.X509Certificates;
X509Certificate2 certificado = new X509Certificate2("C:\Certificado\meu_certificado.p12", "senha1234");

Agora quando é o Certificado Digital modelo A3, que é aquele cartão, semelhante a um cartão de crédito ou débito em que o contribuinte depende de uma Leitora de Certificado Digital instalada… o código muda um pouquinho, pois utilizo uma caixa de diálogo listando os Certificado que estão no Sistema Operacional do usuário.

public static X509Certificate2 ListareObterDoRepositorio()
{
var store = ObterX509Store(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);
var collection = store.Certificates;
var fcollection = collection.Find(X509FindType.FindByTimeValid, DateTime.Now, true);
var scollection = X509Certificate2UI.SelectFromCollection(fcollection, "Certificados válidos:", "Selecione o certificado que deseja usar",
            X509SelectionFlag.SingleSelection);

        if (scollection.Count == 0)
        {
            throw new Exception("Nenhum certificado foi selecionado.");
        }

        store.Close();
        return scollection[0];
    }

Existem maneiras mais eficientes de fazer também. Mas esta que usei aqui funciona super bem.
Espero ter ajudado a dar uma luz na continuidade dos seus códigos.

Qualquer coisa, pergunta aqui.
Bom trabalho, boa sorte no desenvolvimento.

Criado 25 de setembro de 2017
Ultima resposta 15 de out. de 2020
Respostas 6
Participantes 5