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

22 respostas
J

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

Z

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).

J

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);

Z

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.

J
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?
J

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.

J

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?

J

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)

Z

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?

J

Sim, stacktrace completa.

É um certificado A3 para emitir a Nfe.

Acabei de pegar na Certisign.

J

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>
Z

Isso acontece para qual serviço?

J

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

Com o outro certificado acessa sem problemas.

Z

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?

J

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

J
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?
Z

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?

J

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.

J

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).

Z

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?

J

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.

M

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