在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:wmixvideo/nfe开源软件地址:https://github.com/wmixvideo/nfe开源编程语言:Java 100.0%开源软件介绍:Nota Fiscal EletrônicaComunicador de nota fiscal e nota fiscal do consumidor da fazenda. AtençãoEste é um projeto colaborativo, sinta-se à vontade em usar e colaborar com o mesmo. Antes de submeter um pull request, verifique a estrutura seguida pelo projeto e procure incluir no mesmo testes unitários que garantam que a funcionalidade funciona como o esperado. Antes de usarAntes de começar a implementar, é altamente recomendável a leitura da documentação oficial que o governo disponibiliza em http://www.nfe.fazenda.gov.br/portal Caso não possua conhecimento técnico para criar notas fiscais, um profissional da área (como um contador) pode lhe auxiliar. InstalaçãoDiretamente pelo Maven<dependency>
<groupId>com.github.wmixvideo</groupId>
<artifactId>nfe</artifactId>
<version>${latest.release}</version>
</dependency> Para acessar a lista de versões disponíveis, acesse a página de release aqui no github. Diretamente pelo código fonte (última versão em desenvolvimento) git clone https://github.com/wmixvideo/nfe
mvn clean install Como usarBasicamente você precisará de uma implementação de NFeConfig (exemplificado abaixo), com informações de tipo de emissão, certificados digitais, e uma instância da WsFacade, essa classe tem a responsabilidade de fazer a ponte entre o seu sistema e a comunicação com os webservices da Sefaz. // Exemplo de configuracao para acesso aos serviços da Sefaz.
public class NFeConfigTeste extends NFeConfig {
private KeyStore keyStoreCertificado = null;
private KeyStore keyStoreCadeia = null;
@Override
public NFUnidadeFederativa getCUF() {
return NFUnidadeFederativa.SC;
}
@Override
public String getCertificadoSenha() {
return "senha_certificado";
}
@Override
public String getCadeiaCertificadosSenha() {
return "senha_cadeia";
}
@Override
public KeyStore getCertificadoKeyStore() throws KeyStoreException {
if (this.keyStoreCertificado == null) {
this.keyStoreCertificado = KeyStore.getInstance("PKCS12");
try (InputStream certificadoStream = new FileInputStream("/tmp/certificado.pfx")) {
this.keyStoreCertificado.load(certificadoStream, this.getCertificadoSenha().toCharArray());
} catch (CertificateException | NoSuchAlgorithmException | IOException e) {
this.keyStoreCadeia = null;
throw new KeyStoreException("Nao foi possibel montar o KeyStore com a cadeia de certificados", e);
}
}
return this.keyStoreCertificado;
}
@Override
public KeyStore getCadeiaCertificadosKeyStore() throws KeyStoreException {
if (this.keyStoreCadeia == null) {
this.keyStoreCadeia = KeyStore.getInstance("JKS");
try (InputStream cadeia = new FileInputStream("/tmp/cadeia.jks")) {
this.keyStoreCadeia.load(cadeia, this.getCadeiaCertificadosSenha().toCharArray());
} catch (CertificateException | NoSuchAlgorithmException | IOException e) {
this.keyStoreCadeia = null;
throw new KeyStoreException("Nao foi possibel montar o KeyStore com o certificado", e);
}
}
return this.keyStoreCadeia;
}
} Configurar pelo repositório de certificados do Windows:Carregando os alias disponíveis(certificados instalados) no Windows:KeyStore keyStoreCert = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
keyStoreCert.load(null, null);
Enumeration<String> aliasEnum = keyStoreCert.aliases(); Após isso é necessário algum método para o usuário escolher entre um destes alias, talvez por meio de um JOptionPane(<java7) ou de um ChoiceDialog(>=Java8), e então fazer o load com a respectivo alias escolhido e sua senha. Alguns exemplosConsidere para os exemplos abaixo que config seja uma instância da implementação da interface NFeConfig. Status dos webservicesNFStatusServicoConsultaRetorno retorno = new WSFacade(config).consultaStatus(DFUnidadeFederativa.SC, DFModelo.NFE);
System.out.println(retorno.getStatus());
System.out.println(retorno.getMotivo()); O Resultado será (caso o webservice responsável por SC esteja OK):
Envio do lote para o sefazPopule os dados do lote a ser enviado para o Sefaz: NFLoteEnvio lote = new NFLoteEnvio();
// setando os dados do lote Faça o envio do lote através do facade: final NFLoteEnvioRetorno retorno = new WSFacade(config).enviaLote(lote); Corrige notaFaça a correção da nota através do facade: final NFEnviaEventoRetorno retorno = new WSFacade(config).corrigeNota(chaveDeAcessoDaNota, textoCorrecao, sequencialEventoDaNota); Cancela notaFaça o cancelamento da nota através do facade: final NFEnviaEventoRetorno retorno = new WSFacade(config).cancelaNota(chaveDeAcessoDaNota, protocoloDaNota, motivoCancelaamento); Consulta nota por chave de acesso ou NSUFaça a consulta da nota através do facade: final NFDistribuicaoIntRetorno retorno = new WSFacade(config).consultarDistribuicaoDFe(cnpj, uf, chaveAcesso, nsu, ultNsu); Convertendo objetos Java em XMLQualquer objeto que seja uma representação XML do documento NFe, pode ser obtido seu XML de forma fácil bastando chamar o método toString, por exemplo, para conseguir o XML do lote, invoque o toString NFLoteEnvio lote = new NFLoteEnvio();
// setando os dados do lote
...
// Obtendo o xml do objeto
String xmlGerado = lote.toString(); Convertendo nota XML em JavaExiste uma classe que pode receber um File/String e converter para um objeto NFNota, faça da seguinte forma: final NFNota nota = new DFPersister().read(NFNota.class, xmlNota);
final NFNotaProcessada notaProcessada = new DFPersister().read(NFNotaProcessada.class, xmlNotaProcessada); Ou desabilitando o modo estrito (habilitado por padrão): final NFNota nota = new DFPersister(false).read(NFNota.class, xmlNota); Armazenando notas autorizadasVocê precisará armazenar as notas autorizadas por questões legais e também para a geração do DANFE, uma forma de fazer é armazenar o xml das notas ao enviar o lote: final List<NFNota> notas = lote.getNotas();
// Armazena os xmls das notas
... Ao fazer a consulta do lote, crie um objeto do tipo NFNotaProcessada e adicione o protocolo da nota correspondente, além da nota assinada: // Carregue o xml da nota do local que foi armazenado
final String xmlNotaRecuperada;
// Assine a nota
final String xmlNotaRecuperadaAssinada = new AssinaturaDigital(config).assinarDocumento(xmlNotaRecuperada);
// Converta para objeto java
final NFNota notaRecuperadaAssinada = new DFPersister().read(NFNota.class, xmlNotaRecuperadaAssinada);
// Crie o objeto NFNotaProcessada
final NFNotaProcessada notaProcessada = new NFNotaProcessada();
notaProcessada.setVersao(new BigDecimal(NFeConfig.VERSAO_NFE));
notaProcessada.setProtocolo(protocolo);
notaProcessada.setNota(notaRecuperadaAssinada);
// Obtenha o xml da nota com protocolo
String xmlNotaProcessadaPeloSefaz = notaProcessada.toString(); Funcionalidades
Serviços disponíveis
RequisitosJDK >= 1.8 Criação do Java KeyStore (JKS)Para usar os serviços da nota fiscal são necessários dois certificados:
Os certificados são um ponto crítico já que estes tem validade de apenas um ano (certificado cliente). Além disso as SEFAZ vem trocando suas cadeias de certificado a cada atualização. Dessa forma se surgirem erros de SSL vale a pena verificar se existem novas atualizações de certificados. Para gerar a cadeia de certificados, disponibilizamos um pequeno helper que baixa os certificados das SEFAZ e gera o arquivo automaticamente: public static void main(String args[]){
try {
FileUtils.writeByteArrayToFile(new File("/tmp/producao.cacerts"), DFCadeiaCertificados.geraCadeiaCertificados(DFAmbiente.PRODUCAO, "senha"));
FileUtils.writeByteArrayToFile(new File("/tmp/homologacao.cacerts"), DFCadeiaCertificados.geraCadeiaCertificados(DFAmbiente.HOMOLOGACAO, "senha"));
} catch (Exception e) {
e.printStackTrace();
}
} |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论