[Resolvido] NF-e JSF 2.0

Bom dia pessoal,

Estou desenvolvendo um software em JSF 2.0 e agora preciso implementar NF-e.

Possuo um software em Delphi de NF-e, na qual utilizei uma biblioteca DLL que auxilia muito na geração dos xml, comunicação com webservices e etc… Agora, pesquisando bastante sobre algo parecido para Java, me deparei com alguns projetos, mas não se ouve falar de sucesso neles, alguns aparentemente descontinuados e etc.

Alguém ai tem alguma dica pra me passar sobre isto? Alguma biblioteca (mesmo que paga, se o valor não for abusivo) para facilitar as coisas?

Outra dúvida que tenho é: Como fazer pra “pegar” o certificado digital na máquina do usuário a partir de um software web?

Abraço

Cara, em termos de software pronto, eu acho que não existem muitos. Porque pra realmente montar um produto, teria que englobar todas as variações de notas, precisaria de um contador e tudo mais.

Tem o Easy NF-e mas eu nunca usei também, então não posso te dizer nada sobre.

Agora em termos de pegar o certificado, você precisa do caminho do arquivo mesmo. Eu tenho um método aqui que trata isso, talvez te ajude:

[code] public static void configurar(){

	System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
	Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

	System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");

	System.clearProperty("javax.net.ssl.keyStore");
	System.clearProperty("javax.net.ssl.keyStorePassword");
	System.clearProperty("javax.net.ssl.trustStore");

	System.setProperty("javax.net.ssl.keyStore", CAMINHO_DO_SEU_CERTIFICADO);
	System.setProperty("javax.net.ssl.keyStorePassword", SENHA_DO_CERTIFICADO);

	System.setProperty("javax.net.ssl.trustStoreType", "JKS");
	System.setProperty("javax.net.ssl.trustStore", CAMINHO_DO_ARQUIVO_CACERTS);
	
}[/code]

[quote=Rodrigo Sasaki]Cara, em termos de software pronto, eu acho que não existem muitos. Porque pra realmente montar um produto, teria que englobar todas as variações de notas, precisaria de um contador e tudo mais.

Tem o Easy NF-e mas eu nunca usei também, então não posso te dizer nada sobre.

Agora em termos de pegar o certificado, você precisa do caminho do arquivo mesmo. Eu tenho um método aqui que trata isso, talvez te ajude:

[code] public static void configurar(){

	System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
	Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());

	System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");

	System.clearProperty("javax.net.ssl.keyStore");
	System.clearProperty("javax.net.ssl.keyStorePassword");
	System.clearProperty("javax.net.ssl.trustStore");

	System.setProperty("javax.net.ssl.keyStore", CAMINHO_DO_SEU_CERTIFICADO);
	System.setProperty("javax.net.ssl.keyStorePassword", SENHA_DO_CERTIFICADO);

	System.setProperty("javax.net.ssl.trustStoreType", "JKS");
	System.setProperty("javax.net.ssl.trustStore", CAMINHO_DO_ARQUIVO_CACERTS);
	
}[/code]

[/quote]

Obrigado pela resposta xará!

Mas e no caso de certificado A3 com leitora de cartões?

Você já implementou NF-e? Como foi a experiencia?

Com a leitora de cartões eu nunca trabalhei.

Eu tive que implementar a emissão de NF-e em um projeto, e a experiência foi dolorosa :slight_smile:

Mas eu não tinha o conhecimento necessário na época, então dei muita cabeçada na parede até conseguir terminar.

Você tem que estudar o guia da NF-e, entender como emitir a nota, e os processos necessários.

Por exemplo, antes de emitir um lote, você tem que saber que precisa canonicalizar e assinar o XML. no JavaC tem muita coisa pronta e feita com o Axis. Eu particularmente não gostei muito do Axis, achei ele ruim de trabalhar, mas talvez o código de lá te ajude.

Acho que o tópico não tem muito a ver com JSF, porque toda a parte da nfe em si vai estar por trás dos panos.

Essa parte do certificado é meio delicada. Você disse “máquina do usuário”. Você quis dizer isso mesmo, ou está falando do servidor? Se for o servidor, o código do Rodrigo é um caminho. Mas se for a máquina do cliente, você vai ter que enviar / copiar o certificado para o servidor. Você pode exportar o certificado a partir do navegador para isso.

Ou você quer acessar o certificado a partir de uma página web, que o usuário está acessando?

Por fim, legal o Rodrigo mencionar o Easy-NFe - é um produto de um cliente meu, e tem meu dedo lá, então eu posso recomendar :slight_smile:

[quote=jcranky]Por fim, legal o Rodrigo mencionar o Easy-NFe - é um produto de um cliente meu, e tem meu dedo lá, então eu posso recomendar :)[/quote]Onde será que eu ouvi falar desse Easy NF-e? :stuck_out_tongue:

[quote=jcranky]Acho que o tópico não tem muito a ver com JSF, porque toda a parte da nfe em si vai estar por trás dos panos.

Essa parte do certificado é meio delicada. Você disse “máquina do usuário”. Você quis dizer isso mesmo, ou está falando do servidor? Se for o servidor, o código do Rodrigo é um caminho. Mas se for a máquina do cliente, você vai ter que enviar / copiar o certificado para o servidor. Você pode exportar o certificado a partir do navegador para isso.

Ou você quer acessar o certificado a partir de uma página web, que o usuário está acessando?

Por fim, legal o Rodrigo mencionar o Easy-NFe - é um produto de um cliente meu, e tem meu dedo lá, então eu posso recomendar :)[/quote]

Vou explicar melhor:

A aplicação JSF fica hospedada em um servidor na nuvem, o mesmo não terá instalado nenhum certificado, nem leitora de cartões.

O sistema precisa acessar o certificado (A1 ou A3) no computador do usuário mesmo, ou seja, apartir do acesso web dele.

Através de applets eu consigo fazer isto, certo?

Alguem tem algum código de acesso à certificado A3? Penso que se utilizar tal código em applet, talvez consiga, certo?

Abraço, e mais uma vez, obrigado pelas respostas

Vai saber… :smiley:

Quanto ao certificado A3, é um pé no saco, mas depende do cenário. No caso, o problema é que você não pode tirar o certificado do pen-drive, o que quer dizer que, para usá-lo, você teria basicamente duas alternativas:

  • Colocar o pen-drive no servidor (argh!!)
  • Usar uma applet no cliente, que faça tudo o que precisa ser feito com o certificado na própria máquina do cliente (argh também, mas um pouco menos …)

Claro que aqui estamos falando de aplicações web, aplicações desktop são outra história…

Vai saber… :smiley:

Quanto ao certificado A3, é um pé no saco, mas depende do cenário. No caso, o problema é que você não pode tirar o certificado do pen-drive, o que quer dizer que, para usá-lo, você teria basicamente duas alternativas:

  • Colocar o pen-drive no servidor (argh!!)
  • Usar uma applet no cliente, que faça tudo o que precisa ser feito com o certificado na própria máquina do cliente (argh também, mas um pouco menos …)

Claro que aqui estamos falando de aplicações web, aplicações desktop são outra história…[/quote]

Então diante do cenário, pensei no segunte…

Back-end Java gerando os xml’s. e Applet comunicando com certificados, assinando, acessando webservices e etc.

Porém, não estou conseguindo rodar applets (nunca fiz). Achei um hello world aqui mas estou com dificuldades em integra-lo ao meu xhtml.

Alguem exemplo?

Não tenho um exemplo fácil aqui, mas o Sasaki postou um link em algum outro tópico sobre nfe que deve ter algo útil. Dá uma fuçada no google também, eu lembro que achei algo na época que estudei a possibilidade de suportar A3, mas não lembro onde - acabamos decidindo que A3 não vale a pena para o nosso cenário, pelo menos por enquanto.

Aproveitando, sugiro evitar o Axis / Axis2 se for possível - isso pode dar um pouco mais de trabalho no começo, pesquisando e testando alternativas mais enxutas, mas no médio / longo prazo diminiu um bocado o trabalho de manutenção.

O que você quer dizer exatamente com “integrá-lo com xhtml”? Como está tentando / querendo fazer a comunicação?

[quote=jcranky]Não tenho um exemplo fácil aqui, mas o Sasaki postou um link em algum outro tópico sobre nfe que deve ter algo útil. Dá uma fuçada no google também, eu lembro que achei algo na época que estudei a possibilidade de suportar A3, mas não lembro onde - acabamos decidindo que A3 não vale a pena para o nosso cenário, pelo menos por enquanto.

Aproveitando, sugiro evitar o Axis / Axis2 se for possível - isso pode dar um pouco mais de trabalho no começo, pesquisando e testando alternativas mais enxutas, mas no médio / longo prazo diminiu um bocado o trabalho de manutenção.

O que você quer dizer exatamente com “integrá-lo com xhtml”? Como está tentando / querendo fazer a comunicação?[/quote]

Obrigado pelas dicas…

Estou fazendo o seguinte:

Classe Java:

package br.com.coiotesistemas.integrado.applet;

import java.applet.*;
import java.awt.Graphics;
 
public class AppletExample extends Applet {
 
   public void init() {
     /**
      * init work
      */
   }
 
   public void paint( Graphics g ) {
	   g.drawString("Hello World - Applet",40,100); 
   }
}

xhtml:

<applet width="300" height="300" code="AppletExample"></applet>

Me retorna ClassNotFoundException

Já tentei outras maneiras como:

<applet width="300" height="300" code="br.com.coiotesistemas.integrado.AppletExample"></applet>
<applet width="300" height="300" code="br.com.coiotesistemas.integrado.AppletExample.class"></applet>

Tentei gerandop .jar… etc.

Pelo visto, a maneira de fazer isto mudou nas ultimas versões do Java. Tá um pouco confuso a maneira correta de se fazer…

Alguma sugestão?

Tente usar barras ao invés de pontos no atributo code, com o .class no final.

Valeu irmão… deu certo assim oww:

<applet code="br.com.coiotesistemas.integrado.applet.AppletExample" archive="Applets.jar" codebase="localhost:8080/integrado/" width="750" height="425" />

Agora preciso aprender a lidar com applets, como trocar informações entre bean x applets… acessar certificados a3 (a1 tem muito material sobre, mas a3…) e etc…

Obrigado pela ajuda aee… vou ver o que consigo… abraço!

Pessoal

Estou iniciando desenvolvimento de aplicação para NFE tambem.

Encontrei alguma coisa sobre certificado digital para Servidor.

Eu, como empresa de prestação de serviço emito NFEs no site da prefeitura.

E não tenho nenhum certificado digital no meu micro.

Gostaria de saber como isso funciona, pois creio que seja a mesma sistemática que preciso pro meu software,
e que o nosso colega Rodrigo esteja precisando…

Alguem pode ajudar?

[quote=bruno_bert]Pessoal

Estou iniciando desenvolvimento de aplicação para NFE tambem.

Encontrei alguma coisa sobre certificado digital para Servidor.

Eu, como empresa de prestação de serviço emito NFEs no site da prefeitura.

E não tenho nenhum certificado digital no meu micro.

Gostaria de saber como isso funciona, pois creio que seja a mesma sistemática que preciso pro meu software,
e que o nosso colega Rodrigo esteja precisando…

Alguem pode ajudar?[/quote]

Cara… na verdade já até terminei aki… ficou bem legal… Funciona tanto com certificado digital A1 quanto com A3, estando eles no pc CLIENTE…

Num acho nada prático que os certificados fiquem no servidor. Até porque, parte dos nossos sistemas ficam no nosso servidor. O cliente apenas acessa pela internet… Então nós teriamos que pegar o certificado do cliente e instalar no nosso servidor… sem chance né…

Fale um pouco mais sobre seu projeto, se eu puder ajudar…

abraço

Então

O meu projeto é exatamente o que você fez.

É um sistema instalado no servidor, especificamente no JBOSS,
que cada usuário que precisa emitir uma NFE vai acessar do seu micro,
e para isso, precisa ter o certificado instalado no seu micro, não no servidor (A1).
Ou o token no usb do seu micro, não no servidor (A3).

Esse certificado, de acordo com a funcional do projeto, pode ser A1 ou A3, ou seja,
bem parecido com o seu sistema.

Cara, se puder me dar uma luz de como fazer, te agradeço muito.
Você fez com applet??
Como fez pra assinar o xml? enviou pro cliente, assinou e depois deu upload novamente? Algo assim?

Meu prazo é curto demais…rs

Agradeço desde já

[quote=bruno_bert]Então

O meu projeto é exatamente o que você fez.

É um sistema instalado no servidor, especificamente no JBOSS,
que cada usuário que precisa emitir uma NFE vai acessar do seu micro,
e para isso, precisa ter o certificado instalado no seu micro, não no servidor (A1).
Ou o token no usb do seu micro, não no servidor (A3).

Esse certificado, de acordo com a funcional do projeto, pode ser A1 ou A3, ou seja,
bem parecido com o seu sistema.

Cara, se puder me dar uma luz de como fazer, te agradeço muito.
Você fez com applet??
Como fez pra assinar o xml? enviou pro cliente, assinou e depois deu upload novamente? Algo assim?

Meu prazo é curto demais…rs

Agradeço desde já[/quote]

Cara… exatamente o que eu fiz… =D

Analisando os prós e contras, cheguei a conclusão que a melhor opção era fazer tudo num applet mesmo… ainda que este tenha alguns contras (ex: necessidade de jre na maquina cliente, os JARS são baixados no pc cliente, e não são poucos… uma conexão de banco só pro applet… etc etc etc)

Nada de upload… o sistema abre uma aba com o applet… e nele se faz tudo… gera xml, assina, transmite e tudo mais…

É bem foda sim, mas sobrevive-se a isso… e tem um fórum ai que tem mta coisa… me ajudou demais meeesmo…

se quiser me add no msn/skype que te ajudo melhor… dai para contribuir com a comunidade, você posta trechos de certos códigos pra ajudar a galera, tipo assinatura, e essa questão dos certificados, pode ser? (falo isso pra naum te passar alguma coisa e o povo reclamar que não ficou pra comunidade, tendeu?)

rmarcelodeoliveira@gmail.com

Já topei brother…sempre posto coisas pra ajudar a galera também…

Seu skype é esse do email?

Já estou te adicionando…

Falow

Rodrigo, sua solução como você mesmo disse tem seus pros e contras.

Eu pensei na seguinte solução. É só teoria por enquanto, mas vamos lá:

Fazer toda a criação, validação e transmissão da Nfe no servidor, e fazer apenas a assinatura do xml no applet.

Trocando o objeto entre servlet e applet dessa forma, transformando o objeto em JSON:

ObjetoNFE nfe = criaNfe();
String json = new Gson().toJson(nfe);
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
response.getWriter().write(json);

E no applet, converto o JSON ao objeto e assino:

InputStream input = new URL(getCodeBase(), "servletPath").openStream();
ObjetoNFE nfe = new Gson().fromJson(new InputStreamReader(input, "UTF-8"), ObjetoNFE.class)
AssinaXML(nfe);

E depois mando o objeto assinado do Applet para o Servlet.

No Servlet, eu faço a transmissão do XML assinado.

Acha que rola?

Cuidado com a conversão xml <-> json - se você perder os namespaces no caminho, já era, não vai funcionar.