Cliente Web Service NfeStatusServico2

Caros estou tendo problemas para consultar o status do serviço da Nota Fiscal eletrônica.

Código Fonte:

			String nms = "http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2";
                        String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><consStatServ versao=\"2.00\"><tpAmb>2</tpAmb><cUF>27</cUF><xServ>STATUS</xServ></consStatServ>";

			//WSDL URL
			URL wsdlLocation = new URL("https://homologacao.nfe.sefazvirtual.rs.gov.br/ws/NfeStatusServico/NfeStatusServico2.asmx?wsdl");

			//Qname for service
			QName serviceName = new QName(nms, "NfeStatusServico2");
			QName portName = new QName(nms, "NfeStatusServico2Soap12");

			//Create a dynamic Service instance
			Service service = Service.create(wsdlLocation, serviceName);

			/** Crie uma instância Dispatch a partir de um serviço.**/
			Dispatch<SOAPMessage> dispatch = service.createDispatch(portName, SOAPMessage.class, Service.Mode.MESSAGE);
			
			// Use Dispatch as BindingProvider
			BindingProvider bp = (BindingProvider) dispatch;

			// Optionally Configure RequestContext to send SOAPAction HTTP Header
			Map<String, Object> rc = bp.getRequestContext();
			rc.put(BindingProvider.SOAPACTION_USE_PROPERTY, Boolean.TRUE);
			rc.put(BindingProvider.SOAPACTION_URI_PROPERTY, "http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico2/nfeStatusServicoNF2");

			/** Crie o pedido SOAPMessage. **/
			MessageFactory mf = ((SOAPBinding) bp.getBinding()).getMessageFactory();

			// Crie uma mensagem. Esse exemplo trabalha com SOAPPART.
			SOAPMessage request = mf.createMessage();
			
			// Obtenha o SOAPEnvelope e os elementos header e body.
			SOAPHeader header = request.getSOAPHeader();
			SOAPBody body = request.getSOAPBody();

			// Construa o cabeçalho
			SOAPHeaderElement nfeCabecMsg = header.addHeaderElement(new QName(nms, "nfeCabecMsg"));
			SOAPElement cUF = nfeCabecMsg.addChildElement("cUF");
			cUF.addTextNode("AL");
			SOAPElement versaoDados = nfeCabecMsg.addChildElement("versaoDados");
			versaoDados.addTextNode("2.00");
			// Construa a carga útil da mensagem.
			SOAPBodyElement nfeStatusServico = body.addBodyElement(new QName(nms, "nfeStatusServicoNF2"));
			SOAPElement nfeDadosMsg = nfeStatusServico.addChildElement("nfeDadosMsg");
			nfeDadosMsg.addTextNode(xml);

			/** Chame o terminal em serviço. **/
			SOAPMessage response = dispatch.invoke(request);

O seguinte erro é retornado:

javax.xml.ws.soap.SOAPFaultException: Server was unable to process request. ---> Object reference not set to an instance of an object.

Alguém já passou por isso??

eu tbem estou com problemas pra usar o ws nessa versão nova.

eu uso o netbeans pra gerar os códigos e ele gerou o código abaixo:

[code]br.inf.portalfiscal.nfe.wsdl.nfestatusservico2.NfeStatusServico2 service =
new br.inf.portalfiscal.nfe.wsdl.nfestatusservico2.NfeStatusServico2();
br.inf.portalfiscal.nfe.wsdl.nfestatusservico2.NfeStatusServico2Soap12 port =
service.getNfeStatusServico2Soap12();

    br.inf.portalfiscal.nfe.wsdl.nfestatusservico2.NfeStatusServicoNF2.NfeDadosMsg nfeDadosMsg =
            new br.inf.portalfiscal.nfe.wsdl.nfestatusservico2.NfeStatusServicoNF2.NfeDadosMsg();

    br.inf.portalfiscal.nfe.wsdl.nfestatusservico2.NfeStatusServicoNF2Response.NfeStatusServicoNF2Result result =
            port.nfeStatusServicoNF2(nfeDadosMsg);

    System.out.println("Result = " + result);[/code]

mas não sei como usar o cabeçalho e o dadosnfe neste código…

se alguém souber e puder ajudar, agradeço…

vlw

Boa Tarde
Estou com o mesmo problemas mais em c#.
uma coisa que pude perceber foram que os parametros não são mais strings.
No caso do c# quando importa o arquivo wsdl ele pede como parametro o XmlNode

Não deveria ser uma string contendo o XML ?

Obrigado

Boa Tarde
pessoal conseguir resolver o erro "Object reference not set to an instance of an object " no c#
coloquei o certificado digital e set o retorno em XmlNode

e funcionou perfeitamente . espero que isso ajude

Estou com o mesmo problema, estou gerando o fonte pelo JAX-WS …

        NfeStatusServico2 servico = new NfeStatusServico2();
        NfeStatusServico2Soap12 a = servico.getNfeStatusServico2Soap12();

        NfeCabecMsg cab = new NfeCabecMsg();
        cab.setCUF("43");
        cab.setVersaoDados("2.00");

        NfeDadosMsg dados = new NfeDadosMsg();
        dados.getContent().add(new ObjectFactory().createNfeCabecMsg(cab));
        System.out.println(Arrays.toString(a.nfeStatusServicoNF2(dados).getContent().toArray()));

Se alguém puder ajudar

Consegui resolver, segue:

  1. Baixe o Apache AXIS para gerar as classes a partir do WSDl, http://ws.apache.org/axis2/download.cgi
  2. Depois de descompactar, execute dentro da pasta BIN “/wsdl2java.sh -uri NFeStatusServico2.wsdl” (Linux)
  3. Copie os fontes para a pasta do projeto, inclua as bibliotecas do Apache AXIS no projeto
        NfeStatusServico2Stub stub = new NfeStatusServico2Stub();
        NfeStatusServico2Stub.NfeDadosMsg dados = new NfeStatusServico2Stub.NfeDadosMsg();
        
        String s = "<consStatServ versao=\"2.00\" xmlns=\"http://www.portalfiscal.inf.br/nfe\">"+
		    "<tpAmb>2</tpAmb>"+
                    "<cUF>43</cUF>"+
                    "<xServ>STATUS</xServ>"+
                    "</consStatServ>";

        OMElement el = AXIOMUtil.stringToOM(s);
        dados.setExtraElement(el);

        NfeStatusServico2Stub.NfeCabecMsg cab = new NfeStatusServico2Stub.NfeCabecMsg();
        cab.setVersaoDados("2.00");
        cab.setCUF("43");
        NfeStatusServico2Stub.NfeCabecMsgE cabE = new NfeStatusServico2Stub.NfeCabecMsgE();
        cabE.setNfeCabecMsg(cab);
        
        System.out.println(stub.nfeStatusServicoNF2(dados , cabE).getExtraElement());

mate42 cara, voce conseguiu enviar a NF-e?

Eu to usando o teu exemplo e não consigo, sempre me retorna

Rejeicao: Falha no schema XML ? inexiste a tag raiz esperada para a mensagem

Ai eu tava olhando o codigo e quando eu faço ele retira a tag

Como que eu posso fazer pra ele enviar corretamente a mensagem?

Posta seu código, dai posso da uma analisada :slight_smile: !

Creio que vocês saibam, este assunto está sendo bastante discutido neste outro forum:

http://www.guj.com.br/posts/list/480/72325.java#1018290

Abracos.

Alencar

Olá Mate42.

Cara eu to fazendo assim.

		NfeRecepcao2Stub.NfeCabecMsg cabecalho = new NfeRecepcao2Stub.NfeCabecMsg();
		cabecalho.setCUF("43");
		cabecalho.setVersaoDados("2.00");

		NfeRecepcao2Stub.NfeCabecMsgE cabE = new NfeRecepcao2Stub.NfeCabecMsgE();     
		cabE.setNfeCabecMsg(cabecalho);     
		
		OMElement el = null;
		try {
			el = AXIOMUtil.stringToOM(nfeDadosMsg);
		} catch (XMLStreamException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}
		
		el.build();
		System.out.println("el -> " + el.toString());
		
		NfeRecepcao2Stub.NfeDadosMsg dadosMsg = new NfeRecepcao2Stub.NfeDadosMsg();
		dadosMsg.setExtraElement(el);

		NfeRecepcao2Stub.NfeRecepcaoLote2Result result = null;
		try {
			result = new NfeRecepcao2Stub().nfeRecepcaoLote2(dadosMsg, cabE);			
		} catch (AxisFault e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (RemoteException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		System.out.println("Result: " + result.getExtraElement().toString());  

Ta como que eu to enviando, mas, ele sempre dá aquele erro.

Mac, tem certeza que deve ser assim?

result = new NfeRecepcao2Stub().nfeRecepcaoLote2(dadosMsg, cabE);

E não:

result = new NfeRecepcao2Stub.NfeRecepcaoLote2(dadosMsg, cabe);

?
Eu fiz esse código hoje, mas não consigo lembrar o que fiz :\

Aliás, vi que você falou que ele tira o <xml…> né? Você já tentou montar como string mesmo e colocar no NfeDadosMsg? Porque tem uma parte do xml que fica sem o <xml…> mesmo, que é o conteúdo em si. Se não me falha a memória ele só colocar o <xml…> quando está envelopando o bixo (não acredite totalmente porque não tenho nem um pingo de certeza do que estou falando :p).

[quote=Mackrophus]Olá Mate42.

Cara eu to fazendo assim.

...

[/quote]

Muito parecido com o meu, mas não uso o e1.build().
Detalhe: na minha String xml também contém o header <?.. e não tenho problemas com isso. Pelo menos até agora :slight_smile:

        try {
            OMElement ome = AXIOMUtil.stringToOM(this.xml);
            NfeRecepcao2Stub.NfeDadosMsg dadosMsg = new NfeRecepcao2Stub.NfeDadosMsg();
            dadosMsg.setExtraElement(ome);

            NfeRecepcao2Stub.NfeCabecMsg nfeCabecMsg = new NfeRecepcao2Stub.NfeCabecMsg();
            nfeCabecMsg.setCUF(this.config.getCodigoUF());
            nfeCabecMsg.setVersaoDados(this.layoutDados);
            NfeRecepcao2Stub.NfeCabecMsgE nfeCabecMsgE = new NfeRecepcao2Stub.NfeCabecMsgE();
            nfeCabecMsgE.setNfeCabecMsg(nfeCabecMsg);

            NfeRecepcao2Stub stub = new NfeRecepcao2Stub();
            xmlRetorno = stub.nfeRecepcaoLote2(dadosMsg, nfeCabecMsgE).getExtraElement().toString();
        } catch (Exception e) {
            Utils.gravaLog("Erro enviando lote de notas: " + e.getMessage());
            xmlRetorno = "";
            return false;
        }

Alencar

ninguem fez com JAX-WS não ???

O JAX-WS faz a mesma coisa, só cria mais arquivos… No final das contas dá tudo na mesma…

Olá, pessoal.

Estou com problemas com esse serviço na versão 2.00

Consigo verificar status do serviço e consultar situação de NF-e sem problemas, mas quando vou enviar uma NF-e, o seguinte erro é gerado:

[color=red]Message part {http://www.portalfiscal.inf.br/nfe/wsdl/NfeRecepcao2}nfeDadosMsg was not recognized. (Does it exist in service WSDL?)[/color]

Já tentei usar os serviços de vários estados, mas o erro é o mesmo.

Utilizo C#. Se alguém tiver alguma dica, agradeço muito.

Valeu.

JJSaraiva

se faz a mesma coisa como mando nfeCabecMsg no header do SOAP ?

Quais classes foram criadas com o JAX-WS?

para o Status são essas:

NfeCabecMsg.java
NfeDadosMsg.java
NfeStatusServico2.java
NfeStatusServico2Soap12.java
NfeStatusServicoNF2Result.java
ObjectFactory.java
package-info.java

ai vai como eu estava fazendo que acredito não estar certo pois esta me dando um erro de SSLException mas com a versão antiga roda de boa, instalei certinho o certificado na aplicação.

        NfeStatusServicoNF2Result nfeStatusServicoNF2Result = null;
        webServiceClient = new br.inf.portalfiscal.nfe.wsdl.nfestatusservico2.NfeStatusServico2();
        System.out.println("Coletando a porta do servico: " + webServiceClient);

        NfeStatusServico2Soap12 webServiceInterface = webServiceClient.getNfeStatusServico2Soap12();
        System.out.println("Porta SOAP que esta sendo invocada: " + webServiceInterface);

        nfeStatusServicoNF2Result = webServiceInterface.nfeStatusServicoNF2(nfeDadosMsg);
        System.out.println("Resposta do servico: " + nfeStatusServicoNF2Result);

        CabecMsg cabecMsg = new CabecMsg();
        cabecMsg.setVersaoDados(versaoDoDados);
        cabecMsg.setCuf(uf);
        NfeDadosMsg nfeDadosMsg = new NfeDadosMsg();
        nfeDadosMsg.getContent().add(cabecMsg);
        nfeDadosMsg.getContent().add(bean);

cara sera que é erro do HTTPS ou ta estourando esse erro porque to passando os dados de forma errada pro SOAP ?

acho estranho poruqe na versão antiga não tenho esse erro, se alguem der uma luz agradeço, faltam 5 dias, abraços.

HTTP transport error: javax.net.ssl.SSLException: java.lang.RuntimeException: Unexpected error: java.security.InvalidAlgorithmParameterException: the trustAnchors parameter must be non-empty

com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:119)
com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:128)
com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:74)
com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:581)
com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:540)
com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:525)
com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:422)
com.sun.xml.internal.ws.client.Stub.process(Stub.java:235)
com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:120)
com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:230)
com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:210)
com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:103)
$Proxy30.nfeStatusServicoNF2(Unknown Source)
sefaz2.servico.WebServiceStatus.getResponse(WebServiceStatus.java:30)
sefaz2.servico.WebService.callSefaz(WebService.java:176)
sefaz2.servico.WebServiceStatus.call(WebServiceStatus.java:48)

Aix cara, dá uma verificada na cadeia de certificados do servidor, pq isso…

é relativo a trustStore que não ta achando.

Abraço.