Nota Fiscal Eletronica

Olá Galera…
Estou desenvolvendo a nota fiscal eletronica aqui na empresa em que trabalho…E estou passando por grandes apuros…
E tenho pouco tempo para faze-la…
O sistema é feito em Delphi…Estava pensando em fazer todos os processos da NFE no mesmo…Mas vi que o Delphi nao da suporte a conexao segura e teria muitas outras dificuldades para fazer os outros processos da NFE…
No Delphi por enquanto gerei o XML agora preciso assinar e enviar o arquivo…
Existiria a possibilidade de fazer uma aplicação em java e chama-la através do Delphi…???
Alguem teria como ajudar?

Grato,
Rodrigo

Eu te ajudo e vc me ajuda…
Topa?

Estou fazendo a mesma coisa…

Eu já faço assinatura e validação usando java e chamo os métodos usando JNI…
Estou com problemas agora pra usar um certificado pfx pra enviar o pacote com SSL.
Te passo as rotinas em java e agente trabalha junto nessa etapa…
Fechado??
[afinal, vc vai precisar também… rs** ]

Primeiro passo é baixar a JNI.pas em algum lugar da net e incluí-la no seu projeto…
Segundo passo, claro, ter uma jre rodando. Vc copia o jvm.dll do client pro bin;
Terceiro passo, aqui já é questão de opiniães…
Eu tou chamando os métodos sem criar o dpr com os tipos…
Mas, Acredite… JNI NÃO é o seu problema na NFe…

Alias,
Vou inclusive aproveitar o tópico…

Alguem tem alguma dica, um bom tutorial ou uma formula mágica de como usar WebServices com SSL?
Preferencialmente AXIS [ parece ser mais fácil ].

Primeiramente… eu não armazenei meu certificado com o keytool, mas, estranhamente aproveitando alguns tópicos desse forum… consegui fazer a assinatura carregando em tempo de execução o meu pfx. Tenho um certificado A1.
Eu preferia não armazena-lo, se for possível, em um jks. Prefiro chama-lo como arquivo.

Usando o método

[code]Service service = new Service();
Call call = (Call) service.createCall();
call.setTargetEndpointAddress(new java.net.URL(endpoint));
call.setOperationName(new QName(“http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico”, “nfeStatusServicoNF”));
//call.addParameter(“nfeCabecMsg”, XMLType.XSD_STRING, ParameterMode.IN);
//call.addParameter(“nfeDadosMsg”, XMLType.XSD_STRING, ParameterMode.IN);
call.setReturnType(XMLType.XSD_STRING);

String ret = (String) call.invoke( new Object[] { /cabecMsg, consStatServ/ } ); [/code] eu obtive a seguinte resposta:

[quote]AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: java.net.SocketException: Default SSL context init failed: null[/quote]

Ou seja, Está faltando alguns parâmetros default para o ssl: O Certificado, creio eu;

Agora,
Eu tentei fazer o que não fiz na hora da assinatura: Eu informei no properties os caminhos para o certificado:

System.setProperty("javax.net.ssl.keyStore", "PKCS12"); System.setProperty("javax.net.ssl.keyStoreURL", APPSet.getProperty("certificado")); System.setProperty("javax.net.ssl.keyStorePassword", Util.undoHexCodified(APPSet.getProperty("pin")));

Mas, Não fui tão bem sucedido…

Alguem tem uma luz?
Alguem sabe como eu uso ssl com uma KeyStore carregada via código? [ carregar via Keystore.load(); ]
Qualquer luz é bem vinda…

Bem, a melhor forma de se desenvolver um sistema de NFe, como envolve integrações com sistemas diferentes, ERPs diferentes, é utilizando webservices.
Você pode fazer um modulo separado que será responsável somente pela assinatura digital. Assim, você passa um XML para ele, e ele devolve assinado. Desta forma, se você tiver um sistema que já monta um XML com a note, pois, já existem alguns ERPs que estão vindo com esta função, vc já tem um serviço responsável pela assinatura.

Pode também, fazer um outro serviço, responsável por enviar os lotes de NFes para a SEFAZ. Assim, você pode só enviar as NFEs assinadas para este serviço, e ele se encarrega de enviar as notas para a SEFAZ e devolver o resultado para o sistema que o chama.

Assim, você deixa seu sistema todo desacoplado, facilitando a integração.

[Você duplicou to topico]

Existe sim amigo.

depois de construir o JAR, você pode chamá-lo pelo prompt de comando usando o comando java.

O que você deve fazer é usar uma função no Delphi que executa comandos no prompt de comando, como por exemplo, System(‘Comando a ser executado’) no C.

Lembrando que você pode passar informações para o programa java através de argumentos.

Fiz à um tempo, uma arvore Binária de Busca balanceada em C e desenhei ela usando java 2d passando os valores da arvore como argumento.

Espero ter ajudado.
Abraço

[Edit> Você é xara! ]

Oh,
Meu problema não é esse não…

Eu só tenho um programa emissor de NFe, pronto no modelo antigo.
Como a política da empresa é “Desktop? Delphi”, então construir webservices pra chamar webservices só vai aumentar a complexidade da minha aplicação que já não é um sisteminha de ponto… :?

Eu só preciso agora chamar os webservices da receita, que, só por acaso seria igualzinho igualzinho caso fosse construir webservices no lugar de usar JNI…

Valeu pela dica,
Mas, a parte das decisões já passou pra mim…
Tou na parte da implementação…

Tem alguma dica de como fazer as chamadas ssh funcionarem?

Cara, em Delphi sei poucas coisas quanto a consumir os web services da receita…
Mas o que posso adiantar voce tem que baixar algumas correcoes de units usadas para fazer isso…
Se quiser passa o seu email que te passo…
E para dar inicio a conexao voce tem que ir no delphi - file - new - other - web services - wsdl importer e informar o arquivo *.wsdl (sites da receita federal voce tem que entrar no site da receita para baixar é um arquivo parecido com xml)…
Depois disso vou ter que pesquisar mais pois é tudo o que eu sei por enquanto…
Se tiver novidades me passa ae…

Oh não, cara…
Eu pretendo consumir os webservices com Java também…

=]
Em delphi me parece que há algumas restrições quanto ao ssl

então…isso é verdade é trabalhoso o processo pelo que eu andei lendo mas…
com as correções baixadas 90% das pessoas que fizeram isso dizem que dá certo sim…
inclusive usando apenas o componentes httprio…

cara, é o seguinte… se está fazendo em plataforma windows use as dlls disponíveis. Muita gente está fazendo assim. Se visa outras plataformas e vai desenvolver em java, aí vai a dica, utilizem axis2 ou CXF mais o WSS4J…

Bom, esse não é um forum de Delhi, mas…

vc se refere a fazer o dowload do wsdl importer? delphi 7?
Pelo que eu andei lendo… só os .net andam conseguindo essa proeza sem ter que comprar componentes…

Tem msn?
o meu é waraujo@upbrasil.com.br

Estou tentando usar axis2,
Mas, não achei um bom tuto na net…
Não consigo anexar o certificado a requisição

Eu simplesmente não consigo fazer as requisições aos webservices com ssl;

O meu código:

[code]public static String simpleRequest() {
java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
try {
System.setProperty(“javax.net.ssl.trustStoreType”, “jks”);
System.setProperty(“javax.net.ssl.trustStore”,
“C:\JAVA\JDEV\jdevstudio10132\jdk\jre\lib\security\keystore.jks”);
System.setProperty(“javax.net.ssl.trustStorePassword”, “123456”);

        System.setProperty("javax.net.ssl.keyStoreType", "jks");
        System.setProperty("javax.net.ssl.keyStore", 
                           "C:\\JAVA\\JDEV\\jdevstudio10132\\jdk\\jre\\lib\\security\\keystore.jks");
        System.setProperty("javax.net.ssl.keyStorePassword", "123456");

        String endpoint = 
            "https://hnfe.fazenda.mg.gov.br/nfe/services/NfeStatusServico";

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

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

        Service service = new Service();
        Call call = (Call)service.createCall();
        call.setTargetEndpointAddress(new java.net.URL(endpoint));
        call.addParameter("nfeCabecMsg", XMLType.XSD_STRING, 
                          ParameterMode.IN);
        call.addParameter("nfeDadosMsg", XMLType.XSD_STRING, 
                          ParameterMode.IN);
        call.setReturnType(XMLType.XSD_STRING);
                    QName servico = new QName("https://hnfe.fazenda.mg.gov.br/nfe/services/NfeStatusServico", "nfeStatusServicoNF");
        call.setOperationName(servico);
        

        String ret = (String)call.invoke(new Object[] {cabecMsg, consStatServ});
        System.out.println(ret);

    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;

}[/code]

Sempre retorna :[quote]AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: 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
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace: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 …[/quote]

Sinceramente,
Não sei mais o que fazer…

Vou te mandar por email umas rotinas que faz conexao ssl em delphi…
terntei te mandar ontem mas deu um erro…
vou tentar mandar hj dee novo todos os arquivos que tenho…

certinho???

vc conseguiu assinar o sxml em java pelo delphi tem como me passar os fontes do java e os codigos no delphi???

manda pro rodrigoernandes@gmail.com

valew

Mole pra nós…
É só isso ai…

Agora só falta esse bendito ssl pra enfim, começar a montar meus xml

http://www.forumweb.com.br/foruns/lofiversion/index.php/t73011.html

da uma olhada nesse link tem exemplos de conexao com ssl em delphi

como que vc chama o java no delphi…

e pra rodar esse codigo que vc me passou tem que usar o net beans…???
e depois? (cara sou bem iniciante em java se puder ajudar eu agradeço…:slight_smile: )

Valeu

Bom…
Com poucos conhecimentos de Java vc vai precisar de muita sorte…

Eu começaria estudando um pouquinho o “Como funciona o Java”…
Basicamente, você vai construir a sua classe NFe, que vai ter dependências, que precisarão também estar no seu classpath.

Depois, Compreender um pouco de como funciona o JNI, coisa simples:
http://www.javafree.org/content/view.jf?idContent=40
E Baixar a unit JNI.pas e afins…

Depois…
Analisar esse meu exemplo ai…

=]

Sem conhecer Java mais ou menos vai precisar de um pouquinho de sorte…
=]

postei uma classe aqui, que gera facim facim tudo pra acessar o webservice
http://www.guj.com.br/posts/list/30/72325.java
pra pegar o jks do webservide é falcil tbm
acho q vai ajudar,

até pq nesse seu codigo abaixo provavelmente esta faltando o seuinte
call.setSOAPActionURI(“http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico/nfeStatusServicoNF”);
call.setUseSOAPAction(true);

quanto ao meu certificado, eu exportei ele do meu navegador como um arquivo.p12

e uso o seguinte setproperties:

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

[quote=proteus_adi]Eu simplesmente não consigo fazer as requisições aos webservices com ssl;

O meu código:

[code]public static String simpleRequest() {
java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
try {
System.setProperty(“javax.net.ssl.trustStoreType”, “jks”);
System.setProperty(“javax.net.ssl.trustStore”,
“C:\JAVA\JDEV\jdevstudio10132\jdk\jre\lib\security\keystore.jks”);
System.setProperty(“javax.net.ssl.trustStorePassword”, “123456”);

        System.setProperty("javax.net.ssl.keyStoreType", "jks");
        System.setProperty("javax.net.ssl.keyStore", 
                           "C:\\JAVA\\JDEV\\jdevstudio10132\\jdk\\jre\\lib\\security\\keystore.jks");
        System.setProperty("javax.net.ssl.keyStorePassword", "123456");

        String endpoint = 
            "https://hnfe.fazenda.mg.gov.br/nfe/services/NfeStatusServico";

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

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

        Service service = new Service();
        Call call = (Call)service.createCall();
        call.setTargetEndpointAddress(new java.net.URL(endpoint));
        call.addParameter("nfeCabecMsg", XMLType.XSD_STRING, 
                          ParameterMode.IN);
        call.addParameter("nfeDadosMsg", XMLType.XSD_STRING, 
                          ParameterMode.IN);
        call.setReturnType(XMLType.XSD_STRING);
                    QName servico = new QName("https://hnfe.fazenda.mg.gov.br/nfe/services/NfeStatusServico", "nfeStatusServicoNF");
        call.setOperationName(servico);
        

        String ret = (String)call.invoke(new Object[] {cabecMsg, consStatServ});
        System.out.println(ret);

    } catch (Exception e) {
        e.printStackTrace();
    }
    return null;

}[/code]

Sempre retorna :[quote]AxisFault
faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException
faultSubcode:
faultString: 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
faultActor:
faultNode:
faultDetail:
{http://xml.apache.org/axis/}stackTrace: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 …[/quote]

Sinceramente,
Não sei mais o que fazer…[/quote]

Já passou,
Já passou…
Faltava apenas baixar alguns certificados…

rs**
O problema agora é outro…
é a intermitência, apontada nesse tópico http://www.guj.com.br/posts/list/103257.java

A boa vontade dele… vai a hora que quer…

Alguma dica?

Alguém pode me dizer o que é isso -> APPSet.getProperty(“pin”)
?? :oops: