Emitindo NFe via ASP.NET

You are currently viewing Emitindo NFe via ASP.NET

Tutorial completo de integração do Focus NFe com a linguagem ASP.NET.

Nosso cliente Felipe Freitas além de integrar o seu sistema com o nosso em poucas horas, ainda reservou um tempinho para escrever um tutorial completo de como integrar um sistema escrito em ASP.NET com o Focus NFe. Muito obrigado Felipe pela sua contribuição! Segue o texto do Felipe:

Para emitirmos uma NFe usando ASP.NET MVC com C#, precisaremos de uma biblioteca para fazer a serialização, um objeto em YAML, que é um dos formatos que a API do Focus NFe aceita. (Site da biblioteca: http://www.aaubry.net/page/YamlDotNet)

Vamos abrir o Visual Studio e criar um projeto. Para este exemplo irei utilizar a versão 2013 Ultimate.

1 – Vá para a guia File > New Project
Na lista de Templates escolha Visual C# > Web e escolha o template ASP.NET Web Application e dê um nome de sua preferência ao projeto, no nosso caso usaremos FocusNFeApi. Clique em OK e escolha a opção MVC e clique em OK novamente.

3 – O Primeiro passo será instalar a biblioteca, que está disponível como um pacote NuGet. Abra o Package Manager Console e digite:
Install-Package YamlDotNet

2 – Abra a View Index.cshtml do Controller Home e deixe-a dessa maneira:

@{
  ViewBag.Title = "Home Page";
}

@ViewBag.Retorno

@using (Html.BeginForm("EmitirNFe", "Home")){
  @:REF: @Html.TextBox("referencia") ;
}

@using (Html.BeginForm("ConsultarStatusNFe", "Home")){
  @:REF: @Html.TextBox("referencia") 
}

Caminho DANFE: @ViewBag.caminhoDanfe
Caminho XML: @ViewBag.caminhoXML
Chave NFe: @ViewBag.chaveNFe
Mensagem SEFAZ: @ViewBag.mensagemSefaz
Numero NFe: @ViewBag.numeroNFe
Status: @ViewBag.status
Código Status: @ViewBag.codigoStatus

3 – Abra o HomeController.cs e defina as seguintes variáveis globalmente dentro do Controller:

  static string focusToken = "token_recebido_do_suporte";
  static string ambienteFocus = "homologacao"; //homologacao ou producao
  static string autorizarNFe = "http://" + ambienteFocus + ".acrasnfe.acras.com.br/nfe2/autorizar?token=" + focusToken + "&ref=";
  static string consultarStatusNFe = "http://" + ambienteFocus + ".acrasnfe.acras.com.br/nfe2/consultar?token=" + focusToken + "&ref=";

4 – Crie a primeira Action com atributo HttpPost que vai receber uma string com a referência da NFe que estamos emitindo. Nesse caso para exemplificação criamos apenas um TextBox onde digitaremos manualmente essa referência.

Passaremos as informações contidas na nota fiscal todas manualmente, nessa altura você já deverá ter essas informações no seu banco de dados para que possa recuperá-las e inserir cada dado em sua posição, inclusive o número de referência que deverá ficar salvo para podermos consultar o resultado de retorno da NFe na API futuramente.
Para nosso exemplo deixe sua Action desta Maneira (lembre-se de considerar tratamentos de erro, pois não implementamos em nosso exemplo):

[HttpPost]
public ActionResult EmitirNFe(int referencia){
  var dadosNFe = new{
    //Dados NFe
    natureza_operacao = "Venda",
    forma_pagamento = "0",
    data_emissao = DateTime.Now.ToString("yyyy-MM-dd"),
    tipo_documento = "1",
    finalidade_emissao = "1",
    //Dados emitente
    cnpj_emitente = "SEU_CNPJ",
    nome_emitente = "RAZÃO SOCIAL DO EMITENTE",
    logradouro_emitente = "RUA COELHO LISBOA",
    numero_emitente = "501",
    bairro_emitente = "TATUAPÉ",
    municipio_emitente = "SÃO PAULO",
    uf_emitente = "SP",
    cep_emitente = "03323040",
    telefone_emitente = "11999999999",
    inscricao_estadual_emitente = "SUA_INSCRICAO_ESTADUAL",
    regime_tributario_emitente = "1",
    //Dados destinatário
    cpf_destinatario = "",
    cnpj_destinatario = "CNPJ _DESTINATARIO",
    inscricao_estadual_destinatario = "INSCRICAO_ESTADUAL_DESTINATARIO",
    nome_destinatario = "NF-E EMITIDA EM AMBIENTE DE HOMOLOGACAO - SEM VALOR FISCAL",
    logradouro_destinatario = "AV PAULISTA",
    numero_destinatario = "1000",
    bairro_destinatario = "1159",
    municipio_destinatario = "SÃO PAULO",
    codigo_municipio_destinatario = "3550308",
    uf_destinatario = "SP",
    cep_destinatario = "01310100",
    pais_destinatario = "BRASIL",
    telefone_destinatario = "11988888888",
    email_destinatario = "email@email.com.br", //O sistema FocusNFe enviará a nota fiscal para o e-       mail passado aqui
    //Totais
    icms_base_calculo = "0.00",
    icms_valor_total = "0.00",
    icms_base_calculo_st = "0.00",
    icms_valor_total_st = "0.00",
    valor_produtos = "100.10",
    valor_frete = "0.00",
    valor_seguro = "0.00",
    valor_desconto = "0.00",
    valor_total_ii = "0.00",
    valor_ipi = "0.00",
    valor_pis = "0.00",
    valor_cofins = "0.00",
    valor_outras_despesas = "0.00",
    valor_total = "100.10",
    modalidade_frete = "1",
    informacoes_adicionais_contribuinte = "DOCUMENTO EMITIDO POR ME OU EPP OPTANTE PELO SIMPLES    NACIONAL",
    items = new List<object>{}
  };

  dadosNFe.items.Add(new{
    //Informações do produto
    numero_item = "1",
    codigo_produto = "19999/A",
    descricao = "Placa de homenagem 14x10cm",
    codigo_ncm = "73269090",
    cfop = "5102",
    unidade_comercial = "PÇ",
    quantidade_comercial = "1",
    valor_unitario_comercial = "100.10",
    unidade_tributavel = "PÇ",
    quantidade_tributavel = "1",
    valor_unitario_tributavel = "100.10",
    valor_bruto = "100.10",
    inclui_no_total = "1",
    //Impostos
    icms_origem = "0",
    icms_situacao_tributaria = "101",
    icms_aliquota = "1.25",
    icms_valor = Math.Round((1.25 / 100) * 100.10, 2).ToString("0.00", CultureInfo.InvariantCulture),
    pis_situacao_tributaria = "07",
    cofins_situacao_tributaria = "07"
  });

  StringWriter sw = new StringWriter();
  //A classe Serializer é Da biblioteca YamlDotNet, ela escreve o YAML na
  //StringWriter passada no método Serialize.
  var serializer = new Serializer();
  serializer.Serialize(sw, dadosNFe);

  //A API precisa receber as informações com codificação UTF8.
  //Convertemos a string para byte[] para podermos enviar com o método
  //UploadData da classe WebClient;
  byte[] bytes = System.Text.Encoding.UTF8.GetBytes(sw.ToString());

  using (WebClient webClient = new WebClient()){
    //Envia as informações para a URL de autorização da API
    webClient.UploadData(autorizarNFe + referencia, "POST", bytes);
  }

  ViewBag.Retorno = "Nota Fiscal enviada com sucesso.";

  return View("Index");
}

5 – Neste ponto a implementação de envio já está funcionando, rode sua aplicação, preencha uma referência qualquer para sua NF-e e clique no botão Emitir Nota Fiscal Eletrônica. Após o envio das informações o sistema Focus NFe estará processando a autorização. Para sabermos o resultado devemos utilizar a URL de consulta da API, que já definimos com a variável “consultarStatusNFe” no item 3 deste exemplo.

Vamos então criar outra Action também com o atributo HttpPost que vai receber a string com a referência que utilizamos quando emitimos a NFe. Da mesma forma que a emissão, para exemplificação criamos apenas um TextBox na View onde digitaremos manualmente a mesma referência da nota que já emitimos.

[HttpPost]
public ActionResult ConsultarStatusNFe(int referencia)
{
  //Acessa a URL de consulta de status da API
  HttpWebRequest request = (HttpWebRequest)WebRequest.Create(consultarStatusNFe + referencia);
  //Carrega o retorno num objeto HttpWebResponse
  HttpWebResponse response = (HttpWebResponse)request.GetResponse();
  StringReader resultado;
  using (StreamReader sr = new StreamReader(response.GetResponseStream(), System.Text.Encoding.UTF8))
  {
    //Lê o retorno e carrega na StringReader
    resultado = new StringReader(sr.ReadToEnd());
  }

  //Carregar o Stream no objeto do tipo YamlStream do componente YamlDotNet
  YamlStream yaml = new YamlStream();
  yaml.Load(resultado);

  //Examina o stream
  var mapping = (YamlMappingNode)yaml.Documents[0].RootNode;
  //Nesse ponto já conseguimos acessar o YAML de retorno
  ViewBag.caminhoDanfe = mapping.Children[new YamlScalarNode("caminho_danfe")].ToString();
  ViewBag.caminhoXML = mapping.Children[new YamlScalarNode("caminho_xml_nota_fiscal")].ToString();
  ViewBag.chaveNFe = mapping.Children[new YamlScalarNode("chave_nfe")].ToString();
  ViewBag.mensagemSefaz = mapping.Children[new YamlScalarNode("mensagem_sefaz")].ToString();
  ViewBag.numeroNFe = mapping.Children[new YamlScalarNode("numero")].ToString();
  ViewBag.status = mapping.Children[new YamlScalarNode("status")].ToString();
  ViewBag.codigoStatus = mapping.Children[new YamlScalarNode("status_sefaz")].ToString();

  return View("Index");
}

6 – Pronto, nossa aplicação está finalizada, faltando apenas implementar a emissão de carta de correção, cancelamento e inutilização de faixa de numeração, mas apenas com essas informações basta seguir a mesma linha para fazer o restante, atentando-se apenas que as URLs da API onde não precisamos enviar arquivos mas somente valores, como por exemplo a solicitação de carta de correção ou cancelamento, devemos enviar a solicitação da seguinte maneira:

  System.Collections.Specialized.NameValueCollection valores = new System.Collections.Specialized.NameValueCollection();
  valores.Add("correcao” , "Texto da correção");
  using (WebClient webClient = new WebClient()){
    webClient.UploadValues("http://producao.acrasnfe.acras.com.br/nfe2/emitir_cce?token=TOKEN&ref=REFERENCIA", valores);
  }

Quer integrar seu sistema para emissão de NF-e? Clique aqui, acesse nossa documentação e saiba tudo o que você para fazer a integração do seu sistema com a noss API.

Este post tem 12 comentários

  1. João Prado

    Como é feita a assinatura digital do documento?

  2. ricardo

    Olá João,

    A assinatura digital do documento é inteiramente feita pela nossa API, você como usuário da API não precisa se preocupar. Assim como a geração do DANFe e toda a comunicação com a receita, é tudo responsabilidade de nossa API.

    Atenciosamente,

  3. João Prado

    Muito interessante, nesse caso precisaríamos enviar o arquivo do certificado A1 certo?

    Provavelmente irei fechar com vocês um pacote de emissão para o início de 2015. Obrigado pelas informações.

    Abraços

    1. ricardo

      Ok João, aguardamos seu contato!
      Sobre o certificado é isso mesmo, você nos envia o certificado e ele fica em nosso servidor instalado.

  4. Wagner

    Ricardo estou implementando na minha aplicação pela primeira, e na verdade não sei bem como funciona todo o procedimento.
    Pode so me explicar qual seria esses valores de Referencia para Emitir e Consultar a NFe?
    O que devo fazer? Obrigado

    1. ricardo

      Olá Wagner,

      O valor de referência é apenas um identificador único da nota fiscal em seu sistema. Ele é utilizado para criar um elo em uma nota entre seu sistema e o nosso. Muitos desenvolvedores utilizam o próprio id em banco de dados para esta referência ou algum derivado deste id.

      Espero ter ajudado.

      Atenciosamente,

  5. Romulo Oliveira

    Bom dia. Há como ter um ambiente de testes para gerar NFe?

    1. egon

      Olá, para emissão via API, sim, é possível!

  6. Assis

    Teria como postar o codigo das classes dadosNFe e itens da NFe?

    1. egon

      Olá Assis,
      dadosNFe não é uma classe criada, é apenas um “array associativo” que mapeia uma chave para um valor. Umas dessas chaves é o campo “items” que nada mais é que uma instância da classe List que já existe na linguagem.

  7. Marden

    Preciso de um código de exemplo em vb.net para windows forms, onde posso obter esta ajuda? não encontrei nenhum exemplo na linguagem vb.net. obrigado

    1. egon

      Olá Marden,
      Ainda não temos realmente exemplos para VB.net, mas você precisa apenas estar familiarizado com alguma biblioteca de comunicação via HTTP. Você encontra nossa documentação aqui: http://focusnfe.com.br/api/doc/nfe/

Deixe um comentário