sábado, 3 de janeiro de 2015

Download da Nota Fiscal Eletrônica (NFe)

Download da Nota Fiscal Eletrônica (NFe)

========================================
Atualização em 21/08/2017:

Graças à contribuição dos colegas  Thiago Motta e André Scudeler temos agora uma versão funcional do código para a nova versão do download da NFe, o NFeDistribuicaoDFe. Segundo os amigos os passos são os mesmos, a manifestação é igual, e no passo 3 do tutorial deve ser adicionado o NFeDistribuicaoDFe no lugar do NFeDownloadNF. Utilize para isso a nova url: https://www1.nfe.fazenda.gov.br/NFeDistribuicaoDFe/NFeDistribuicaoDFe.asmx

Segue o novo código do procedimento de download:

private void DownloadXML(object sender, EventArgs e)
{
    //Download da NFe, Para Download da xml por chave é necessario que a versão seja 1.01
    var texto = @"<distDFeInt xmlns=""http://www.portalfiscal.inf.br/nfe"" versao = ""1.01"">
    <tpAmb>1</tpAmb>
    <cUFAutor>35</cUFAutor>
    <CNPJ>CNPJ DA EMPRESA</CNPJ>
    <consChNFe>
        <chNFe>CHAVE NOTA FISCAL</chNFe>
    </consChNFe>
    </distDFeInt>";

    var xml = ConverterStringToXml(texto);
    BaixarXml(xml);
}

private void BaixarXml(XmlDocument xml)
{
    var NFe_Sc = new Distribuicao.NFeDistribuicaoDFeSoapClient();
    NFe_Sc.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySerialNumber, "NÚMERO SERIAL DO SEU CERTIFICADO");

    XElement x = XElement.Parse(xml.InnerXml);

    var arquivo = NFe_Sc.nfeDistDFeInteresse(x).ToString();

    var xmlNota = ConverterStringToXml(arquivo);
    var conteuZip = xmlNota.GetElementsByTagName("docZip")[0].InnerText;

    byte[] dados = Convert.FromBase64String(conteuZip);
    //TODO: fazer uso dos dados da variável retorno
    var xmlRetorno = descompactar(dados);
}

private XmlDocument ConverterStringToXml(string texto)
{
    var xml = new XmlDocument();
    xml.LoadXml(texto);
    return xml;
}

public string descompactar(byte[] conteudo)
{
    using (var memory = new MemoryStream(conteudo))
    using (var compression = new GZipStream(memory, CompressionMode.Decompress))
    using (var reader = new StreamReader(compression))
    {
        return reader.ReadToEnd();
    }
}

Amigos, muito obrigado! Compartilhar é agradável e muito comum no estrangeiro. Nós brasileiros devemos nos unir a esta causa!

========================================

(adaptação de A Saga do Download da Nota Fiscal Eletrônica (NFe), previamente publicado neste blog, mas já retirado)

Pré requisitos da receita para fazer o download da NFe via Web Service:

1- Certificado digital: Se sua empresa não tem esse certificado, é preciso adquirir com uma das entidades certificadoras, e deve estar válido. (Sobre como instalar o certificado, inclusive para rodar no IIS, veja o meu outro post em:
http://pmarco777.blogspot.com.br/2015/01/download-da-nota-fiscal-eletronica-nfe_10.html)

2- Até 30 dias da emissão: Se a nota foi emitida há mais de 30 dias só será possível o download "manual", nota por nota, digitando o captcha, no site: http://www.nfe.fazenda.gov.br/portal/consulta.aspx?tipoConsulta=completa&tipoConteudo=XbSeqxE8pl8=

3- Registrar um evento de "ciência da operação": É preciso se "manifestar" em relação a nota para depois poder baixá-la. Exigência da receita.

O manual da receita é a Nota Técnica 2012.002 que pode ser baixada em:
http://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=tW+YMyk/50s=

Este tutorial utiliza .NET C# 4.0, projeto windows form com 1 form e 2 botões. 1 botão "manifesta" e o outro faz o download.

1- Abra o Visual Studio e crie um novo projeto através do menu file/new project:


e coloque dois botões no form:



2- Adicione a referência a dll System.Security.dll, do .NET. Ela permitirá o acesso ao Namespace System.Security.Cryptography.Xml, necessário para assinar digitalmente o xml de manifestação. Para isso clique com o botão direito do mouse em referências do projeto, add reference:


Selecione a dll e adicione ao projeto.

3- Agora adicione a referência aos 2 web services da receita:
Namespace NfeRecepcao: https://www.nfe.fazenda.gov.br/RecepcaoEvento/RecepcaoEvento.asmx
Namespace NfeDownloadhttps://www.nfe.fazenda.gov.br/NfeDownloadNF/NfeDownloadNF.asmx

também usando o botão direito do mouse em references, só que o item é "add service reference".
Coloque a url do web service e clique no botão Go. Se neste momento vc não tiver o certificado instalado na sua máquina de desenvolvimento, não vai conseguir avançar, conforme foi avisado no início do artigo:


Coloque os namespaces corretos e adicione as referências com o botão ok.

4- No app.config (quando utilizar um projeto web será web.config) mude as linhas:
<security mode="Transport">
    <transport clientCredentialType="None" proxyCredentialType="None"
Para:
<security mode="Transport">
    <transport clientCredentialType="Certificate" proxyCredentialType="None"

5- Segue agora o código do form1.cs que deverá ser adaptado as suas necessidades, lembrando que o código do botão 1 faz a manifestação e o código do botão 2 faz o download. Onde se lê:

"Ponha o CNPJ da sua empresa"
"Ponha a chave de 44 dígitos da NFe recebida pela sua empresa"
"Nome do certificado da sua empresa"

Deve ser alterado para os valores corretos.

using System;
using System.Net;
using System.IO;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;
using System.Xml;
using System.Text;
using System.Windows.Forms;
using Recepcao = WindowsFormsApplication1.NfeRecepcao;
using Download = WindowsFormsApplication1.NfeDownload;

namespace WindowsFormsApplication1
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}

private void button1_Click(object sender, EventArgs e)
{
//
//Ciencia da Operacao
//
var NFe_Rec = new Recepcao.RecepcaoEventoSoapClient();
NFe_Rec.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "Nome do certificado da sua empresa");

var notas = new string[] {
"Ponha a chave de 44 dígitos da NFe recebida pela sua empresa"
,"Ponha a chave de 44 dígitos da NFe recebida pela sua empresa"
}; // este array não deve passar de 20 elementos, máximo permitido por lote de manifestação

var sbXml = new StringBuilder();
sbXml.Append(@"<?xml version=""1.0"" encoding=""UTF-8""?>
<envEvento xmlns=""http://www.portalfiscal.inf.br/nfe"" versao=""1.00"">
<idLote>1</idLote>
");
foreach (var nota in notas)
{
sbXml.Append(@"
<evento xmlns=""http://www.portalfiscal.inf.br/nfe"" versao=""1.00"">
<infEvento Id=""ID210210" + nota + @"01"">
<cOrgao>91</cOrgao>
<tpAmb>1</tpAmb>
<CNPJ>Ponha o CNPJ da sua empresa</CNPJ>
<chNFe>" + nota + @"</chNFe>
<dhEvento>" + DateTime.Now.AddDays(-1).ToString("yyyy-MM-ddTHH:mm:ss") + @"-03:00</dhEvento>
<tpEvento>210210</tpEvento>
<nSeqEvento>1</nSeqEvento>
<verEvento>1.00</verEvento>
<detEvento versao=""1.00"">
<descEvento>Ciencia da Operacao</descEvento>
</detEvento>
</infEvento>
</evento>
");
}
sbXml.Append("</envEvento>");

var xml = new XmlDocument();
xml.LoadXml(sbXml.ToString());

var i = 0;
foreach (var nota in notas)
{
var docXML = new SignedXml(xml);
docXML.SigningKey = NFe_Rec.ClientCredentials.ClientCertificate.Certificate.PrivateKey;
var refer = new Reference();
refer.Uri = "#ID210210" + nota + "01";
refer.AddTransform(new XmlDsigEnvelopedSignatureTransform());
refer.AddTransform(new XmlDsigC14NTransform());
docXML.AddReference(refer);

var ki = new KeyInfo();
ki.AddClause(new KeyInfoX509Data(NFe_Rec.ClientCredentials.ClientCertificate.Certificate));
docXML.KeyInfo = ki;

docXML.ComputeSignature();
i++;
xml.ChildNodes[1].ChildNodes[i].AppendChild(xml.ImportNode(docXML.GetXml(), true));
}

var NFe_Cab = new Recepcao.nfeCabecMsg();
NFe_Cab.cUF = "33"; //RJ => De acordo com a Tabela de Código de UF do IBGE
NFe_Cab.versaoDados = "1.00";
var resp = NFe_Rec.nfeRecepcaoEvento(NFe_Cab, xml);

var fileResp = "c:\\" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + "-tempResp.xml";
var fileReq = "c:\\" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + "-tempRequ.xml";
File.WriteAllText(fileReq, xml.OuterXml);
File.WriteAllText(fileResp, resp.OuterXml);
System.Diagnostics.Process.Start(fileReq);
System.Diagnostics.Process.Start(fileResp);
}

private void button2_Click(object sender, EventArgs e)
{
//
//Download da NFe
//
var notas = new string[] {
"Ponha a chave de 44 dígitos da NFe recebida pela sua empresa"
,"Ponha a chave de 44 dígitos da NFe recebida pela sua empresa"
}; // este array não deve passar de 10 elementos, máximo permitido por lote de download da NFe

var sbXml = new StringBuilder();
sbXml.Append(@"<?xml version=""1.0"" encoding=""UTF-8""?>
<downloadNFe xmlns=""http://www.portalfiscal.inf.br/nfe"" versao=""1.00"">
<tpAmb>1</tpAmb>
<xServ>DOWNLOAD NFE</xServ>
<CNPJ>Ponha o CNPJ da sua empresa</CNPJ>
");

foreach (var nota in notas)
{
sbXml.Append("<chNFe>" + nota +"</chNFe>");
}
sbXml.Append("</downloadNFe>");

var xml = new XmlDocument();
xml.LoadXml(sbXml.ToString());

var NFe_Cab = new NfeDownload.nfeCabecMsg();
NFe_Cab.cUF = "33"; //RJ => De acordo com a Tabela de Código de UF do IBGE
NFe_Cab.versaoDados = "1.00";

var NFe_Sc = new NfeDownload.NfeDownloadNFSoapClient();
NFe_Sc.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "Nome do certificado da sua empresa");
var resp = NFe_Sc.nfeDownloadNF(NFe_Cab, xml);

var fileResp = "c:\\" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + "-tempResp.xml";
var fileReq = "c:\\" + DateTime.Now.ToString("yyyy-MM-dd HH-mm-ss") + "-tempRequ.xml";
File.WriteAllText(fileReq, xml.OuterXml);
File.WriteAllText(fileResp, resp.OuterXml);
System.Diagnostics.Process.Start(fileReq);
System.Diagnostics.Process.Start(fileResp);
}
}
}

103 comentários:

  1. Bom dia Marco, essa classe baixa apenas as NFes que estão ligadas ao certificado informado?

    ResponderExcluir
    Respostas
    1. Sim, o certificado está vinculado a uma empresa e só as notas dessa empresa podem ser baixadas.

      Excluir
  2. Boa tarde Marcos, vc tem alguma solução para download de NFe com emissão maior que 30 dias?

    ResponderExcluir
    Respostas
    1. Nesse caso o jeito é baixar no site da fazenda:
      http://www.nfe.fazenda.gov.br/portal/consulta.aspx?tipoConsulta=completa&tipoConteudo=XbSeqxE8pl8=

      Uma solução paliativa é adotada pelo Nasajon. Ele comunica com o site da fazenda e pede o captcha p/ o usuário. Eu não construí uma solução semelhante mais a ideia é interessante. O processo é automatizado de forma parcial: o usuário apenas digita o captcha, sem precisar entrar no site da fazenda, baixar manualmente e depois fazer o upload manualmente para dentro do sistema.

      Se você precisa baixar 1 nota atrasada com certa frequencia, pode tentar imitar a ideia do Nasajon, mas se precisa baixar centenas de notas antigas, vai precisar de um captcha para cada nota. Se é raro chegar uma nota com tanto atraso na sua empresa (meu caso), usa o próprio browser e deixa o usuário ter um trabalho que será bem menor do que programar uma solução como a do Nasajon.

      Abraço,
      Marquinho

      Excluir
  3. Amigo no meu caso tenho 4 certificados A1 , tem como eu deixar a escolha do certificado dinâmico , o usuário vai escolher de qual certificado vai baixar o xml e depois vai digitar a chave da nfe ?

    ResponderExcluir
    Respostas
    1. Sim, no caso este trecho do código:

      var NFe_Rec = new Recepcao.RecepcaoEventoSoapClient();
      NFe_Rec.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, "Nome do certificado da sua empresa");

      Deve ser alterado para que a string "Nome do certificado da sua empresa" corresponda ao certificado desejado.

      Excluir
  4. Olá,
    Por favor passe um Skype, WhatsApp ou email para contato?

    ResponderExcluir
  5. Boa tarde Marquinhos, preciso implementar numa aplicação a consulta de NFe's por CNPJ de várias empresas cadastradas, tem alguma ideia de como posso fazer isso?

    ResponderExcluir
    Respostas
    1. Só é possível o download automatizado da NF-e pelo web service da sefaz dentro de 1 mês da emissão da nota. Se o que você precisa é de uma consulta aleatória, automatizar não é possível, mas é possível o acesso não automatizado pelo site: http://www.nfe.fazenda.gov.br/portal/principal.aspx

      Espero ter ajudado,
      Marquinho Peli

      Excluir
  6. Muito interessante! sabe se funciona usando o ambiente de homologação ("https://hom.nfe.fazenda.gov.br/NfeDownloadNF/NfeDownloadNF.asmx
    ") ? A string do certificado consome também modelos A3? Pode me enviar no e-mail este projeto? desde já muito obrigado e parabéns pela iniciativa

    ResponderExcluir
    Respostas
    1. Angué, não testei no ambiente de homologação, porque tinha apenas que fazer o download, uma operação sem efeito colateral, e seria totalmente diferente se tivesse que gerar uma NFe. Também não testei o modelo A3 (mas creio que funcione da mesma forma) e já não tenho o projeto, mas o código está aqui no blog. Desculpe não estar ajudando em nada com a resposta, mas melhor responder com sinceridade do que com o silêncio, né?

      Abraço e te cuida,
      Marquinho Peli

      Excluir
  7. Sem dúvidas agradeço sua atenção, sem problemas por não ter mais o projeto, mas já me passou um grande caminho... hoje em dia faço o XML da nfe e emito a mesma pelo framework UniNFe, mas preciso ampliar meu retaguarda (coisa básica, mas me ajuda muito na empresa)... realmente não ha efeito colateral, sei que quando emite para o modo de homologação, la o CNPJ é alterado para 99999999 por exemplo, contudo não se faz o cancelamento da mesma no ambiente de homologação por conta disso... acredito que não tem como também usar o download mas irei implementar amanha com calma pois hoje já to cansado de códigos rsrs.. mais uma vez muito obrigado.. sucesso! abraço

    ResponderExcluir
  8. Bom dia, consegui consumir os dois serviços
    mas usei a busca do certificado pelo número serial que no caso a maioria dos sistemas usam por ser mais fácil e único caso o cliente tenha dois certificado no repositório do windows (um vencido e um mais novo)

    ...ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySerialNumber, "Coloque o Número de Série sem espaços aqui");

    Mais uma vez obrigado.

    ResponderExcluir
    Respostas
    1. Gostaria de acrescentar que neste caso toda vez que for atualizar o certificado (a cada ano ou 3 anos), vai precisar recompilar a aplicação, e que a busca pelo nome, uma vez que desinstale o antigo e instale o novo, é uma solução que dispensa a recompilação ou a alteração de um arquivo config.

      Excluir
    2. Verdade, não tinha pensado dessa maneira... obrigado pelo conselho, sem dúvidas é muito bem aceito!

      Excluir
  9. Ola Marcos ótimo este exemplo,
    queria saber como baixar as notas de um determinado período pelo cnpj da empresa eo estado.vc sabe?

    ResponderExcluir
    Respostas
    1. Heitor, essa dúvida é comum e por isso eu escrevi no início do post que só é possível o download da NFe:

      2- Até 30 dias da emissão: Se a nota foi emitida há mais de 30 dias só será possível o download "manual", nota por nota, digitando o captcha, no site: http://www.nfe.fazenda.gov.br/portal/consulta.aspx?tipoConsulta=completa&tipoConteudo=XbSeqxE8pl8=

      Excluir
    2. Marquinho tipo este programa
      http://www.espiaonfe.com.br/realizacompra.aspx

      Excluir
    3. Amigo, não sei se eu confiaria num programa chamado "Espião" para um assunto tão sério e formal que é a nota fiscal eletrônica. O mundo está cheio de golpistas. Leia a documentação OFICIAL, provida pela SEFAZ. Não acredite na informação sem ter uma forma de confirmá-la.

      Abraço.

      Excluir
  10. Olá Marcos, obrigado pelo exemplo.
    É possível baixar todas as notas dentro deste período de 30 dias sem eu ter que informar chave de acesso, somente o CNPJ de destino?
    Obrigado!

    ResponderExcluir
    Respostas
    1. Não amigo, a Sefaz realmente se preocupou em não permitir a sobrecarga de seus servidores, e um método como esse, baixando todas as notas de uma empresa, ainda que só dos últimos 30 dias, poderia ser executado no brasil todo por todas as empresas, e imagine... Realmente é necessário informar a chave específica da nota. Mas você pode confirmar por si mesmo no manual da sefaz, que indiquei no início do post:

      O manual da receita é a Nota Técnica 2012.002 que pode ser baixada em:
      http://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=tW+YMyk/50s=

      Excluir
  11. Não consegui nem adicionar a referencia aparece um erro:
    Tenho certificado A1 e A3.

    Se alguém souber, fico agradecido.

    Erro ao baixar 'https://www.nfe.fazenda.gov.br/RecepcaoEvento/RecepcaoEvento.asmx'.
    A solicitação foi anulada: Não foi possível criar um canal seguro para SSL/TLS.
    O metadados contém uma referência que não pode ser resolvida: 'https://www.nfe.fazenda.gov.br/RecepcaoEvento/RecepcaoEvento.asmx'.
    A solicitação HTTP está proibida com o esquema de autenticação de cliente 'Anonymous'.
    O servidor remoto retornou um erro: (403) Proibido.
    If the service is defined in the current solution, try building the solution and adding the service reference again.

    ResponderExcluir
    Respostas
    1. Me parece que faltou seguir o passo 4 deste post. De qualquer modo este post já tem mais de 1 ano e pode ser que precise ser atualizado. Tem certeza que o passo 4 foi feito corretamente?

      Excluir
    2. talvez tenha mudado mesmo,
      mas o passo 4 não fiz ainda, pois o erro deu no passo 3

      e outra, o passo 4 é só para aplicação web diz ali

      Excluir
    3. Já passei por isso. O passo 3 falha quando o pré-requisito 1 não foi satisfeito. É preciso ter o certificado corretamente instalado na máquina.

      Excluir
    4. O passo 4 é feito tanto na aplicação windows quanto web. Programar é uma tarefa difícil que exige a leitura de vários livros e manuais, e muitas vezes em outros idiomas. Leia com atenção e acompanhe as instruções pacientemente, é o único jeito. Ou mude de profissão! rss.

      Excluir
    5. agora deu certo.. removi todos os certificado e deixei só 1...
      paciência sempre ajuda nessas horas...

      obrigado.

      Excluir
  12. Bom dia,

    Quando eu tento adicionar a referência dos wev services ao meu projeto, está retornando o seguinte erro:

    There was an error downloading 'https://www.nfe.fazenda.gov.br/RecepcaoEvento/RecepcaoEvento.asmx?op=nfeRecepcaoEvento/_vti_bin/ListData.svc/$metadata'.
    The request failed with HTTP status 403: Forbidden.

    Pode me ajudar?

    ResponderExcluir
    Respostas
    1. Esse erro costuma ser de problema com o certificado. O primeiro passo é tentar baixar uma nota fiscal direto na sefaz. Se não tiver o certificado instalado corretamente não rola. Se consegue baixar do site deles, então é possível tb criar a conexão com o webservice deles

      Excluir
    2. Consegui. Tive que apagar todos os certificados e deixar só o que eu queria. Muito obrigado

      Excluir
  13. Marquinho,

    Eu preciso fazer o download do XML para meu cliente, porém ele não é o destinatário da NF-e, ele é o transportador.
    Você sabe se é possível fazer o download nesta situação?

    ResponderExcluir
    Respostas
    1. O download é possível para o emissor e para o destinatário. Mas o emissor via de regra é o gerador da nota. Se ele gerou a NFe, teoricamente não precisaria baixar, pois foi ele quem a enviou à Sefaz.

      Excluir
    2. Entendi. No caso o meu cliente é o transportador, o CNPJ dele é mencionado no XML, mas ele não é o destinatário e nem o emissor. Sabe se existe uma maneira de fazer o download neste caso?

      Excluir
    3. Novas informações surgiram desde a sua pergunta, creio que (graças à colaboração de Jonatan), a nota técnica 2014/002 http://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=tW+YMyk/50s= pode te ajudar.

      Excluir
  14. Oi Marco... Vc pode me ajudar?

    Ao executar, o debug pára na seguinte linha:
    Download.NfeDownloadNFSoapClient NFe_Sc = new Download.NfeDownloadNFSoapClient();

    A mensagem de erro é:

    ========================================
    An unhandled exception of type 'System.InvalidOperationException' occurred in System.ServiceModel.dll

    Additional information: Não foi possível localizar o elemento de ponto de extremidade padrão que referencia o contrato 'NfeDownload.NfeDownloadNFSoap' na seção de configuração do ServiceModel cliente. Isso pode ter ocorrido devido à falta de um arquivo de configuração para o seu aplicativo ou porque nenhum elemento de ponto de extremidade correspondendo a este contrato pôde ser encontrado no elemento cliente.
    ========================================

    Já verifiquei os passos várias vezes e não achei o erro. Pode me ajudar?

    ResponderExcluir
    Respostas
    1. Tem skype? Podemos fazer uma chamada rápida, meu skype: marco.pellicciotta.osf

      Excluir
    2. O problema do Pablo era o fato de usar este projeto como uma dll, e ai os dados do app.config que valem são os que estiverem no projeto da interface (windows ou web).
      Boa sorte a todos.

      Excluir
  15. É possível inserir mais 1 argumento na seleção do certificado? Por exemplo data de expiração? pois o certificado vale pra 1 ano, será sempre o mesmo nome e se tiver 2 certificado com o mesmo nome da erro,se tivesse mais uma condição dava pra fazer,pois sao muitos usuarios que usariam e entrar 1 por 1 e desabilitar o certificado antigo é mais dificil.

    ResponderExcluir
    Respostas
    1. É possível selecionar o certificado pelo número serial:
      ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySerialNumber, "Coloque o Número de Série sem espaços aqui");
      Nesse caso coloque o serial num arquivo config. Quando instalar o certificado novo, altere para o serial novo.

      Excluir
  16. ola Marcos,esta empresa oferece um serviço que não encontramos no sefaz http://www.keeptrue.com/ProdutosServicos/GerenciamentoNFe

    com sua experiencia como ela faz?

    ResponderExcluir
    Respostas
    1. Heitor, dei uma olhada no link, vi vários serviços, mas não sei exatamente qual deles você se refere. Poderia ser um pouco mais específico?

      Excluir
    2. eles oferecem um serviço de salvar todas as notas fiscais na nuvem ,mas como eles conseguem pegar pelo sefaz somente pelo cnpj, ainda não vi uma web service que faz isso,vc tem noção ?

      Obrigado,

      Excluir
    3. Heitor,

      Tentei acessar o mesmo linke que você me postou ontem:
      http://www.keeptrue.com/ProdutosServicos/GerenciamentoNFe
      E hoje ele já não existe mais, apenas um redirecionamento.
      Há também um tal de espião nfe:
      http://www.espiaonfe.com.br/
      Mas eu não confio em nada disso. Programas oficiais como o Nasajon não conseguem baixar a NFe sem certificado, e a documentação da Sefaz é clara.

      Será que pode existir uma "porta dos fundos" para que certas empresas tenham acesso privilegiado aos dados da Sefaz e assim oferecer serviços que nenhuma outra tenha? Sim, é possível, mas não sou eu o cara que vai estar por dentro desse tipo de informação...

      Abraço ai,
      Marquinho

      Excluir
    4. Heitor,

      Dê uma olhada na Nota Técnica 2014/002, mas de qualquer forma não é só pelo CNPJ, sempre precisa ter o certificado da empresa.

      Abraços!

      Excluir
  17. Senhores, o Alexandre Hogler, da MHTEC (www.mhtec.com.br) perguntou:

    Gostaria de saber se existe a possibilidade do sistema avisar a empresa, quando uma NF-e for emitida contra ela, já baixando o XML. Sem precisar o usuário ficar consultando no site a todo momento.

    Conforme a colaboração de Jonatan acima, a nota técnica 2014/002 http://www.nfe.fazenda.gov.br/portal/listaConteudo.aspx?tipoConteudo=tW+YMyk/50s=
    Mostra como acessar as notas referentes à empresa, ao destinatário e ao transportador (amplo escopo de acesso a notas), no período de até 3 meses da emissão.

    ResponderExcluir
    Respostas
    1. Seguindo a NT 2014/002 eu consegui fazer a solicitação, porém não consigo ler o retorno enviado pela Sefaz. Segundo eu entendi este retorno ira conter até 50 chaves de NFs e, a partir deste ponto é que poderiamos em outra requisição fazer o download. Ou seja, só teriamos acessos as chaves.

      Excluir
    2. Wesley, li que o formato de retorno da NFe no webservice NFeDistribuicaoDFe é zip, para economia de espaço. Talvez por isso a dificuldade em ler o conteúdo.

      Excluir
    3. Wesley, tente o novo código fornecido pelos amigos Thiago Motta e André Scudeler no início do post.

      Excluir
  18. Boar tarde,

    Estava lendo a Nota Técnica 2014.002 - v1.02 e vi que o evento NfeDownloadNF e o evento NfeConsultaDest serão descontinuados e substituídos pelo evento NFeDistribuicaoDFe.

    É isso mesmo ou eu entendi errado?

    http://www.nfe.fazenda.gov.br/portal/exibirArquivo.aspx?conteudo=VcEhGZODuo4=

    ResponderExcluir
    Respostas
    1. Hamatulla observou bem, os dias de validade deste post estão contados! A data de desativação dos Web Service NFeDownloadNF é 02/05/2017. Até é possível utilizar o serviço, mas logo NFeDownloadNF será passado. O novo webservice NFeDistribuicaoDFe irá englobar o download da NF-e num formato zip para economia de espaço. Pessoal, estou sem trabalhar com a NFe já a algum tempo, e por isso não sei como será o acesso por esse novo serviço. Este post ficará sendo um guia apenas para a parte de certificado...

      Excluir
    2. Marquinho, é serio que não vai funcionar mais? Demorei tanto pra achar um codigo que desse certo e agora nao vai dar mais? hehe, me dei mal. Você tem ao menos uma base de algum codigo ai com o NFeDistribuicao ? Pelo manual que a Sefaz disponibiliza nao da pra entender nada(pelo menos eu nao entendi)

      Excluir
    3. Realmente não tenho, seria uma boa, mas não tenho trabalhando com NFe há algum tempo e codificar os acessos aos web services não é tarefa fácil. Se fosse fácil qq um seria programador né? Eu adoro pegar o código prontinho, copiar e colar, e por isso quando posso proporciono essa facilidade aos colegas tb. Se souber de alguma novidade deixa um link aqui nos comentários. Abraço ai!

      Excluir
  19. Bom dia e parabéns pelo blog, eu posso utilizar este código para teste? ou seja para homologação?

    ResponderExcluir
    Respostas
    1. Fica à vontade. Mas saiba que breve esse serviço (NFeDownloadNF) será descontinuado, e vc precisará implementar o NFeDistribuicaoDFe, de acordo com a Nota Técnica 2014.002.

      Excluir
  20. Bom dia Marco. Você chegou a implementar ou conhece alguma implementação, também em C#, utilizando o novo webservice NFeDistribuicaoDFe??? Quero implementar essa função na minha aplicação.

    ResponderExcluir
  21. Bom dia pessoal ,como esse post me ajudou a alguns anos atras volto aqui pra dar mais um folego pra ele, perdi uma bela tarde de sol realizando estas alterações para o novo webservice ,obviamente este é apenas um complemento do codigo acima so precisa fazer uns pequenos ajustes vou postar os ajustes , pois agora o retorno da nfe vem em base64 e zipado : segue exemplos :

    var NFe_Sc = new NfeDownload.NFeDistribuicaoDFeSoapClient();
    NFe_Sc.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, certificado);

    XElement x = XElement.Parse(xml.InnerXml);

    var arquivo = NFe_Sc.nfeDistDFeInteresse(x).ToString();

    int inicio = arquivo.IndexOf("v3.10.xsd") + 11;
    int fim = arquivo.IndexOf("") - 1;
    arquivo = arquivo.Substring(inicio , fim - inicio);

    byte[] dados = Convert.FromBase64String(arquivo);
    var xmlRetorno = descompactar(dados);

    OK , AGORA VOU POSTAR O METODO descompactar.


    public string descompactar(byte[] conteudo)
    {
    GZipStream compressionStream = new GZipStream(new MemoryStream(conteudo), CompressionMode.Decompress);
    StreamReader reader = new StreamReader(compressionStream);
    string xml = "";
    foreach (var line in reader.ReadLine())
    {
    xml += line.ToString();
    }
    return xml;
    }

    BOA SORTE A TODOS E ATÉ MAIS !

    ResponderExcluir
    Respostas
    1. Reginaldo, baseado no seu exemplo, ainda que incompleto, os amigos Thiago Motta e André Scudeler conseguiram uma implementação funcional que está no início do post.
      Muito obrigado!

      Excluir
    2. Que bom , espero ter ajudado a todos !

      Excluir
    3. Olá amigos. boa noite!
      Parabéns pelo post. muito bom.
      Obrigado por compartilhar informações importantes.
      gostaria de saber como pegar o nome do certificado selecionado pelo usuário e jogar na variavel "nome do certificado" sou iniciante em c#.

      var NFe_Sc = new NfeDownload.NFeDistribuicaoDFeSoapClient();
      NFe_Sc.ClientCredentials.ClientCertificate.SetCertificate(StoreLocation.CurrentUser, StoreName.My, X509FindType.FindBySubjectName, certificado);

      Nesta parte do código.
      Abraço a todos.

      Excluir
    4. deu erro no passo "conteuZip = xmlNota.GetElementsByTagName("docZip")(0).InnerText"
      Erro:Additional information: Referência de objeto não definida para uma instância de um objeto.
      Percebi que a mensagem da variavel "arquivo" é uma resposta da sefaz , esta "Status137: Nenhum documento localizado".
      Porém existe o XML pois eu consigo baixar normalmente no site da receita. (mesmo erro para outros XMLS)
      A parte da ciencia da operação esta funcionando normalmente.
      Agradeço desde ja pela ajuda, desenvolvo em VB.NET que é muito semelhante ao C# - se alguem puder

      Excluir
    5. Pessoal, consegui resolver este problema. Aparece "Nenhum documento Localizado" pois meu certificado é raiz, contendo varias filiais. Na hora de pesquisar estava colocando o CNPJ do certificado e nao da filial(destinatário) , por isso o erro.

      Excluir
  22. Olá
    estou com esse erro :

    An unhandled exception of type 'System.ServiceModel.Security.MessageSecurityException' occurred in mscorlib.dll

    Additional information: A solicitação HTTP está proibida com o esquema de autenticação de cliente 'Anonymous'.

    pode me ajudar ?

    ResponderExcluir
    Respostas
    1. É a mesma pergunta do Bispo, logo acima. Dá uma olhada: "BISPO ss3 de junho de 2016 06:53"

      Excluir
  23. Olá, tendo essa nota fiscal prévia em mãos, como consigo pegar a xml completa da SEFAZ sem passar por aquela tela do captcha?

    ResponderExcluir
    Respostas
    1. Implementando o serviço, como descrito aqui no blog.

      Excluir
    2. No manual da SEFAZ diz que eu preciso gerar um evento de manifestação do tipo ciência da operação pra obter a nota completa, em que trecho do código ele realiza essa operação?

      Excluir
    3. No trecho com o comentário:
      //Ciencia da Operacao

      Leia o blog primeiro com calma Gabriel, esgote seus próprios recursos, depois pergunte se ficar alguma dúvida. Se for impaciente não poderá ser programador...

      Excluir
    4. Já localizei aqui, desculpe é que foi uma demanda urgente e com muita pressão e eu tinha zero conhecimento sobre NFE. Só uma duvida, quando for montar o cabeçalho do evento de recepção, a UF pode ser utilizada a 91 (AN) ou deve ser a UF do destinatário da Nota? pois minha empresa é multi estado e o sistema é integrado , ou seja, terei notas emitidas para a Bahia, para o paraná e afins...

      No mais obrigado seu blog foi muito útil para mim

      Excluir
  24. Aproveitando este código, alguem tem algum exemplo do schema para solicitar a SEFAZ todas as notas emitidas contra meu CNPJ, e nap só pela chave de acesso mas sim todas?

    ResponderExcluir
    Respostas
    1. Wesley, você conseguiu? também preciso fazer a consulta por CNPJ

      Excluir
  25. você teria esse modelo para download ?

    ResponderExcluir
  26. Você tem o código do projeto para download?

    ResponderExcluir
  27. Olá, estou tentando utilizar o seu exemplo em uma aplicação web, e na linha "var resp = NFe_Rec.nfeRecepcaoEvento(NFe_Cab, xml);" está ocorrendo o seguinte erro:
    "Additional information: A solicitação HTTP está proibida com o esquema de autenticação de cliente 'Anonymous'." Vi outra resposta sua de outro membro que aconteceu o mesmo erro e você falou que o problema estaria no passo 4. Com relação a este passo, estou com dúvida, porque no seu exemplo foi para uma app windows e fiz um ajuste no meu web.config, tentando seguir o seu exemplo e ficou da seguinte forma:






























    ResponderExcluir
    Respostas
    1. Não consigo ver o código do teu web.config, talvez vc queira me mandar por email, mas eu recomendo que você cheque meu outro post sobre a comunicação via aplicação web: https://pmarco777.blogspot.com.br/2015/01/download-da-nota-fiscal-eletronica-nfe_10.html

      Excluir
  28. There was an error downloading 'https://www.nfe.fazenda.gov.br/RecepcaoEvento/RecepcaoEvento.asmx/$metadata'.
    The request failed with HTTP status 403: Forbidden.

    ResponderExcluir
  29. There was an error downloading 'https://www.nfe.fazenda.gov.br/RecepcaoEvento/RecepcaoEvento.asmx/$metadata'.
    The request failed with HTTP status 403: Forbidden.
    Metadata contains a reference that cannot be resolved: 'https://www.nfe.fazenda.gov.br/RecepcaoEvento/RecepcaoEvento.asmx'.
    The HTTP request was forbidden with client authentication scheme 'Anonymous'.
    The remote server returned an error: (403) Forbidden.
    If the service is defined in the current solution, try building the solution and adding the service reference again.

    ResponderExcluir
  30. Oi Marcos, estive lendo a pouco sobre métodos de fazer consultar por CNPJ e não por chave de nota, será que você já possui algum exemplo?

    ResponderExcluir
  31. Olá pessoal tudo bem ? Alguém conseguiu adaptar para a versão 4.0 ?

    ResponderExcluir
  32. ola Boa noite para mim só funcionou o botão 1 , o botão 2 esta dando muito erro...
    alguem tem o projeto ou o codigo para compartilhar ?

    ResponderExcluir
    Respostas
    1. não exite mas a variavel nfeCabecMsg da classe NFeDistribuicaoDFe

      Excluir
  33. consegui baixar as notas pelo webservice ... porem algumas notas vem um xml resumido apenda o nome da empresas e o valor da nota ... e não vem os produtos ... e outras vem completas saberia me responder o por que?

    ResponderExcluir
  34. consegui baixar as notas pelo webservice ... porem algumas notas vem um xml resumido apenda o nome da empresas e o valor da nota ... e não vem os produtos ... e outras vem completas saberia me responder o por que?

    ResponderExcluir
    Respostas
    1. Isso ocorre porque nao manifestou as notas, somente as notas que foram tomada ciência da operação que estarao disponíveis para download.

      Excluir
  35. Consegui adapatar para versao 4.0 e ja ja consigo listar os xmls pelo nsu, trazer as notas resumidas, manifesta-las e efetuar o download dos xmls completos.
    Porem, se deixar em loop por muito tempo, comeco a receber rejeição da sefaz, coloquei algumas pausas no codigo afim de minimizar esses bloqueios de consumo, porem ainda ocorrem, alguem sabe me dizer o intervalo correto de tempo entre as solicitações?

    ResponderExcluir
    Respostas
    1. Jeferoz, poderia dar uma dica de como fez isso, pois aqui quando tento fazer pelo CNPJ, me retorna um erro.

      Excluir
  36. Boa noite a todos, parabéns pelos posts acima, muito instrutivos para quem esta iniciando agora, assim como eu, gostara de sabe se alguem tem um projeto que possa me enviar por email para que inicie meus testes com a consulta das NFE, grato gláucio. email: glau.mend@gmail.com

    ResponderExcluir
  37. Consigo consultar um danfe pelo código da chave utilizando esse exemplo?

    ResponderExcluir
  38. Ola amigos, quando finalizo a operação nfeDistDFeInteresse, para onde o arquivo zip ou xml vai?

    ResponderExcluir
  39. Bom dia Amigos.

    Primeiramente parabéns pelo post, muito didático e objetivo.

    Estou tentando adicionar a referência para download da nota e está apresentando o seguinte erro. Poderiam me ajudar, sou iniciante em C#.

    Description: An error occurred during the processing of a configuration file required to service this request. Please review the specific error details below and modify your configuration file appropriately.

    Parser Error Message: It is an error to use a section registered as allowDefinition='MachineToApplication' beyond application level. This error can be caused by a virtual directory not being configured as an application in IIS.

    Source Error:

    An application error occurred on the server. The current custom error settings for this application prevent the details of the application error from being viewed remotely (for security reasons). It could, however, be viewed by browsers running on the local server machine.

    Source File: D:\sitios\p_34719_spednfe\iis_web\8\nfedownloadnf\web.config Line: 37

    ResponderExcluir
  40. Este comentário foi removido pelo autor.

    ResponderExcluir
  41. Pessoal estou com problema para adicionar a preferência. Por favor vejam minha postagem no último comentário do link abaixo:

    https://pt.stackoverflow.com/questions/322924/sefaz-nfedistribuicaodfe-c-console-application

    ResponderExcluir
  42. alguem conseguiu adptar para a versão recepção 4.0?

    ResponderExcluir