NFe - de homologação para produção

22 respostas
javer

Olá a todos,

Mais uma vez venho pedir um “help” em NF-e, supondo que estou com todos (exceto o de consultar o cadastro do emitente que não consegui encontrar o WSDL) os webservices executando como ambiente de homologação, qual seria a melhor forma de mudar todos eles para ambiente de produção?

Tenho que, no dia 1o. de outubro, passar tudo de homologação para produção, e como não tem como testar no ambiente de produção teria que ser algo “automático”.

Tenho mesmo que recriar todas as classes novamente? (criei as classes com o Axis2)

Obrigado.

22 Respostas

zoren

Sim,

Existem os ws para homologação e para produção

I

Não sei como vc fez, mas normalmente é só trocar a url.
O ambiente de homologação é exatamente igual ao de produção, para que o
contribuinte possa testar seu aplicativo, a única mudança que ocorre em relação
ao ambiente de produção é o wsdl e a tag tpAmb que você tem que mudar para 1 (produção).

javer

Mas e se mudar apenas a URL na instância da classe?

Exemplo:

NfeStatusServico2Stub nfe = new NfeStatusServico2Stub("https://nfe.fazenda.sp.gov.br/nfeweb/services/NfeStatusServico2.asmx"); NfeCabecMsgE nfeCabecMsg = new NfeCabecMsgE(); NfeCabecMsg param = new NfeCabecMsg(); param.setCUF(codigoUF); param.setVersaoDados(NFe.VERSAO_LEIAUTE_NFE); nfeCabecMsg.setNfeCabecMsg(param);

zoren

Eu nunca cheguei a olhar os construtores das classes que o axis gera.

Confesso que nunca cheguei a reparar nesse construtor.

Se funciona blz, mas ainda sim prefiro que o axis gere tudo pra mim, eu criei alguns programas que fazem todo o serviço sujo pra mim e no fim me fornece o jar com as classes compiladas, ai só tenho que chamar o serviço e passar os dados pra ele.

javer
Fiz isso para testar o status do serviço:
mapUrlServicos = new HashMap<String, HashMap>();
HashMap<String, String> mapHomologacao = new HashMap<String, String>();
mapHomologacao.put(this.KEY_URL_CONSULTA_STATUS, "https://homologacao.nfe.fazenda.sp.gov.br/nfeweb/services/NfeStatusServico2.asmx");
mapHomologacao.put(this.KEY_URL_CONSULTA_NOTA, "https://homologacao.nfe.fazenda.sp.gov.br/nfeweb/services/NfeConsulta2.asmx");
mapHomologacao.put(this.KEY_URL_CANCELAR_NOTA, "https://homologacao.nfe.fazenda.sp.gov.br/nfeweb/services/NfeCancelamento2.asmx");
mapHomologacao.put(this.KEY_URL_RECEPCAO_NOTA, "https://homologacao.nfe.fazenda.sp.gov.br/nfeweb/services/NfeRecepcao2.asmx");
mapHomologacao.put(this.KEY_URL_RETORNO_RECEPCAO, "https://homologacao.nfe.fazenda.sp.gov.br/nfeweb/services/NfeRetRecepcao2.asmx");
HashMap<String, String> mapProducao = new HashMap<String, String>();
mapProducao.put(this.KEY_URL_CONSULTA_STATUS, "https://nfe.fazenda.sp.gov.br/nfeweb/services/NfeStatusServico2.asmx");
mapProducao.put(this.KEY_URL_CONSULTA_NOTA, "https://nfe.fazenda.sp.gov.br/nfeweb/services/NfeConsulta2.asmx");
mapProducao.put(this.KEY_URL_CANCELAR_NOTA, "https://nfe.fazenda.sp.gov.br/nfeweb/services/NfeCancelamento2.asmx");
mapProducao.put(this.KEY_URL_RECEPCAO_NOTA, "https://nfe.fazenda.sp.gov.br/nfeweb/services/NfeRecepcao2.asmx");
mapProducao.put(this.KEY_URL_RETORNO_RECEPCAO, "https://nfe.fazenda.sp.gov.br/nfeweb/services/NfeRetRecepcao2.asmx");
mapUrlServicos.put("1", mapProducao);
mapUrlServicos.put("2", mapHomologacao);
Para pegar a URL:
...
String urlStatus = (String) mapUrlServicos.get(Global.TIPO_AMBIENTE_NFe).get(this.KEY_URL_CONSULTA_STATUS);
System.out.println("Url: " + urlStatus + " - ambiente: " + Global.TIPO_AMBIENTE_NFe);

NfeStatusServico2Stub nfe = new NfeStatusServico2Stub(urlStatus);
...
Retorno do println:
Url: https://nfe.fazenda.sp.gov.br/nfeweb/services/NfeStatusServico2.asmx - ambiente: 1
Me retornou essa linda Exception:
org.apache.axis2.AxisFault: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at org.apache.axis2.AxisFault.makeFault(AxisFault.java:430)
    at org.apache.axis2.transport.http.SOAPMessageFormatter.writeTo(SOAPMessageFormatter.java:83)
    at org.apache.axis2.transport.http.AxisRequestEntity.writeRequest(AxisRequestEntity.java:84)
    at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:499)
    at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2114)
    at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)
    at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
    at org.apache.commons.httpclient.HttpMethodDirector.executeMethod(HttpMethodDirector.java:171)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:397)
    at org.apache.commons.httpclient.HttpClient.executeMethod(HttpClient.java:346)
    at org.apache.axis2.transport.http.AbstractHTTPSender.executeMethod(AbstractHTTPSender.java:542)
    at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:199)
    at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:76)
    at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:400)
    at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:225)
    at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:435)
    at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:402)
    at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229)
    at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165)
    at emissor.ws.h.status.NfeStatusServico2Stub.nfeStatusServicoNF2(NfeStatusServico2Stub.java:173)
    at emissor.lib.NFe.getStatusServico(NFe.java:404)
    at emissor.ui.NotasFiscaisUI$1.run(NotasFiscaisUI.java:146)
Caused by: com.ctc.wstx.exc.WstxIOException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at com.ctc.wstx.sw.BaseStreamWriter.flush(BaseStreamWriter.java:313)
    at org.apache.axiom.om.impl.MTOMXMLStreamWriter.flush(MTOMXMLStreamWriter.java:168)
    at org.apache.axis2.databinding.utils.writer.MTOMAwareXMLSerializer.flush(MTOMAwareXMLSerializer.java:79)
    at org.apache.axiom.om.impl.MTOMXMLStreamWriter.flush(MTOMXMLStreamWriter.java:168)
    at org.apache.axiom.om.impl.llom.OMNodeImpl.serialize(OMNodeImpl.java:388)
    at emissor.ws.h.status.NfeStatusServico2Stub$NfeDadosMsg.serialize(NfeStatusServico2Stub.java:1969)
    at emissor.ws.h.status.NfeStatusServico2Stub$NfeDadosMsg.serialize(NfeStatusServico2Stub.java:1914)
    at emissor.ws.h.status.NfeStatusServico2Stub$NfeDadosMsg$1.serialize(NfeStatusServico2Stub.java:1902)
    at org.apache.axis2.databinding.ADBDataSource.serialize(ADBDataSource.java:93)
    at org.apache.axiom.om.impl.llom.OMSourcedElementImpl.internalSerializeAndConsume(OMSourcedElementImpl.java:738)
    at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerialize(OMElementImpl.java:966)
    at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerializeAndConsume(OMElementImpl.java:995)
    at org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.serializeInternally(SOAPEnvelopeImpl.java:254)
    at org.apache.axiom.soap.impl.llom.SOAPEnvelopeImpl.internalSerialize(SOAPEnvelopeImpl.java:242)
    at org.apache.axiom.om.impl.llom.OMElementImpl.internalSerializeAndConsume(OMElementImpl.java:995)
    at org.apache.axiom.om.impl.llom.OMNodeImpl.serializeAndConsume(OMNodeImpl.java:486)
    at org.apache.axis2.transport.http.SOAPMessageFormatter.writeTo(SOAPMessageFormatter.java:79)
    ... 20 more
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 com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(Unknown Source)
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
    at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Unknown Source)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(Unknown Source)
    at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(Unknown Source)
    at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Unknown Source)
    at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(Unknown Source)
    at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(Unknown Source)
    at com.sun.net.ssl.internal.ssl.AppOutputStream.write(Unknown Source)
    at java.io.BufferedOutputStream.flushBuffer(Unknown Source)
    at java.io.BufferedOutputStream.flush(Unknown Source)
    at org.apache.commons.httpclient.ChunkedOutputStream.flush(ChunkedOutputStream.java:191)
    at com.ctc.wstx.io.UTF8Writer.flush(UTF8Writer.java:99)
    at com.ctc.wstx.sw.BufferingXmlWriter.flush(BufferingXmlWriter.java:214)
    at com.ctc.wstx.sw.BaseStreamWriter.flush(BaseStreamWriter.java:311)
    ... 36 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(Unknown Source)
    at sun.security.validator.PKIXValidator.engineValidate(Unknown Source)
    at sun.security.validator.Validator.validate(Unknown Source)
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(Unknown Source)
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
    at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(Unknown Source)
    ... 50 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
    at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(Unknown Source)
    at java.security.cert.CertPathBuilder.build(Unknown Source)
    ... 56 more
O que será que faltou?
javer

Tinha faltado passar o keystore correto do certificado de produção do SEFAZ, agora deu certo:

String keystoreSEFAZ = (String) mapUrlServicos.get(Global.TIPO_AMBIENTE_NFe).get(this.KEY_ARQUIVO_KS_SEFAZ); System.setProperty("javax.net.ssl.trustStoreType", "JKS"); System.setProperty("javax.net.ssl.trustStore", keystoreSEFAZ); System.setProperty("javax.net.ssl.trustStorePassword", Global.SENHA_KEYSTORE_SEFAZ); Se deu certo para o Status acho que pode dar certo para os outros serviços também, quero apenas mudar a propriedade TIPO_AMBIENTE e o resto mudar sozinho.

javer

javer:
Tinha faltado passar o keystore correto do certificado de produção do SEFAZ, agora deu certo:

String keystoreSEFAZ = (String) mapUrlServicos.get(Global.TIPO_AMBIENTE_NFe).get(this.KEY_ARQUIVO_KS_SEFAZ); System.setProperty("javax.net.ssl.trustStoreType", "JKS"); System.setProperty("javax.net.ssl.trustStore", keystoreSEFAZ); System.setProperty("javax.net.ssl.trustStorePassword", Global.SENHA_KEYSTORE_SEFAZ); Se deu certo para o Status acho que pode dar certo para os outros serviços também, quero apenas mudar a propriedade TIPO_AMBIENTE e o resto mudar sozinho.

O problema da solução acima é que uma vez setada essa propriedade se eu tento mudar dinamicamente parece que ele considera o que já estava e não altera a propriedade.
Tem algum jeito de limpar antes de setar essa propriedade?

javer

Alguém sabe o que é essa Exception?

org.apache.axis2.AxisFault: Transport error: 403 Error: Forbidden at org.apache.axis2.transport.http.HTTPSender.handleResponse(HTTPSender.java:310) at org.apache.axis2.transport.http.HTTPSender.sendViaPost(HTTPSender.java:200) at org.apache.axis2.transport.http.HTTPSender.send(HTTPSender.java:76) at org.apache.axis2.transport.http.CommonsHTTPTransportSender.writeMessageWithCommons(CommonsHTTPTransportSender.java:400) at org.apache.axis2.transport.http.CommonsHTTPTransportSender.invoke(CommonsHTTPTransportSender.java:225) at org.apache.axis2.engine.AxisEngine.send(AxisEngine.java:435) at org.apache.axis2.description.OutInAxisOperationClient.send(OutInAxisOperation.java:402) at org.apache.axis2.description.OutInAxisOperationClient.executeImpl(OutInAxisOperation.java:229) at org.apache.axis2.client.OperationClient.execute(OperationClient.java:165) at emissor.ws.h.status.NfeStatusServico2Stub.nfeStatusServicoNF2(NfeStatusServico2Stub.java:173) at emissor.lib.NFe.getStatusServico(NFe.java:457) at emissor.ui.NotasFiscaisUI$1.run(NotasFiscaisUI.java:153)

zoren

Proibido,

Pode ter vários motivos como seu certificado não ser válido, ou o certificado que você está usando não tem permissão para acessar a url

As vezes isso acontece por algum problema na internet

Essa é a stacktrace completa?

javer

Sim, stacktrace completa.

É um certificado A3 para emitir a Nfe.

Acabei de pegar na Certisign.

javer

O certificado tem permissão para acessar a url sim porque quando entro em:
https://homologacao.nfe.fazenda.sp.gov.br/nfeweb/services/NfeStatusServico2.asmx

Mostra:

NfeStatusServico2

Serviço destinado à consulta do status do serviço prestado pelo Portal da Secretaria de Fazenda Estadual.

The following operations are supported. For a formal definition, please review the Service Description.

* nfeStatusServicoNF2
  Consulta Status do Serviço </blockquote>
zoren

Isso acontece para qual serviço?

javer

Consulta do status, é o primeiro serviço que tento acessar.

Com o outro certificado acessa sem problemas.

zoren

Mas se eu não me engano status do serviço não precisa do certificado do cliente para ser acessado através do SOAP

Ele só deveria ser utilizado para assinar os xmls.

O Keystore está setado na aplicação?

Esse certificado do cliente já foi liberado para usar a NF-e? Alguns estados tem um cadastro de clientes aptos a emitir NF-e.

Ele está dentro do prazo de validade? digo, se a data de inicio da validade dele é maior que hoje?

javer

Putz, o certificado vai vencer em 3 anos. Está dentro do prazo.

É estranho que pela URL não dá erro.

O keystore do SEFAZ está setado:

String keystoreSEFAZ = (String) mapUrlServicos.get(Global.TIPO_AMBIENTE_NFe).get(this.KEY_ARQUIVO_KS_SEFAZ); System.out.println("Keysore SEFAZ: " + keystoreSEFAZ); System.setProperty("javax.net.ssl.trustStoreType", "JKS"); System.setProperty("javax.net.ssl.trustStore", keystoreSEFAZ); System.setProperty("javax.net.ssl.trustStorePassword", Global.SENHA_KEYSTORE_SEFAZ);

Keysore SEFAZ: C:\Kooky\SigGraf\NFe\certificado\CERTIFICADO_HOMOLOGACAO_SEFAZ-SP.ks

javer
Eu tenho esse método que chamo toda vez que vou usar um Serviço (ex: consultar status, enviar nota, consultar retorno de nota, cancelar nota):
private void setPropriedadesCertificado() throws KeyStoreException, IOException, NoSuchAlgorithmException, CertificateException {
        acceptSSL();
        String arquivoConfigCertificado = Global.ARQUIVO_CONFIG_CERTIFICADO;
        String senhaCertificado = Global.SENHA_CERTIFICADO_EMITENTE;
        String provedorCertificado = Global.PROVEDOR_CERTIFICADO_CLIENTE;

        Provider p = new sun.security.pkcs11.SunPKCS11(arquivoConfigCertificado);

        Security.addProvider(p);

        KeyStore ks = KeyStore.getInstance(NFe.TIPO_KEYSTORE_A3); // PKCS11
        ks.load(null, senhaCertificado.toCharArray());

        // para resolver: HelloRequest followed by an unexpected  handshake message
        System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true");

        System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
        System.setProperty("javax.net.ssl.keyStore", "NONE");
        System.setProperty("javax.net.ssl.keyStoreType", NFe.TIPO_KEYSTORE_A3);
        System.setProperty("javax.net.ssl.keyStorePassword", senhaCertificado);

        // Tem q saber qual o provider dele (SmartCard, Safesig, etc).
        System.setProperty("javax.net.ssl.keyStoreProvider", provedorCertificado);
        //System.setProperty("javax.net.ssl.keyStoreProvider", ks.getType());

        //Aqui vem o arquivo criado atraves do comando keytool chaves publicas
        //System.setProperty("javax.net.ssl.trustStore", NFe.CAMINHO_ARQUIVO_KEYSTORE);
        //System.setProperty("javax.net.ssl.trustStore", NFe.ARQUIVO_JSSECACERTS);

        // as 3 linhas abaixo sao referentes ao certificado do SEFAZ, nao o do cliente
        String keystoreSEFAZ = (String) mapUrlServicos.get(Global.TIPO_AMBIENTE_NFe).get(this.KEY_ARQUIVO_KS_SEFAZ);
        System.out.println("Keysore SEFAZ: " + keystoreSEFAZ);
        System.setProperty("javax.net.ssl.trustStoreType", "JKS");
        System.setProperty("javax.net.ssl.trustStore", keystoreSEFAZ);
        System.setProperty("javax.net.ssl.trustStorePassword", Global.SENHA_KEYSTORE_SEFAZ);

        //System.out.println("Propriedades do certificado para a conexão carregadas...");
    }
Acho que está errado como estou fazendo?
zoren

Você só precisa setar os dados de keystore e certificado do cliente apenas uma vez.

Mas acredito que n dá problema

O teste que você está fazendo para esse certificado é para o mesmo estado do que funciona?

javer

Sim, mesmo estado.

É assim, hora vai ser uma empresa (um certificado), hora outra empresa (outro certificado), preciso que troque tudo quando o usuário selecionar outra empresa (um um JComboBox).

Mas mesmo que eu faço do jeito que estou fazendo para o primeiro, para esse outro sempre dá esse 403 forbiden.

javer

Eu vi esse texto aqui mas com base no servidor do SEFAZ não consigo deduzir qual seria o problema:

For org.apache.axis2.AxisFault: Transport error: 403 Error: Forbidden.

A 403 error indicates that the server (IIS security) isn’t allowing access to the EWS (Exchange Web Services) URL ? i.e., either EWS is not enabled or there’s some other sort of security/access restriction (e.g., a single-sign-on mechanism that hides the standard authentication mechanism).

Technically, SyncEm uses Microsoft’s interfaces to interact with the Exchange Server via EWS using SOAP requests (e.g., makes SOAP requests to
https:///EWS/Exchange.asmx).

zoren

Eu uso o certificado A1,

Se eu não me engano, eu já tive um erro assim, mas foi porque os certificados raizes não estavam inclusos junto com o certificado do cliente no arquivo .pfx.

Não conheço sobre o tipo A3, mas o A1 pode ser instalado no computador, o mesmo ocorre com o A3?

javer

Não colega, o maldito A3 fica em um token (tipo pen-drive) ele usa aquele arquivo .cfg para acessar o token e ler o certificado.

mateusviccari

Olá javer, conseguiu resolver seu problema? Estou com o mesmo erro que voce teve no axis, com cartão safeweb eu consegui enviar nota tudo certinho, ai fui testar com cartão caixa, ele até le o cartão e assina o xml mas na hora de enviar pra sefaz da esse erro aí.

Criado 29 de setembro de 2010
Ultima resposta 27 de dez. de 2011
Respostas 22
Participantes 4