Exemple #1
0
        /// <summary>
        /// Obtém a URL para uso no QR-Code, versão 1.0 - leiaute 3.10
        /// </summary>
        private static string ObterUrlQrCode1(infNFeSupl infNFeSupl, Classes.NFe nfe, string cIdToken, string csc, VersaoServico versaoServico)
        {
            //Passo 1: Converter o valor da Data e Hora de Emissão da NFC-e (dhEmi) para HEXA;
            var dhEmi = Conversao.ObterHexDeString(nfe.infNFe.ide.ProxyDhEmi);

            //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 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 = Conversao.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=" + 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 + csc;

            //Passo 5: Aplicar o algoritmo SHA-1 sobre todos os parâmetros concatenados. A saída do algoritmo SHA-1 deve ser em HEXADECIMAL.
            var sha1ComCsc = Conversao.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).
            const string interrogacao = "?";
            var          url          = ObterUrl(infNFeSupl, nfe.infNFe.ide.tpAmb, nfe.infNFe.ide.cUF, TipoUrlConsultaPublica.UrlQrCode, versaoServico, VersaoQrCode.QrCodeVersao1);

            if (!url.EndsWith(interrogacao))
            {
                url += interrogacao;
            }
            return(url + dadosBase + "&cHashQRCode=" + sha1ComCsc);
        }
        /// <summary>
        /// Obtém a URL para uso no QR-Code, versão 2.0 - leiaute 4.00
        /// </summary>
        private static string ObterUrlQrCode2(infNFeSupl infNFeSupl, Classes.NFe nfe, string cIdToken, string csc, VersaoServico versaoServico)
        {
            #region 1ª parte

            const string parametro = "?p=";
            var          url       = ObterUrl(infNFeSupl, nfe.infNFe.ide.tpAmb, nfe.infNFe.ide.cUF, TipoUrlConsultaPublica.UrlQrCode, versaoServico, VersaoQrCode.QrCodeVersao2);
            if (!url.EndsWith(parametro))
            {
                url += parametro;
            }

            #endregion

            #region 2ª parte

            const string pipe = "|";

            //Chave de Acesso da NFC-e
            var chave = nfe.infNFe.Id.Substring(3);

            //Identificação do Ambiente (1 – Produção, 2 – Homologação)
            var ambiente = (int)nfe.infNFe.ide.tpAmb;

            //Identificador do CSC (Código de Segurança do Contribuinte no Banco de Dados da SEFAZ). Informar sem os zeros não significativos
            var idCsc = Convert.ToInt16(cIdToken);

            string dadosBase;

            if (nfe.infNFe.ide.tpEmis == TipoEmissao.teOffLine)
            {
                var diaEmi    = nfe.infNFe.ide.dhEmi.Day.ToString("D2");
                var valorNfce = nfe.infNFe.total.ICMSTot.vNF.ToString("0.00").Replace(',', '.');
                var digVal    = Conversao.ObterHexDeString(nfe.Signature.SignedInfo.Reference.DigestValue);
                dadosBase = string.Concat(chave, pipe, (int)VersaoQrCode.QrCodeVersao2, pipe, ambiente, pipe, diaEmi, pipe, valorNfce, pipe, digVal, pipe, idCsc);
            }
            else
            {
                dadosBase = string.Concat(chave, pipe, (int)VersaoQrCode.QrCodeVersao2, pipe, ambiente, pipe, idCsc);
            }

            var dadosSha1 = string.Concat(dadosBase, csc);
            var sh1       = Conversao.ObterHexSha1DeString(dadosSha1);

            return(string.Concat(url, dadosBase, pipe, sh1));

            #endregion
        }