Ok, já venceu ou está prestes a vencer o prazo para que uma grande parte das empresas
utilizem obrigatoriamente a NFe - Nota Fiscal Eletrônica. Mas, como o brasileiro no geral deixa tudo para a última hora, é bastante provável que este
post seja útil pra muita gente. Aqui eu abordo alguns problemas comuns que aparecem quando se utiliza os Web Services necessários para implementar no Visual Studio a comunicação com o site da Receita Federal no âmbito da NFe. Estou usando Visual Studio 2010 com a versão 3.5 do .NET mas creio que a maioria das soluções apresentadas sejam aplicáveis também a outras versões.
Neste outro post, eu falei sobre como utilizar Web Services em um programa .NET. Usando as dicas contidas naquele
post para adicionar os Web Services da Receita Federal a um projeto do Visual Studio é possível que você se depare com uma mensagem similar a esta:
The request failed with HTTP status 403: Forbidden.
Metadata contains a reference that cannot be resolved: 'endereço-do-web-service'.
The HTTP request was forbidden with client authentication scheme 'Anonymous'.
O servidor da Receita Federal está configurado para exigir a identificação de todos os usuários através de um certificado digital válido. O acesso através do Visual Studio para obter a descrição
WSDL dos serviços não é diferente. O que a mensagem está dizendo é que você não informou um certificado que o autorize a acessar o
site. No caso do Visual Studio, é feita automaticamente a seleção de um certificado digital que tenha sido inserido na área
Personal do Certificate Store do Windows. Por isso, ter instalado tal certificado válido emitido por uma entidade autorizada (
Correios,
Serasa ou
Certisign, por exemplo) é imprescindível já no momento de adicionar os Web Services ao projeto e não apenas para assinar os XMLs que serão enviados à Receita Federal.
Depois que você conseguiu importar os Web Services, você pode usá-los em seu projeto para enviar solicitações de uso de notas fiscais, dentre outros serviços disponíveis. Quando seu programa chama a função de um dos Web Services para enviar ou solicitar informações ao servidor da Receita, este erro é reportado pelo programa:
The HTTP request was forbidden with client authentication scheme 'Anonymous'.
É bastante parecida com a mensagem anterior mas, nesse ponto, você já deve ter instalado um certificado válido no Certificate Store. Então, a causa provável é que você não configurou a forma com que a mensagem
SOAP (o XML de comunicação com o Web Service) será transportada via internet, usando o protocolo HTTPS. Quando você importa um Web Service, o Visual Studio automaticamente insere num arquivo chamado
app.config toda a configuração associada ao serviço, incluindo aquelas relativas ao transporte das mensagens via HTTPS.
Há particularmente dois parâmetros neste arquivo cujos valores padrões diferem do exigido pelo servidor da Receita:
authenticationScheme e
requireClientCertificate. O primeiro indica como o usuário será validado, sendo que o valor padrão é
"Anonymous" para indicar que nenhuma validação é esperada. Como eu disse antes, o servidor da Receita só libera o acesso se um certificado foi informado. Portanto, o valor desse parâmetro deve ser alterado para
"Digest". O segundo parâmetro deve ter valor
"true", confirmando que o servidor exige que sua aplicação envie os dados do certificado para garantir a autenticação. O quadro abaixo traz o trecho de um
app.config como exemplo, mostrando como fica a configuração para o serviço de consulta de uma nota fiscal:
<binding name="NfeConsulta2Soap12">
...
<httpsTransport authenticationScheme="Digest" requireClientCertificate="true" ... />
</binding>
Por uma questão de clareza, foram omitidas outras configurações que aparecem neste mesmo contexto. Lembre-se ainda que as configurações são feitas por Web Service, isto é, cada serviço da Receita que você for suportar tem que ser configurado neste arquivo da mesma forma que foi feito no exemplo.
Após realizar as modificações do
app.config citadas, você ainda pode ser brindado com o erro abaixo:
The client certificate is not provided. Specify a client certificate in ClientCredentials.
Mais uma vez, a culpa é a falta do certificado digital. Nós declaramos que o serviço exige que especifiquemos um certificado. Mas, ao contrário do ambiente do Visual Studio, um Web Service no seu programa não é capaz de detectar automaticamente qual certificado deve ser usado. Por isso, devemos atribuí-lo manualmente antes de fazer a chamada à função do Web Service:
NfeConsulta2Soap12Client lServ;
lServ = new NfeConsulta2Soap12Client ("NfeConsulta2Soap12", _UrlWebservice);
lServ.ClientCredentials.ClientCertificate.Certificate = GetCertificado;
XmlNode status = lServ.nfeConsultaNF2 (ref lCabec, XmlDoc);
O
post neste link mostra como navegar no Certificate Store para encontrar um certificado específico. É o que faz a minha função
GetCertificado, usada no código de exemplo acima. A variável
_UrlWebservice também é minha e contem o endereço (URL) real do Web Service que será acessado.
A arquitetura montada pela Receita Federal permite que você opere num ambiente de homologação (para testes) ou direto no de produção (onde as notas fiscais entram efetivamente na base de dados da Receita). Além disso, cada unidade da Federação disponibiliza seu próprio conjunto de endereços dos Web Services destinados aos contribuintes dessa unidade. É normal, portanto, que os programas para atender a NFe sejam construídos de forma flexível, permitindo receber os diferentes conjuntos possíveis. Obviamente, essa flexibilidade traz consigo o risco de que um endereço errado seja especificado. Se isto ocorrer, a seguinte mensagem será reportada:
Unable to handle request. The action 'http://www.portalfiscal.inf.br/nfe/wsdl/NfeConsulta2/nfeConsultaNF2' was not recognized.
Isso significa apenas que você está tentando chamar uma função que não está implementada no endereço URL que você informou. A solução aqui é simples: verifique o endereço que está sendo passado à instância do Web Service - no exemplo anterior, seria descobrir o conteúdo da variável
_UrlWebservice. Você pode até mesmo gerar um log imediatamente antes de fazer a chamada à função do Web Service, se for o caso.
Uma última recomendação. Se for criar um serviço Windows para monitorar as notas fiscais que entram para submetê-las à Receita, fique atento ao fato de que esse serviço pode ser executado com as credenciais de um usuário diferente daquele que está logado no Windows - normalmente, a conta
Local System.
Neste cenário, o serviço não enxergará certificados digitais instalados na área
Personal do
Store de seu usuário Windows e você poderá receber uma porção das mensagens citadas neste
post. Por isso, é recomendável que o certificado esteja instalado na área
Personal do
Store do
Local Computer pois nessa área ele estará disponível a qualquer usuário do computador. Não se esqueça de restringir o acesso ao login desse computador por questões de segurança.