public ConfiguracaoApp() { CfgServico = ConfiguracaoServico.Instancia; CfgServico.tpAmb = TipoAmbiente.taHomologacao; CfgServico.tpEmis = TipoEmissao.teNormal; Emitente = new emit {CPF = "", CRT = CRT.SimplesNacional}; EnderecoEmitente = new enderEmit(); ConfiguracaoDanfeNfce = new ConfiguracaoDanfeNfce(NfceDetalheVendaNormal.UmaLinha, NfceDetalheVendaContigencia.UmaLinha, "", ""); }
/// <summary> /// Obtém a URL para uso no QR-Code /// </summary> /// <param name="nfe"></param> /// <param name="configuracaoDanfeNfce"></param> /// <returns></returns> public static string ObterUrlQrCode(Classes.NFe nfe, ConfiguracaoDanfeNfce configuracaoDanfeNfce) { //Passo 1: Converter o valor da Data e Hora de Emissão da NFC-e (dhEmi) para HEXA; var dhEmi = ObterHexDeString(nfe.infNFe.ide.dhEmi); //Passo 2: Converter o valor do Digest Value da NFC-e (digVal) para HEXA; //Ao se efetuar a assinatura digital da NFCe emitida em contingência off-line, o campo digest value constante da XMl Signature deve obrigatoriamente ser idêntico ao encontrado quando da geração do digest value para a montagem QR Code. //Ver página 18 do Manual de Padrões Padrões Técnicos do DANFE - NFC - e e QR Code, versão 3.2 if (nfe.Signature == null) { throw new Exception("Não é possível obter a URL do QR-Code de uma NFCe não assinada!"); } var digVal = ObterHexDeString(nfe.Signature.SignedInfo.Reference.DigestValue); //Na hipótese do consumidor não se identificar, não existirá o parâmetro cDest no QR Code; var cDest = ""; if (nfe.infNFe.dest != null) { cDest = "&cDest=" + nfe.infNFe.dest.CPF + nfe.infNFe.dest.CNPJ + nfe.infNFe.dest.idEstrangeiro; } //Passo 3: Substituir os valores (“dhEmi” e “digVal”) nos parâmetros; var dadosBase = "chNFe=" + nfe.infNFe.Id.Substring(3) + "&nVersao=100&tpAmb=" + ((int)nfe.infNFe.ide.tpAmb) + cDest + "&dhEmi=" + dhEmi + "&vNF=" + nfe.infNFe.total.ICMSTot.vNF.ToString("0.00").Replace(',', '.') + "&vICMS=" + nfe.infNFe.total.ICMSTot.vICMS.ToString("0.00").Replace(',', '.') + "&digVal=" + digVal + "&cIdToken=" + configuracaoDanfeNfce.cIdToken; //Passo 4: Adicionar, ao final dos parâmetros, o CSC (CSC do contribuinte disponibilizado pela SEFAZ do Estado onde a empresa esta localizada): var dadosParaSh1 = dadosBase + configuracaoDanfeNfce.CSC; //Passo 5: Aplicar o algoritmo SHA-1 sobre todos os parâmetros concatenados. Asaída do algoritmo SHA-1 deve ser em HEXADECIMAL. var sha1ComCsc = ObterHexSha1DeString(dadosParaSh1); //Passo 6: Adicione o resultado sem o CSC e gere a imagem do QR Code: 1º parte (endereço da consulta) +2º parte (tabela 3 com indicação SIM na última coluna). return(ObterUrl(nfe.infNFe.ide.tpAmb, nfe.infNFe.ide.cUF, TipoUrlDanfeNfce.UrlQrCode) + "?" + dadosBase + "&cHashQRCode=" + sha1ComCsc); }
/// <summary> /// Obtém a URL para uso no QR-Code /// </summary> /// <param name="nfe"></param> /// <param name="configuracaoDanfeNfce"></param> /// <returns></returns> public static string ObterUrlQrCode(Classes.NFe nfe, ConfiguracaoDanfeNfce configuracaoDanfeNfce) { //Passo 1: Converter o valor da Data e Hora de Emissão da NFC-e (dhEmi) para HEXA; var dhEmi = ObterHexDeString(nfe.infNFe.ide.dhEmi); //Passo 2: Converter o valor do Digest Value da NFC-e (digVal) para HEXA; //Ao se efetuar a assinatura digital da NFCe emitida em contingência off-line, o campo digest value constante da XMl Signature deve obrigatoriamente ser idêntico ao encontrado quando da geração do digest value para a montagem QR Code. //Ver página 18 do Manual de Padrões Padrões Técnicos do DANFE - NFC - e e QR Code, versão 3.2 if (nfe.Signature == null) throw new Exception("Não é possível obter a URL do QR-Code de uma NFCe não assinada!"); var digVal = ObterHexDeString(nfe.Signature.SignedInfo.Reference.DigestValue); //Na hipótese do consumidor não se identificar, não existirá o parâmetro cDest no QR Code; var cDest = ""; if (nfe.infNFe.dest != null) cDest = "&cDest=" + nfe.infNFe.dest.CPF + nfe.infNFe.dest.CNPJ + nfe.infNFe.dest.idEstrangeiro; //Passo 3: Substituir os valores (“dhEmi” e “digVal”) nos parâmetros; var dadosBase = "chNFe=" + nfe.infNFe.Id.Substring(3) + "&nVersao=100&tpAmb=" + ((int) nfe.infNFe.ide.tpAmb) + cDest + "&dhEmi=" + dhEmi + "&vNF=" + nfe.infNFe.total.ICMSTot.vNF.ToString("0.00").Replace(',', '.') + "&vICMS=" + nfe.infNFe.total.ICMSTot.vICMS.ToString("0.00").Replace(',', '.') + "&digVal=" + digVal + "&cIdToken=" + configuracaoDanfeNfce.cIdToken; //Passo 4: Adicionar, ao final dos parâmetros, o CSC (CSC do contribuinte disponibilizado pela SEFAZ do Estado onde a empresa esta localizada): var dadosParaSh1 = dadosBase + configuracaoDanfeNfce.CSC; //Passo 5: Aplicar o algoritmo SHA-1 sobre todos os parâmetros concatenados. Asaída do algoritmo SHA-1 deve ser em HEXADECIMAL. var sha1ComCsc = ObterHexSha1DeString(dadosParaSh1); //Passo 6: Adicione o resultado sem o CSC e gere a imagem do QR Code: 1º parte (endereço da consulta) +2º parte (tabela 3 com indicação SIM na última coluna). return ObterUrl(nfe.infNFe.ide.tpAmb, nfe.infNFe.ide.cUF, TipoUrlDanfeNfce.UrlQrCode) + "?" + dadosBase + "&cHashQRCode=" + sha1ComCsc; }