Consumir Web service da SEFAZ [RESOLVIDO]

Pessoal boa tarde.

Estou iniciando agora nesse mundo da NFe.

Estudei uma video aula bem interessante que fala como assinar arquivos xml e tal (ate ai blza…tudo assinadinho…heehee).
Porém, tive uns problemas com o consumo do web service que verifica o status do servico.

Utilizei os WSDL da sefaz virtual do RS no meu projeto.

Não sei se foram os passos que não foram bem seguidos (por mim claro).

Mas fiz assim:

A empresa tem um certificado digital na qual trabalhamos para assinal xml e homologar o servico pela SEFAZ.

Fiz um backup deste para cria-lo em extensao “.p12”. (e Este esta inserido no browser em “certificados pessoais”).

Importei o certificado da SEFAZ RS (com extensao .cer) - “em certificados do tipo SERVIDORES”.

depois utilizei uma classe pega na internet para instalar o certifido - (Installcert.java)

compilei esta classe InstalCert pela linha de comando (DOS). Depois digitei o seguinte comando:

java Installcert

Ai sim, gerou um arquivo chamado jssecacerts.

Ufaa…rsrs

Porém, quando fui compilar a classe main para ver o retorno do status do servico, apareceu uma excessao que não consigo detectar o bendito erro…heehee

vou postar o código para ficar mais claro como fiz esse bendito programa - XD

[code]/*

  • To change this template, choose Tools | Templates
  • and open the template in the editor.
    */

package webservice;

import br.inf.portalfiscal.nfe.wsdl.nfestatusservico.NfeStatusServico;
import br.inf.portalfiscal.nfe.wsdl.nfestatusservico.NfeStatusServicoSoap;
import java.security.Security;

public class Main {

/**
 * @param args the command line arguments
 */
public static void main(String[] args) {

String nfeCabecMsg =
“<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"no\" ?>”
+ "<cabecMsg xmlns=“http://www.portalfiscal.inf.br/nfe” "
+ “versao=“1.02”>” + “1.07”
+ “”;

String nfeDadosMsg =
	"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
	+ "<consStatServ " + " versao=\"1.07\""
	+ " xmlns=\"http://www.portalfiscal.inf.br/nfe\">"
	+ "<tpAmb>2</tpAmb>" + "<cUF>53</cUF>"
	+ "<xServ>STATUS</xServ>" + "</consStatServ>";

	System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
	Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

	System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
	System.setProperty("javax.net.ssl.keyStore", "D:\\thiago\\dzyon.p12");
	System.setProperty("javax.net.ssl.keyStorePassword", "senhadocertificado");

	System.setProperty("javax.net.ssl.trustStoreType", "JKS");
	System.setProperty("javax.net.ssl.trustStore", "D:\\thiago\\jssecacerts");
	System.setProperty("javax.net.ssl.trustStorePassword", "changeit");

	NfeStatusServico service = new NfeStatusServico();
	try {
		NfeStatusServicoSoap nfeStatus = service.getNfeStatusServicoSoap();
		System.out.println(nfeStatus.nfeStatusServicoNF(nfeCabecMsg,
						nfeDadosMsg));
	} catch (Throwable e1) {
		e1.printStackTrace();
	}
 }

}[/code]

Agora posto a excessao gerada: =/

compile-single: run-single: com.sun.xml.internal.ws.client.ClientTransportException: HTTP transport error: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:117) at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.process(HttpTransportPipe.java:194) at com.sun.xml.internal.ws.transport.http.client.HttpTransportPipe.processRequest(HttpTransportPipe.java:122) at com.sun.xml.internal.ws.transport.DeferredTransportPipe.processRequest(DeferredTransportPipe.java:95) at com.sun.xml.internal.ws.api.pipe.Fiber.__doRun(Fiber.java:626) at com.sun.xml.internal.ws.api.pipe.Fiber._doRun(Fiber.java:585) at com.sun.xml.internal.ws.api.pipe.Fiber.doRun(Fiber.java:570) at com.sun.xml.internal.ws.api.pipe.Fiber.runSync(Fiber.java:467) at com.sun.xml.internal.ws.client.Stub.process(Stub.java:308) at com.sun.xml.internal.ws.client.sei.SEIStub.doProcess(SEIStub.java:146) at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:98) at com.sun.xml.internal.ws.client.sei.SyncMethodHandler.invoke(SyncMethodHandler.java:78) at com.sun.xml.internal.ws.client.sei.SEIStub.invoke(SEIStub.java:129) at $Proxy28.nfeStatusServicoNF(Unknown Source) at webservice.Main.main(Main.java:50) Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.ssl.Alerts.getSSLException(Alerts.java:192) at sun.security.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1868) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:276) at sun.security.ssl.Handshaker.fatalSE(Handshaker.java:270) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1337) at sun.security.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:154) at sun.security.ssl.Handshaker.processLoop(Handshaker.java:868) at sun.security.ssl.Handshaker.process_record(Handshaker.java:804) at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:998) at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1294) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1321) at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1305) at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:523) at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185) at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1087) at com.sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl.getOutputStream(HttpsURLConnectionOldImpl.java:220) at com.sun.xml.internal.ws.transport.http.client.HttpClientTransport.getOutput(HttpClientTransport.java:105) ... 14 more Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:385) at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:292) at sun.security.validator.Validator.validate(Validator.java:260) at sun.security.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:326) at sun.security.ssl.X509TrustManagerImpl.checkTrusted(X509TrustManagerImpl.java:231) at sun.security.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:126) at sun.security.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:1319) ... 26 more Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:196) at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:268) at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:380) ... 32 more CONSTRUÍDO COM SUCESSO (tempo total: 2 segundos)

[b][i]
Esqueci de fazer algo, é algum problema na hora de cadastrar o certificado tanto do cliente quanto do servidor da SEFAZ RS?
Preciso mto fazer isso rodar, pois to desenvolvendo ou tentando desenvolver um modulo pra carta de correção pra NFE aki na empresa que trabalho…(que choração)…kkkk

Qualquer sujestão agradeço.
[/i][/b]

Cara dá uma olhada nesse forum que tem bastante conteudo sobre NFe e Java: http://javac.com.br/jc/

Valeu Ramon Pires! :slight_smile:

Consegui…Resolvido XD

Acho que era problema com os certificados mesmo…
Importei estes pelo Internet Explorer, depois exportei para utiliza-los no meu programa acima e deu certo. A SEFAZ Virtual RS Retornou um XML mostrando o resultado do processo.

Porém estou com outro probleminha. Trata-se do retorno que recebi pelo XML.

Vou postar o XML para ficar mais facil.

<?xml version="1.0" encoding="utf-8"?>
<retConsStatServ versao="2.00" xmlns="http://www.portalfiscal.inf.br/nfe">
	<tpAmb>2</tpAmb>
	<verAplic>SVRS20110111103240</verAplic>
	<cStat>239</cStat>
	<xMotivo>Rejeicao: Versao do arquivo XML nao suportada</xMotivo>
	<cUF>53</cUF>
	<dhRecbto>2012-05-21T11:12:07</dhRecbto>
	<tMed>1</tMed>
</retConsStatServ>

Estou recebendo uma mensagem acusando meu XML escrito na classe Main do Java (postada acima no inicio do tópico). Essa mensagem Rejeicao: Versao do arquivo XML nao suportada é o problema…hehe.

Utilizei os WSDL versão 1.0 e nao a ultima 2.0! (acho que nem é o problema)

Alguem sabe qual a versão do XML que eu devo colocar? Pelo o que percebi o problema é apenas a versão que declarei no MAIN para formar o xml de envio!

Desde já agradeço por qualquer ajuda XD

Ola Thiago não sei se ainda precisa de solução para este problema ,
mas resolvi o meu nessa situação utilizando a versão 1.00 para todos os xmls que enviava.

No meu caso de rejeição por versão incompatível se encerrou.

[quote=aquila.venancio]Ola Thiago não sei se ainda precisa de solução para este problema ,
mas resolvi o meu nessa situação utilizando a versão 1.00 para todos os xmls que enviava.

No meu caso de rejeição por versão incompatível se encerrou.[/quote]

Tinha resolvido sim cara…Obrigado pela ajuda mesmo assim. Vou alterar para [RESOLVIDO] hehe