Comunicação com web service NFe

7 respostas
A

Boa tarde pessoal, tenho o seguinte problema:
Estou adaptando o meu sistema NFe para transmitir as notas para diversos Web Services, no momento tenho um cliente com filial no PR e SC.

Abaixo esta o método de consulta status.

public String consultaStatus(String codEstado, String certificadoCliente) throws Exception {
        String retorno;

        String xmlConsulta;
        NfeSCANStatusServico serviceSCANStatus;
        NfeSCANStatusServicoSoap soapSCANStatus;
        NfeStatusServico serviceStatus;
        NfeStatusServicoSoap soapStatus;
        SSLClientAxisEngineConfig axisConfig;

        //endereço do web service ref. ao estado passado por parametro.
        Principal.webService = Principal.webServiceDAO.getWebService(codEstado);  

        xmlConsulta = "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"
                + "<consStatServ versao=\"1.07\" xmlns=\"http://www.portalfiscal.inf.br/nfe\">\n" + "  "
                + "<tpAmb>" + String.valueOf(tipoServico) + "</tpAmb>"
                + "<cUF>" + String.valueOf(codEstado) + "</cUF>"
                + "<xServ>STATUS</xServ>"
                + "</consStatServ>";

        Principal.manipulaXML.gravaXML(xmlConsulta, System.getProperty("user.dir") + "/temp/ConsultaServico.xml");

        axisConfig = new SSLClientAxisEngineConfig();
        Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
        axisConfig.setProtocol("TLS");
        axisConfig.setAlgorithm("SunX509");
        axisConfig.setKeyStore(certificadoCliente + ".pfx");
        axisConfig.setKeyStoreType("PKCS12");
        axisConfig.setKeyStorePassword("123");
        axisConfig.setTrustStore(codEstado + ".jks");
        axisConfig.setTrustStoreType("JKS");
        axisConfig.setTrustStorePassword("123456");

        nfeDadosMsg = xmlConsulta;

        serviceStatus = new NfeStatusServicoLocator(axisConfig);
        serviceStatus.setEndStatusServico(Principal.webService.getWsStatusServico());
        soapStatus = serviceStatus.getNfeStatusServicoSoap();
        retorno = Geral.removeAcentos(soapStatus.nfeStatusServicoNF(nfeCabecMsg, nfeDadosMsg));

        retorno = Principal.trataXML.processaRecepcao(retorno);
        
        xmlConsulta = null;
        serviceSCANStatus = null;
        soapSCANStatus = null;
        serviceStatus = null;
        soapStatus = null;
        axisConfig = null;
        codEstado = 0;
        tipoServico = 0;
        ambiente = 0;
        cnpj = null;

        return retorno;
    }

O que ocorre é o seguinte :
O primeiro estado que for selecionado, o sistema faz a comunicação normalmente.
Porem se informar outro estado sem fechar o sistema, retorna uma mensagem de erro.

06/10/2010 17:30:42 org.apache.axis.client.SSLClientAxisEngineConfig loadOptions
INFO: Enter::SSLClientAxisEngineConfig::init::client-config.wsdd
javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found
AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found
faultActor:
faultNode:
faultDetail:

Gostaria de saber como posso fazer para resolver isso.

até mais …

7 Respostas

A

Alguem para me ajudar ?

javer

Geralmente esse erro é porque você não importou o certificado (keystore) correto para o webservice que está acessando, por exemplo, para SP tenho CERTIFICADO_PRODUCAO_SEFAZ-[color=green]SP[/color].ks, para Minas Gerais tenho CERTIFICADO_PRODUCAO_SEFAZ-[color=darkblue]MG[/color].ks.

A

Eu tenho na minha pasta de certificados os arquivos :

  • Certificado_Servidor_41.jsk que corresponde ao estado do PR.
  • Certificado_Servidor_42.jks que corresponde ao estado de SC.

Eu conferi depurando os métodos, e esta sendo atribuído os arquivos corretamente de cada estado.

Será que as informações estão sendo carregadas do primeiro arquivo, e não subscreve quando eu estou atribuindo o outro arquivo ?
Se for isso tem alguma forma de limpar essas configurações toda vez eu for fazer uma nova consulta ?

alves.Felipe

acmedis , estou tb tentando fazer funcionar isso…mas estou meio perdido ainda…
nesta linha:

serviceStatus = new NfeStatusServicoLocator(axisConfig);

oq vc faz com o axisConfig no construtor?

A

Passo as configurações para construtor da classe NfeStatusServicoLocator

seria a mesma coisa que fazer assim :

System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
        System.setProperty("javax.net.ssl.keyStore", caminho + "certificado.pfx");
        System.setProperty("javax.net.ssl.keyStorePassword", senha);

        System.setProperty("javax.net.ssl.trustStoreType", "JKS");
        System.setProperty("javax.net.ssl.trustStore", caminho + "/" + "certificado_servidor.jks");
        System.setProperty("javax.net.ssl.trustStorePassword", "123456");

e criar o serviceStatus assim :
serviceStatus = new NfeStatusServicoLocator();

alves.Felipe

essa parte que seta as propriedade ta blz…
mas tipo, qdo vc passa o axisConfig, vc não faz nada?
tipo axisConfig.AlgumaCOisa();

e vc já está conseguindo usar normal com 2 certificados?
valeo pelo retorno

A

eu faço as atribuições no axisConfig e passo ele para classe, só isso.
Quanto ao uso de dois certificados ainda não tenho solução.
Deixei parado essa parte pq comecei a implementar a NFe 2.0.

Criado 6 de outubro de 2010
Ultima resposta 9 de nov. de 2010
Respostas 7
Participantes 3