Tecnologias Java para Implementação de NF­e Edilmar Alves Novembro/2008 [email protected] Palestrante ● ● ● ● ● Mestre em Ciência da Computação pela UNICAMP/SP; Professor Universitário nas áreas de Redes de Computadores, Servidores Linux e Programação Java; Sócio/Diretor Técnico da InterSite Informática, onde desenvolve projetos de sistemas usando ferramentas livres, além de administração de servidores Internet Linux; Desenvolvedor principal do software livre Java Framework SubMacro. Participante da comunidade JUGMS Tópicos ● Visão Geral de NF­e ● Padrões Técnicos ● Serviços Síncronos e Assíncronos ● Webservices e SOAP ● Certificação Digital ● Validação de Schemas XSD ● Envio e Armazenamento ● Conclusão Visão Geral de NF­e ● NF­e: Nota Fiscal Eletrônica ● Documento exclusivamente digital ● Exigência da Receita em diversos nichos de negócio ● Troca online de informações fiscais entre ERP e Receita de cada Estado (Secretaria de Fazenda) ● Necessária homologação do ERP em cada Estado ● Problema: diferenças de legislação entre estados Visão Geral de NF­e ● Manuais disponíveis nos sites das Receitas Estaduais e Receita Federal Padrões Técnicos ● Informações trocadas através de arquivos XML 1.0 codificados em UTF­8 ● Arquivo XML deve ser validado por Schema XSD ● Comunicação usando HTTPs (HTTP Seguro) ● Certificado digital A1 ou A3 ● ● Autenticação Mútua: certificado do ERP + certificado da Receita (fornecido) Arquivo XML deve ser assinado com o certificado Serviços Síncronos e Assíncronos ● Síncrono: envio de requisição pelo ERP e retorno de resposta da Receita. Serviços Síncronos e Assíncronos ● Assíncrono: envio de requisição pelo ERP e aguardo de resposta da Receita, através de outra thread. Serviços Síncronos e Assíncronos ● ● ● ● Consulta de Status de Serviço: síncrono, testar se o serviço está em pleno funcionamento. Envio de Lote de NF­e: assíncrono, envio de uma ou mais NFs, que serão processadas pela Receita, com posterior resposta. Retorno de Recepção de Lote de NF­e: síncrono, para verificar se as NFs enviadas foram processadas corretamente. Cancelamento de NF­e: síncrono. Webservices e SOAP ● ● ● ● Webservice: programa instalado em um servidor web (protocolos HTTP e HTTPs), que fornece um ou mais serviços para outros sistemas remotos (clientes). RPC: chamada de procedimento remoto, técnica usada para que clientes acessem os serviços remotos. RMI: termo em Java para RPC, chamada de métodos (orientação a objeto). JAX­WS: https://jax­ws.dev.java.net/ ­ implementação de webservices em Java Webservices e SOAP ● ● SOAP: protocolo de comunicação definido pela W3C, baseado na troca de informações formatadas com arquivos XML, encapsula RPC sobre HTTP. Webservices+SOAP: – – – uso da Internet (TCP/IP) como protocolo da rede/transporte de dados; uso do protocolo de aplicação HTTP/HTTPs para comunicação cliente/servidor via Internet; uso do SOAP para formatação dos dados, via Jaxp ­ https://jaxp.dev.java.net/. Certificação Digital ● ● ● Certificado digital: arquivo contendo informações de pessoa física ou jurídica. Fornecido por um cartório digital (ex. Serpro, Certisign, Serasa, etc). Contém chaves pública e privada, usadas no algoritmo de criptografia. Certificação Digital ● ● ● ● Protocolo SSL: usado por servidores web HTTPs para implementar a criptografia. http://www.gta.ufrj.br/grad/00_2/ssl/ssl.htm No Java, o uso dos certificados digitais é feito através de KeyStores, que devem ser setados antes de iniciar a comunicação com o servidor. SubMacroUtils.GeralXML.setKeyStore() Certificação Digital ● ● Assinatura digital: procedimento de gravação da tag <Signature> (e seus descendentes) em um arquivo XML, usando um certificado digital. Objetivos: – – – Privacidade: somente o servidor conseguirá ler o XML; Autenticidade: garantir que as informações foram enviadas pelo cliente; Integridade: através de algoritmo de checksum, garantir que os dados não foram adulterados durante o envio. Certificação Digital ● ● SubMacroUtils.GeralXML.assinarXML(): utiliza as bibliotecas de criptografia do Java para gerar a tag <Signature> no arquivo XML. Alguns links sobre assinatura digital em Java: – http://java.sun.com/developer/technicalArticles/xml/dig_signature_api/ – http://java.sun.com/javase/technologies/security/ – http://java.sun.com/javase/6/docs/technotes/guides/security/xmldsig/XMLDigitalSignature.html Validação dos Schemas XSD ● ● ● Schema XSD: arquivo que contém a definição da estrutura de dados usada pelo XML. Um arquivo XML deve obedecer as regras estabelecidas pelo seu XSD, para ser validado. Exemplos de regras: definição de tipos e subtipos, nomes de campos, etc. Validação dos Schemas XSD <xs:element name="aniversario"> <xs:complexType> <xs:sequence> <xs:element name="dia" type="xs:int" /> <xs:element name="mes" type="xs:string" /> <xs:element name="ano" type="xs:int" /> </xs:sequence> </xs:complexType> </xs:element> </xs:schema> Validação dos Schemas XSD <aniversario> <dia>18</dia> <mes>Fevereiro</mes> <ano>1973</ano> </aniversario> <aniversario> <dia>Dezoito</dia> <mes>02</mes> <ano>1973</ano> </aniversario> Validação dos Schemas XSD ● ● ● É necessário validar o XML no ERP antes do envio para a Receita, usando os XSDs fornecidos por ela. SubMacroUtils.GeralXML.validarXMLporXSD(): método de validação usando API padrão JAXP. Links com tutoriais sobre validação: – http://java.sun.com/developer/technicalArticles/xml/validationxpath/ – http://java.sun.com/j2ee/1.4/docs/tutorial/doc/JAXPDOM8.html – http://www.ibm.com/developerworks/xml/library/x­javaxmlvalidapi.html Envio e Armazenamento ● ● Envio: validação e assinatura do XML, envio do lote de NFs via Webservice/SOAP. Nova thread para aguardar processamento da Receita: – – – se NF correta, armazená­la no banco de dados por 5 anos, pelo menos. Estabelecer política de backup confiável; Após confirmação, pode­se imprimir o DANFE (documento a ser entregue ao cliente) se NF errada, definir um procedimento de correção no ERP, para posterior re­envio. Envio e Armazenamento <enviNFe versao="1.07"> <idLote>000000000001538</idLote> <NFe> <infNFe versao="1.07" Id="NFe43060992665611012850550079000000011485651995"> <ide><cUF>43</cUF><cNF>148565199</cNF> <natOp>TRANSFERENCIA REMETIDA MERCADORIA</natOp> <indPag>1</indPag><mod>55</mod><serie>7</serie><nNF>900000001</nNF> <dEmi>2006­09­12</dEmi><dSaiEnt>2006­09­12</dSaiEnt><tpNF>1</tpNF> ...</ide> ...<NFe>...<enviNFe> Envio e Armazenamento Conclusão ● ● ● ● NF­e: “caminho sem volta” Necessária adaptação dos ERPs ou aquisição de um novo ERP com suporte – ex. InterSite Gestor. Possibilidade de integração do ERP com ferramentas de terceiros – ex. InterSite eMonitor. Java: possui toda a infra­estrutura de bibliotecas para implementação e/ou integração de NF­e.