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.