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 Barbiero



Considerações iniciais

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.

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
Marco Aurélio Barbiero

Marco Aurélio Barbiero