Nota Fiscal Eletronica

26 respostas
R

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

26 Respostas

proteus_adi

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…

proteus_adi

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
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*/ } );
eu obtive a seguinte resposta:
AxisFault faultCode: {http://schemas.xmlsoap.org/soap/envelope/}Server.userException faultSubcode: faultString: java.net.SocketException: Default SSL context init failed: null

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

Toledux

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.

S

[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! ]

proteus_adi

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?

R

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…

proteus_adi

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

R

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…

T

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…

proteus_adi

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 é [email removido]

proteus_adi

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

proteus_adi

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

O meu código:
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;
}

Sempre retorna :

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

Sinceramente,
Não sei mais o que fazer...

R

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 [email removido]

valew

proteus_adi

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

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

R

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

proteus_adi

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…
=]

F

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");
proteus_adi:
Eu simplesmente não consigo fazer as requisições aos webservices com ssl; O meu código:
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;
}

Sempre retorna :

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

Sinceramente,
Não sei mais o que fazer...

proteus_adi

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?

pix

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

proteus_adi

Oh,
Mil perdões…

APPSet.getProperty(“pin”)
APPSet é um basicamente property onde eu guardo minhas propriedades e variáveis de configuração…
Na verdade é uma classe estática que carrega esse properties na primeira tentativa de uso de algum parâmetro.
=]

No caso… APPSet.getProperty(“pin”) é a senha do certificado

helderam

Ola,

Pessoal gostaria de desenvolver isto porem em PHP. Algume sabe onde posso encontrar forum ou informaçoes

Grato,
Helder

A

Pessoal

Alguem sabe me dizer a qual pacote pertence a classe util na linha:

char[] pin = Util.undoHexCodified(APPSet.getProperty(“pin”)).toCharArray();

do arquivo texto.txt em anexo na mensagem do proteus_adi

Obrigado.

proteus_adi
char[] pin = Util.undoHexCodified(APPSet.getProperty("pin")).toCharArray();

é a mesma coisa que char []pin = "senha".toCharArray();

O negócio é q esse “proteus_adi” ai é meio topeira…
E esqueceu que o resto do povo não tão programando no ambiente dele…
ashuashuashua

A

HAHAHAHA… Valeu proteus_adi seu codigo me ajudou muito…

Muito Obrigado mesmo.

jonasabreu

Acabei de publicar uma notícia sobre o Caelum Stella NFe. Estamos procurando contribuidores para ajudar a finalizar o desenvolvimento.

http://www.guj.com.br/posts/list/135161.java

L

Conheço empresa mineira para integração de sistemas ERP para envio de Notas Fiscais de Serviço para a prefeitura de Belo Horizonte e outras.

O Software NFS-e Smart permite integração via XML, TXT e banco de dados, isto mesmo, pode importar diretamente do seu banco de dados e enviar para a prefeitura do município.

Visite www.sobdemanda.net

Criado 27 de agosto de 2008
Ultima resposta 3 de abr. de 2010
Respostas 26
Participantes 11