Desenvolvimento - Visual Basic
Nota Fiscal Eletrônica: Construindo um "Servidor de Assinatura Digital" com o NFeExpress
Este pequeno projeto mostra a versatilidade do componente NFeExpress que foi desenvolvido originalmente para ser adicionado a aplicativos em operação e oferecer suporte à nota fiscal eletrônica.
por Marco Aurélio BarbieroEste pequeno projeto mostra a versatilidade do componente NFeExpress que foi desenvolvido originalmente para ser adicionado a aplicativos em operação e oferecer suporte à nota fiscal eletrônica.
Nota. Para obter o NFeExpress.ocx versão 1.2, acesse http://www.nfeexpress.com.br/download.asp, baixe o "Kit de Desenvolvimento Acelerado NFeExpress" e instale-o.
Em linhas gerais, podemos dizer que nosso servidor é um aplicativo que monitora constantemente uma pasta esperando por arquivos que outras aplicações possam ter gravado nela. Encontrando um arquivo, o servidor o assina e grava em uma outra pasta para que seja lido pela aplicação-cliente.
Uma implementação de um assinador de NFe baseada em servidor apresenta algumas características desejáveis:
- mantém o certificado digital privado da empresa protegido, evitando que ele tenha que ser instalado em várias máquinas;
- reduz a necessidade de alterações no código dos aplicativos clientes;
- simplifica o processo de assinatura digital, centralizando o código;
- as aplicações-cliente podem ser escritas em qualquer linguagem e podem rodar em qualquer sistema operacional.
Nota. Apesar de as aplicações-cliente poderem rodar em qualquer SO, o serviço de assinatura tem que rodar numa máquina com Windows XP ou Windows 2000, já que a versão do NFeExpress para Windows 98 não dá suporte à assinatura digital.
O projeto
Vamos usar uma forma rudimentar, mas muito robusta, de comunicação inter-processos: caixas de entrada e de saída. No caso, usaremos uma pasta para entrada do arquivo XML da NFe e uma pasta para a saída da NFe, já assinada.
Vamos por partes:
1 - Instale o certificado privado da empresa ou o certificado de teste fornecido com o NFeExpress.
Uma nota fiscal eletrônica só pode ser assinada se houver um certificado digital privado instalado no Windows. Se você não tiver um certificado, baixe o certificado "Associação dos Moradores.pfx" disponível na área de download do site www.NFeExpress.com.br e instale-o.
Para garantir que o certificado está corretamente instalado abra o Internet Explorer e clique em [Ferramentas] [Opções da Internet...] [Conteúdo] [Certificados...]. Na lista de certificados pessoais, verifique se aparece o nome "ASSOCIAÇÃO DOS MORADORES E AMIGOS B PARQUE S J DE 00072396000182".
2 - Crie a pasta de arquivamento no servidor usando o Windows Explorer.
A pasta-base ou pasta de arquivamento é o local onde serão salvos os documentos criados durante o processo de assinatura da NFe e servirá como "Caixa de saída" do servidor.
É obrigatório que a pasta-base e a pasta que servirá de "Caixa de entrada" sejam acessíveis tanto pelo cliente quanto pelo servidor. Nossa sugestão é que estas pastas fiquem no mesmo equipamento que vai rodar o serviço de assinatura e sejam compartilhadas.
Você deve criar a estrutura de pastas manualmente. No caso do servidor de assinatura, basta criar a pasta-base e uma pasta abaixo com o nome "NFe".
Pode chamá-la, por exemplo, "Arquivos Assinador NFeExpress".
3 - Crie uma pasta abaixo da pasta de arquivamento e atribua-lhe o nome "NFe".
Atenção... o nome "NFe" é obrigatório para esta pasta.
4 - Crie uma pasta para servir de "Caixa de entrada".
Nesse nosso exemplo usaremos "NFe para Assinar".
Estrutura de pastas criada para o servidor
5 - Copie para a pasta de arquivamento os arquivos "Estrutura NFeExpress.xml" e "Registro NFeExpress.xml".
Se você instalou a aplicação-modelo do NFeExpressKDA, encontrará os esses arquivos na pasta C:\Arquivos de programas\NFeExpress KDA, caso contrário baixe-os da área de download do site.
Se o arquivo "Registro NFeExpress.xml" não estiver na pasta de arquivamento ou se você estiver utilizando um registro provisório, o CNPJ da empresa emissora no documento XML da Nota Fiscal Eletrônica assinado será definido automaticamente com zeros ou com um valor inválido e não poderá ser alterado.
6 - Defina a pasta de arquivamento com o comando "iniPastaArquivamento":
Em VB6:
NFeExpress1.iniPastaArquivamento "c:\Arquivos Assinador NFeExpress\"
7 - Inicialize a estrutura do documento usando o método iniXmlNFE
Em VB6:
… If Not NFeExpress1.iniXmlNFE Then MsgBox "Erro no carregamento do arquivo ""Estrutura NFeExpress.xml""" End End If …
8 - Inserir o código que permite a escolha do certificado
NFeExpress1.iniCertificado
9 - Insira um controle do tipo "timer" no seu projeto. No caso do VB6, o controle se chama "timer" mesmo.
Este timer deve ser definido para executar, por exemplo, de 2 em 2 segundos e verificar a presença de arquivos na caixa de entrada. Se tiver algum arquivo da Nota Fiscal Eletrônica esperando para ser assinado, basta carregá-lo no NFeExpress com o método CarregaNFe e apagá-lo da "caixa de entrada".
Private Sub Timer1_Timer() Dim arquivo As String arquivo = Dir("c:\arquivos Assinador NFeExpress\Nfe para Assinar\*.*", vbNormal) Do While arquivo <> "" "desabilita o timer enquanto houver arquivos para assinar Timer1.Interval = 0 arquivo = "c:\Arquivos Assinador NFeExpress\Nfe para Assinar\" & arquivo "carrega arquivo para assinar NFeExpress1.carregaNFe arquivo "assina arquivo da NFe If NFeExpress1.AssinaNFe Then "apaga o arquivo depois de carregar Kill arquivo Else MsgBox "Erro ao assinar arquivo" End If "próximo arquivo arquivo = Dir("c:\arquivos Assinador NFeExpress\Nfe para Assinar\*.*", vbNormal) Loop "reativa o time definindo o intervalo para 2 segundos Timer1.Interval = 2000 End Sub
Se tudo der certo, um arquivo XML de nota fiscal eletrônica assinado será gravado na caixa de saída, no caso, a pasta "C:\Arquivos Assinador NFeExpress\NFe", sempre que houver uma arquivo XML na caixa de entrada.
Para testar o servidor, basta gravar um arquivo de NFe na caixa de entrada e aguardar aproximadamente 2 segundos. Se você não têm um arquivo XML de NFe pode baixar alguns não assinados no site http://www.nfeexpress.com.br/download.asp.
Note que o NfeExpress sempre grava os arquivos em pastas abaixo da pasta de arquivamento. Essas pastas devem ser nomeadas de acordo com as definições do Manual de Integração.
Conclusão
Este servidor é muito simples. Você pode melhorá-lo criando um método para comunicar os erros de uma forma menos rudimentar e um para verificar se o documento que está na caixa de entrada é mesmo um documento XML da nota fiscal eletrônica, entre outros.
Código completo do Assinador em VB6
Private Sub Form_Activate() "define a pasta-base de arquivamento NFeExpress1.iniPastaArquivamento "c:\Arquivos Assinador NFeExpress\" "carrega o arquivo que contém o modelo da NFe If Not NFeExpress1.iniXmlNFE Then MsgBox "Erro no carregamento do arquivo ""Estrutura NFeExpress.xml""" End End If "define o certificado a ser usado na assinatura NFeExpress1.iniCertificado "mostra o Id do certificado, para permitir a abertura desse diretamente na linha de comando MsgBox "Para abrir este certificado diretamente use a linha de comando:" & vbCrLf & "NFeExpress1.iniCertificado """ & NFeExpress1.retornaCertificado & """" End Sub Private Sub Timer1_Timer() Dim arquivo As String arquivo = Dir("c:\arquivos Assinador NFeExpress\Nfe para Assinar\*.*", vbNormal) Do While arquivo <> "" "desabilita o timer enquanto houver arquivos para assinar Timer1.Interval = 0 arquivo = "c:\Arquivos Assinador NFeExpress\Nfe para Assinar\" & arquivo "carrega arquivo para assinar NFeExpress1.carregaNFe arquivo "assina arquivo da NFe If NFeExpress1.AssinaNFe Then "apaga o arquivo depois de carregar Kill arquivo Else MsgBox "Erro ao assinar arquivo" End If "próximo arquivo arquivo = Dir("c:\arquivos Assinador NFeExpress\Nfe para Assinar\*.*", vbNormal) Loop "reativa o time definindo o intervalo para 2 segundos Timer1.Interval = 2000 End Sub
- Sou programador, o mágico atende na sala ao ladoPHP
- System Tray - O seu ícone ao lado do relógio do WindowsVisual Basic
- Criando Aplicações Limitadas a Uma Única Instância (Single Instance)C#
- Criando um pacote de instalação com o INNO SETUPVisual Basic
- Visual Basic 6 – Simulação de um GCVisual Basic