Geração de XML, validação e assinatura digital

Olá pessoal.

Estou disponibilizando um sistema de exemplo para geração de XML, validação e assinatura digital.

Atenção: A classe disponibilizada foi bastante alterada daquela que eu utilizo nas empresas no dia a dia, visando torna-la ainda mais automatizada com Reflection, portanto, não testei todas as situações possíveis, mas já aviso antecipadamente que qualquer problema com a classe vocês podem perguntar que vou ajustando.

Antes de tudo, esta classe não é para ser um exemplo demonstrando a melhor forma de se gerar um XML para NFe, na verdade quando iniciei o desenvolvimento a intenção era uma geração de XML com manutenção fácil para que no futuro as alterações de Layout fossem o mais simples possível.

Portanto, explicando basicamente, a classe foi inteiramente escrita conforme o manual de Integração, utiliza Reflection para uma geração mais automatizada e atributos para facilitar a formatação e outras configurações do XML. Acredito que o meu objetivo inicial com ela, que era ter uma classe de fácil manutenção foi atingida.

Vou começar explicando como a classe funciona e no final deste posto você encontra um aplicativo exemplo com a classe em uso. No meu sistema original esta classe está mais organizada, mas para o exemplo, coloquei as classes um pouco bagunçadas dentro de arquivos, mas acredito que está bem fácil de entender.

Bom, a classe não tem muito segredo, foi inteiramente digitada, é necessário apenas explicar alguns dos recursos que implementei.

Atributos
Entre as várias propriedades da classe, em algumas você encontra atributos como no exemplo abaixo:

                [Formato("#####0.0000", "en-US")]
                public decimal qCom { get; set; }

O Atributo [Formato] define o formato que o valor precisa no XML, além de informar a cultura, como “en-US” ou “pt-br”.

            [Obrigatorio]
            public string IE { get; set; }

O Atributo [Obrigatorio] define se o campo deve sair no XML mesmo quando não tiver um valor definido, como o IE por exemplo, que mesmo que esteja em branco deve ser informado no XML ( ou ).

Além disso, várias propriedades podem ser nulas, como esta no exemplo abaixo:

public decimal? qTrib { get; set; }

Estas propriedades serão ignoradas pelo reflection se não tiverem um valor definido, utilize quando a TAG não deve ser informada no XML quando não possuir um valor.

Geração do XML
Pretendo explicar basicamente como desenvolvi a geração do XML através do Reflection. Vale lembrar que talvez algumas coisas devem ser arrumadas aqui ainda, visto que para este Post no Blog eu alterei a classe visando tornar ela ainda mais automatizada. Além disso, não me crucifiquem por algumas linhas de código, em algumas funções eu realmente não encontrei uma melhor de forma de fazer, mas uma das razões de postar esta classe é ter um feedback de vocês e melhorar ela ainda mais :P

Com a classe preenchida, a geração do XML é simples:

            NFe teste = new NFe();
            //Código para preencher a classe... no exemplo ele está disponível, aqui resolvi economizar espaço pulando esta parte
            XmlDocument xmlGerado = teste.GerarXML();
            //Salva uma cópia do XML não assinado - ATENÇÃO - se você está utilizando Windows Vista/7/Server, salvar na Unidade C pode não ser possível caso o VS2008 não esteja rodando como administrador
            xmlGerado.Save("c:\\testeXMLNaoAssinado.xml");
            //Seleciona o certificado
            X509Certificate2 certificado = CertificadoDigital.SelecionarCertificado();
            //assina o xml
            XmlDocument xmlAssinado = CertificadoDigital.Assinar(xmlGerado, "infNFe", certificado);                        

            //Valida o XML assinado
            string resultado = ValidaXML.ValidarXML(xmlAssinado);

            if (resultado.Trim().Length == 0)
                resultado = "Xml gerado com sucesso, nenhum erro encontrado";

            //Opcional - Função para gerar o Lote e deixar o arquivo pronto para ser enviado.
            //teste.GerarLoteNfe(ref xmlAssinado);

            //Importante:
            //Salvar através do TextWriter evita que o XML saia formatado no arquivo, desta forma o mesmo
            //pode ser rejeitado por alguns estados e/ou não validar nos programas teste
            using (XmlTextWriter xmltw = new XmlTextWriter("C:\\testeXML.xml", new UTF8Encoding(false)))
            {
                xmlAssinado.WriteTo(xmltw);
                xmltw.Close();

Eis a função GerarXML() – Veja os comentários no código para entender melhor

        public XmlDocument GerarXML()
        {
            XmlWriterSettings configXML = new XmlWriterSettings();
            configXML.Indent = true;
            configXML.IndentChars = "";
            configXML.NewLineOnAttributes = false;
            configXML.OmitXmlDeclaration = false;            

            Stream xmlSaida = new MemoryStream();

            XmlWriter oXmlGravar = XmlWriter.Create(xmlSaida, configXML);

            oXmlGravar.WriteStartDocument();
            oXmlGravar.WriteStartElement("NFe","http://www.portalfiscal.inf.br/nfe"); //abre nfe
            oXmlGravar.WriteStartElement("infNFe");
            oXmlGravar.WriteAttributeString("xmlns","xsi",null,"http://www.w3.org/2001/XMLSchema-instance");
            oXmlGravar.WriteAttributeString("Id", "NFe" + Id.ToString());
            oXmlGravar.WriteAttributeString("versao", versao.ToString());

            Type tipoObjeto;
            tipoObjeto = infNFE.Ide.GetType();
            PropertyInfo[] propriedades;
            propriedades = tipoObjeto.GetProperties();

            //A Função objetoParaXML utiliza o reflection para ler as propriedades da classe e gerar o XML
            objetoParaXML(oXmlGravar, infNFE.Ide,false);
            objetoParaXML(oXmlGravar, infNFE.Emit,false);
            objetoParaXML(oXmlGravar, infNFE.Dest, false);

            foreach (infNFE.det detalhe in infNFE.Det)
            {
                oXmlGravar.WriteStartElement("det");
                oXmlGravar.WriteAttributeString("nItem", detalhe.nItem.ToString());

                objetoParaXML(oXmlGravar, detalhe.Prod, false);

                oXmlGravar.WriteStartElement("imposto");
                objetoParaXML(oXmlGravar, detalhe.Imposto.Icms, false);
                objetoParaXML(oXmlGravar, detalhe.Imposto.Ii, false);
                objetoParaXML(oXmlGravar, detalhe.Imposto.Ipi, false);
                objetoParaXML(oXmlGravar, detalhe.Imposto.Pis, false);
                objetoParaXML(oXmlGravar, detalhe.Imposto.Cofins, false);                

                oXmlGravar.WriteEndElement(); //fecha TAG imposto...
                oXmlGravar.WriteEndElement(); //fecha TAG det...
            }

            objetoParaXML(oXmlGravar, infNFE.Total, false);
            objetoParaXML(oXmlGravar, infNFE.Transp, false);
            objetoParaXML(oXmlGravar, infNFE.Cobr, false);
            objetoParaXML(oXmlGravar, infNFE.InfAdic, false);

            oXmlGravar.WriteEndElement(); //fecha infNFe
            oXmlGravar.WriteEndElement(); //fecha NFe            

            oXmlGravar.Flush();
            xmlSaida.Flush();
            xmlSaida.Position = 0;

            XmlDocument documento = new XmlDocument();
            documento.Load(xmlSaida);

            oXmlGravar.Close();                      

            return documento;
        }

Função objetoParaXML, que gera o XML

        private void objetoParaXML(XmlWriter xmlWriter, object objeto, bool ignorarDeclaracaoElemento)
        {
            if (objeto == null)
                return;

            Type tipoObjeto;
            tipoObjeto = objeto.GetType();
            PropertyInfo[] propriedades;
            propriedades = tipoObjeto.GetProperties();

            if (!ignorarDeclaracaoElemento)
                xmlWriter.WriteStartElement(tipoObjeto.Name);                 

            foreach (PropertyInfo propriedade in propriedades)
            {
               //A Função novaTag verifica se a propriedade em sí é um novo elemento, como o enderEmit
               //no caso do emitente, e verifica tbm se esta propriedade foi declarada (!= null), se não ignora

                if (Funcoes.novaTag(propriedade) && !(propriedade.GetValue(objeto, null) == null))
                {
                   //utilizando recursão
                    objetoParaXML(xmlWriter, propriedade.GetValue(objeto, null), false);
                    continue;
                }

                object[] obj = propriedade.GetCustomAttributes(false);
                Funcoes.gravarElemento(xmlWriter, propriedade.Name, propriedade.GetValue(objeto, null), obj);
            }
            if (!ignorarDeclaracaoElemento)
                xmlWriter.WriteEndElement();
        }

Bom, por enquanto é isso, não sei se consegui deixar claro sobre como funciona a classe, e agora estou com o tempo curto e vou postar assim mesmo, mas os comentários estão abertos para que todos possam perguntar, e assim vou melhorando este post e os códigos disponíveis.

Detalhe: A Classe está sendo disponibilizada gratuitamente, mas por favor, se você fizer alterações, notifique-me para que eu possa melhorar o código disponível.

Link para Download do Exemplo

Para usar, mude o código do button1, adicionando um CNPJ válido, IE, nome de empresa e etc.

You can follow any responses to this entry through the RSS 2.0 feed. You can leave a response, or trackback from your own site.

1.305 Comments »

 
  • Bruno disse:

    Boa tarde Giovanni,

    Quero desde já parabelizar por este post e gostaria de pedir uma ajuda com relação aos outros tópicos da NFe.

    Eu comecei a trabalhar recentemente com .NET e estou precisando desenvolver um módulo em um ERP que faça todas as etapas de geração do XML + assinatura, validação, envio da nota fiscal para a receita, cancelamento, impressão do DANFe etc.

    Assim gostaria de perdir uma ajuda sobre como posso desenvolver estas etapas posteriores ao do post descrito acima?

    Fico no aguardo de sua resposta e agradecendo novamente pela atenção.

  • Giovanni Alexandre Costa Rosa disse:

    Boa tarde Bruno
    Estarei postando ainda esta semana a classe que utilizo para conexão com os WebServices, assim como um tutorial explicando como funciona a conexão, estou apenas aguardando por um Upgrade da maquina que utilizo em casa.

  • Gkádiston disse:

    Olá Bom dia,

    Você já fez algo parecido para o CT-e.
    Estou tentando usar sua classe como base para desenvolver a minha do CT-e, Mas estou encontrando vários problemas em tabelas que podem aparecer mais de uma vez e são fihas de várias outras.

  • Giovanni Alexandre Costa Rosa disse:

    Olá
    Ainda não mexi com a CT-e, acredito que em breve terei que fazer algum serviço do tipo, mas por enquanto não. Mas se tiver dúvidas sobre como implementar algo na classe me avise, posso tentar lhe ajudar com a lógica dela.

  • Ernandes Muniz disse:

    Giovanni, muito bom seus artigos sobre NF-e, com base neles (mesmo sem experiência em csharp) consegui assinar e validar meu xml. Entretanto não estou conseguindo utilizar os webservices da sefaz, e para ser sincero, não sei nem por onde começar… vc. já fez algum post de envio do xml para a sefaz ??

    Att.

    Ernandes Muniz

  • Giovanni Alexandre Costa Rosa disse:

    Olá Ernandes

    Eu já queria ter colocado todos os posts possíveis sobre a NFe aqui, mas ainda me falta tempo… sobre sua dúvida, respondi alguns tópicos no forum da MSDN que explica isso uma vez, veja se estes links te ajudam e qualquer coisa pergunte aqui ou la no forum que vou respondendo na medida do possível

    http://social.msdn.microsoft.com/Forums/pt-BR/504/thread/c75142b6-ad8a-43ee-9113-b2e9e9353b1b/#a8bb4684-d66c-4735-8024-bbd758c00a7f

    http://social.msdn.microsoft.com/Forums/pt-BR/webservicespt/thread/749b31bf-efb7-423f-8bdc-78e51d25e603/#907b716b-f765-4f84-aeef-1b44b1fee794

  • José Wagner disse:

    Qual versão do visual studio você utilizou pra fazer este projeto? Estou tentando abrir no 2005 e não estou conseguindo…

  • Giovanni Alexandre Costa Rosa disse:

    O projeto foi criado utilizando o VS 2008.

    Abraço

  • José Wagner disse:

    Tem muita gente que ainda trabalha com o visual studio 2005, você podereia se for de seu interesse também disponibilizar uma versão pra este visual studio??? Fui tentar pelo menos copiar sua classe NFe.cs, e colocar no projeto pra testar, e deu “erro” pra tudo quanto é lado…

  • Giovanni Alexandre Costa Rosa disse:

    Verifica se isso não lhe ajuda..
    http://msmvps.com/blogs/jon_skeet/Default.aspx/archive/2007/11/20/vs2005-and-vs2008-co-existence.aspx

    Mas você pode criar o projeto no 2005 e adicionar a classe sem problemas, desde que adicione o funcoes.cs junto na solution.

    abraço

  • Davi Gomes disse:

    Giovanni, parabéns pelos posts tem me ajudado muito. Queria saber se você poderia me ajudar com os web services, já instalei os Certificados AC de todos os ambientes, e instalei o certificado raíz valido. Mais não consigo abrir nenhum ws, nem o de consulta de status, sempre tenho o retorno de erro 403.7 dizendo que precisa de um certificado instalado.
    Segue o erro:

    There was an error downloading ‘https://homologacao.nfe.sefaz.rs.gov.br/ws/nfestatusservico/NfeStatusServico.asmx’.
    The request failed with HTTP status 403: Forbidden.
    Metadata contains a reference that cannot be resolved: ‘https://homologacao.nfe.sefaz.rs.gov.br/ws/nfestatusservico/NfeStatusServico.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.

    Preciso emitir NF-e para o estado do PA e posteriormente PR e PE, você tem alguma dica que possa me ajudar?

  • Jimmy disse:

    Olá Giovanni. Tive muita dificuldade em achar fontes para gerar código de barras 128C para o DANFE. Nas minhas pesquisas, se não me engano, vi que você também estava procurando. Consegui um fonte que funciona muito bem. Só tem que mexer na validação do código, porque ele tenta converter o código em int64 para ver se não tem letras no meio, e como o código da NF-e é muito grande, dá como código inválido. Basta retirar ou alterar este código que funciona direitinho. Espero ter ajudado. O link é http://www.codeproject.com/KB/graphics/BarcodeLibrary.aspx.

    Abraço,

    Jimmy

  • Petrarca disse:

    Ola…

    Alguem conseguiu transformar na linguagem VB
    Estou tentando mas esta dando muitoe erros.

  • Ola, tudo bem ?

    Parabens pela iniciativa

    Sou desenvolvedor em Visual FoxPro 9.0 e estou preparando um projeto para geração da XML de acordo com manual do contribuinte da SEFAZ e faço coisas pequenas em c# pois estou estudando o mesmo tenho instalado o Visual studio 2008 express , gostaria de saber como poderei criar uma dll para executar os seguintes procedimentos;

    - assinar
    - validar
    - enviar
    - consultar status

    para ser usada junto com minha aplicação, poderia me explicar como fazer a mesma ?
    poderia me ceder materias para estudo de c# pois estou gostando muito.

    meu msn: walneyk@hotmail.com
    skype: masterfacil

  • Daniel disse:

    O Giovanni converti sua classe para VB.net e estou começando os primeiros testes com ela. mas agora vi que a versão do manual sera alterada a partir de abril você poderia me passar algumas dicas do que precisarei alterar.

  • Parabens pelo trabalho esta show, agora falta transformar seu exemplo em uma dll, e o xml jah esta sendo feito por mim, mais ae com chamadas nesta dll executaria os demais processos como o corre com o uninfe, saberia me dar uma bola nisso ? vc daria curso de c# ?

  • Giovanni Alexandre Costa Rosa tudo bem ?

    Olha no seu exemplo vc gera o xml atravez do button1_click jah fiz os testes e esta gerando corretamente inclusive o numero do lote, esta show parabens, gostaria de saber se poderia me explicar como fazer o seguinte.

    Em vez de gerar este xml pelo button do c# tem como ler os dados de um xml externo ? ou um arquivo texto ? pois estou gerando o xml atravez de meu software em Visual FoxPro 9.0 e gostaria de usar suas rotinas, mais tem que ter uma forma de criar uma dll de suas funções e eu chama-las externas ou outra coisa o que me diria ?

    Atenciosamente
    Walney Moreira Klein
    http://www.wmknet.com

  • Giovanni Alexandre Costa Rosa disse:

    Pessoal

    Desculpa a todos na demora em responder.

    Sobre a DLL não tem muito segredo, bastaria apenas compilar a classe dentro de uma class library, assim que me sobrar um tempo vou procurar fazer isso e disponibilizo aqui.

    Sobre a versão 2.0 da NFE, ela começa em 01/04, mas torna-se obrigatória apenas em 01/10, portanto ainda nem comecei a atualizar a classe, mas vou, obrigatoriamente ter que fazer uma nova versão dela, e podem ter certeza que ela será disponibilizada aqui no Blog.

    Um abraço a todos

  • Tavares disse:

    Giovanni, eu conseguir gerar uma dll à partir do seu código, mas ainda não conseguir usá-la no delphi 7. Vc poderia me dar alguma dica. Simplesmente a aplicação trava ao executar !

  • Amy disse:

    Giovanni, parabéns pelos posts tem me ajudado muito. Queria saber se você poderia me ajudar com os web services, já instalei os Certificados AC de todos os ambientes, e instalei o certificado raíz valido. Mais não consigo abrir nenhum ws, nem o de consulta de status, sempre tenho o retorno de erro 403.7 dizendo que precisa de um certificado instalado.
    Segue o erro:

    There was an error downloading ‘https://homologacao.nfe.sefaz.rs.gov.br/ws/nfestatusservico/NfeStatusServico.asmx’.
    The request failed with HTTP status 403: Forbidden.
    Metadata contains a reference that cannot be resolved: ‘https://homologacao.nfe.sefaz.rs.gov.br/ws/nfestatusservico/NfeStatusServico.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.

    Preciso emitir NF-e para o estado do PA e posteriormente PR e PE, você tem alguma dica que possa me ajudar?

  • juliano ribeiro disse:

    Bom dia Giovanni,

    muito bom o exemplo…

    Cara estou mexendo nessa paret de NFe e consegui fazer a parte de assinaturas e tal. Mas esses dias me apareceu um sistema que tenho que desenvolver , que é um sistema de nfs-e(serviços) e pelo que vi o xml a ser assinado não possui a tag Id para assinatura, portanto não tem também o reference Uri=”#”. Obtive informações de que o xml deve ser assinado inteiro usando reference uri =”" . Mas sempre da erro.
    Pode me ajudar em algo?

  • Giovanni Alexandre Costa Rosa disse:

    @Tavares, realmente não faço idéia no momento do porque não funcionou a DLL, confesso que já queria ter convertido isso para um Class Library e disponibilizar funcionando, mas a falta de tempo está sendo um problema pra mim no momento.

    @Amy o certificado do cliente já está instalado também? Apenas o certificados raiz não bastam, o browser pede pelo certificado a ser utilizado quando você tenta acessar a URL

    @Juliano ribeiro: Você tem o manual de nfs-e? Se sim, creio que posso dar uma verificada sobre isso pra lhe ajudar, mas fico lhe devendo uma resposta de imediato, já que ainda não trabalhei com Nota fiscal eletrônica de Serviço :D

  • juliano ribeiro disse:

    opa…legal, eu li o manual no site da abrasf, mas a nota implantada na minha cidade assina todo o xml e não uma tag especifica , ate tentei adaptar ontem mas da erro e nao deixa assinar….obrigado pela atenção

  • Davi disse:

    Boa Noite amigo… Acho que posso te chamar assim, pois que da uma força dessa só pode ser um grande amigo, você não tem idéia do quanto seu codigo de geração do XML me ajudou. Me manda o numero da conta que te mando um $$ pra ajudar… valeu cara… meu e-mail é

  • Petrarca disse:

    Ola pessoal

    Converti a classe para vb e esta funcionando muito bem.
    So tem um probleminha na função abaixo ta dando o seguinte erro:

    Tipo ‘http://www.portalfiscal.inf.br/nfe:TNFe’ é não declarado.

    Se alguem puder me ajudar fico agradecido.

    Public Function ValidarXML(ByVal documento As XmlDocument) As String

    Dim xmlSaida As Stream = New MemoryStream()
    documento.Save(xmlSaida)

    xmlSaida.Flush()
    xmlSaida.Position = 0
    Dim retorno As String = “”

    If (documento IsNot Nothing) AndAlso (File.Exists(”nfe_v1.10.xsd”)) Then
    ‘Vai encontrar o arquivo apenas se ele estiver na mesma pasta do executável
    Dim cStreamReader As New StreamReader(xmlSaida)
    Dim cXmlTextReader As New XmlTextReader(cStreamReader)
    Dim reader As New XmlValidatingReader(cXmlTextReader)

    Dim schemaCollection As New XmlSchemaCollection()
    schemaCollection.Add(”http://www.portalfiscal.inf.br/nfe”, “nfe_v1.10.xsd”)

    reader.Schemas.Add(schemaCollection)

    AddHandler reader.ValidationEventHandler, AddressOf reader_ValidationEventHandler

    Erro = “”
    Try
    While reader.Read()
    End While
    Catch ex As Exception
    Erro = ex.Message
    End Try

    reader.Close()

    If Erro “” Then
    retorno = “Resultado da validação ” & vbCr & vbLf & vbCr & vbLf
    retorno += Erro
    retorno += vbCr & vbLf & “…Fim da validação”
    End If
    Else
    retorno = “Documento XML inválido ou arquivo do Schema não foi encontrado.”
    End If

    Return retorno
    End Function

  • Bento Alves disse:

    Olá Giovanni,

    Muito bom seu exemplo, está ajudando bastante, mas estou com um problema quando uso o Certificado Digital da Caixa Ecominica Federal. Quando ele vai assinar o XML retorna este erro:

    Erro ao efetuar assinatura digital, detalhes: O índice estava fora dos limites da matriz.
    em System.Security.Cryptography.Utils.GetKeyPairHelper(CspAlgorithmType keyType, CspParameters parameters, Boolean randomKeyContainer, Int32 dwKeySize, SafeProvHandle& safeProvHandle, SafeKeyHandle& safeKeyHandle)
    em System.Security.Cryptography.RSACryptoServiceProvider.GetKeyPair()
    em System.Security.Cryptography.RSACryptoServiceProvider..ctor(Int32 dwKeySize, CspParameters parameters, Boolean useDefaultKeySize)
    em System.Security.Cryptography.RSACryptoServiceProvider..ctor(CspParameters parameters)
    em System.Security.Cryptography.X509Certificates.X509Certificate2.get_PrivateKey()
    em NfeExemplo.CertificadoDigital.Assinar(XmlDocument docXML, String pUri, X509Certificate2 pCertificado) na …..\NfeExemplo\NFe.cs:linha 96

    Na linha 96 tem essa instrução signedXml.SigningKey = cert.PrivateKey;

    Desde ja agradeço a apoio.
    []’s

  • Giovanni Alexandre Costa Rosa disse:

    @Bento Alves Você instalou a cadeia de certificados da Caixa? https://icp.caixa.gov.br/asp/certificados.asp
    Se sim, tente acessar o endereço do WebService através do Internet Explorer e veja se você consegue acessar sem problemas utilizando o certificado da caixa.

    E para aqueles que demonstraram interesse em fazer doações ao Blog, uma página para foi disponibilizada para este fim com Paypal.
    http://www.entendendo.net/donate/

    Um abraço a todos

  • Bento Alves disse:

    @Giovanni, Instalei sim e para testar acessei o portal do e-CAC. O mais extranho desse certificado da caixa é que ele fecha o tunel SSL porem na hora de assinar o XML ele da erro sempre da hora de pegar a PrivateKey. Não sei se ajuda, mas para fechar o tunel ele pede a senha mas para assinar ele não pede, independente da ordem que o certificado seja usado.

    []’s

  • Diego disse:

    Estou incluido o seu código de geração do xml no meu projeto, e após colocar uns namespaces que eram necesários, agora estou recebendo 8 erros, antes eu recebia 17, agora só 8, são eles:

    Error 315 The name ‘Funcoes’ does not exist in the current context

    Error 316 The name ‘Funcoes’ does not exist in the current context

    Todos são com relação ao ‘Funcoes’ ai.

    Poderia me ajudar?

  • YoungByers34 disse:

    According to my monitoring, thousands of persons in the world receive the credit loans at different creditors. Hence, there’s a good possibility to find a commercial loan in any country.

  • thiago mendes disse:

    Show de bola Giovanni!

    Tinha feito um projeto de NFe que estava meia boca e estava com medo de enviar ao meu cliente. Suas classes estão muito bem arquitetadas e faceis de utilizar. Parabens mesmo!

    Você tem alguma coisa relacionado ao envio do XML, consulta da chave de acesso e retorno desses processo?

    Me manda um email por favor.
    thiago.mendess@bol.com.br

    Um grande abraço.

    Thiago Mendes

  • thiago mendes disse:

    Giovanni,

    Mais uma pergunta… Ao assinar o XML a aplicação exibe uma janela para que haja a escolha de qual certificação utilizar,c erto? Precisava fazer esse envio atraves de um serviço do windows, essa processo da assinatura não rola de passar por parametro, de qual utilizar?

    Um abraço.

    Thiago Mendes

  • lions str disse:

    Giovani, tudo bem?

    Otimo artigo, parabens, porem tenho uma duvida em relação a um assunto parecido.

    tenho um escopo de projeto (http://www.desenvolvimento.gov.br/arquivos/dwnl_1294421398.pdf)
    Porem o arquivo xsd tem mais de 5000 linhas,

    O modelo é parecido com o seu, vou pegar alguns dados do BD de um sistema que jah existe e gerar um xml e assinar digitalmente, qual a melhor maneira de eu fazer isto? eu utilizei o xsd.exe para gerar as classes no .net, soó que estou com mais de 11 mil linhas na minha classe.
    Voce acha q devo fazer na mao ou de q maneira?

  • thiago mendes disse:

    Giovanni,

    Resolvi meu problema de passar o certificado sem abrir janela dessa forma:

    X509Certificate2 CertificadoDigital = new X509Certificate2();
    CertificadoDigital.Import(@”C:\Desenvolvimento\CatalogoEsperanca\Gwakai.CatalogoEsperanca.ServicoSolicitacaoNFe\Apoio\Associacao_Generico_SemSenha.pfx”);
    X509Certificate2Collection scollection = new X509Certificate2Collection(CertificadoDigital);

    if (scollection.Count == 0)
    throw new Exception(”Nenhum certificado digital foi selecionado ou o certificado selecionado está com problemas.”);
    return scollection[0];

    desse jeito ele carrega o arquivo da certificação digital direto… sem precisar selecionar em uma janela.

    Um abraço.

    Thiago Mendes

  • Giovanni Alexandre Costa Rosa disse:

    Thiago, muito interessante o código, obrigado por compartilhar :D

    Sobre as pessoas que estão me pedindo sobre a NFe 2.0, pretendo disponibilizar os códigos em breve, meu maior problema é tempo pra montar uma aplicação de exemplo, testar e postar aqui no Blog, mas já estou com ela funcionando, totalmente reescrita pra utilizar os recursos de serialização do .NET, permitindo inclusive ler os XMLs recebidos.

  • Giancarlo disse:

    Olá.

    Giovanni.
    Meu projeto estou fazendo em VB.NET, é próprio. Mas acho que você consegue me ajudar cara. Apesar de ser um outro código, não estou usando a sua base.

    Ando obtendo este erro ao conectar ao webservice: The HTTP request was forbidden client authentication scheme ‘Anonymous’.

    Quando vou adicionar e salvar a reference ao webservice de recepção ele pede minha senha do certificado(assim como pede se eu acessar pelo internet explorer). Atualmente tenho certificado A1 e o módulo de assinatura digital está trabalhando 100% correto.

    No entanto continua com esse problema logo que vou tentar me conectar ao ws. Você sabe o que é?

    Grato,
    Giancarlo.

  • Giancarlo disse:

    Resolvi o problema.
    Quem tiver com esse mesmo problema dessa mensagem, faça assim.
    Vá na App.Config ou Web.Config da sua aplicação e procure pelo XML que rege o SOAP que fica por trás do webservice.

    Procure por esse atributo de uma determinada tag: requireClientCertificate

    Achou? Deve estar como false, né? Pois então, aí está, deve ser TRUE. Mude e seja feliz.

    Giancarlo Braga.

  • Ademir disse:

    Estou com problema a enviar o xml acusando o erro abaixo:
    Falha na solicitação com status HTTP 403: Forbidden.

    Quem puder ajudar…

    O codigo que uso é:
    br.gov.sp.prefeitura.nfe.LoteNFe _rps = new br.gov.sp.prefeitura.nfe.LoteNFe();

    string ret = string.Empty;
    ret = _rps.TesteEnvioLoteRPS(1, xmlAssinado.ToString());

    Obrigado;

  • Website disse:

    Website…

    Geração de XML, validação e assinatura digital @ entendendo.net…

  • Alexander7 disse:

    buy@generic.LEVITRA” rel=”nofollow”>…

    Need cheap generic LEVITRA?…

  • Bar Stools Furniture…

    Geração de XML, validação e assinatura digital @ entendendo.net…

  • caixa econômica federal…

    [...]Geração de XML, validação e assinatura digital @ entendendo.net[...]…

  • loterias disse:

    loterias…

    [...]Geração de XML, validação e assinatura digital @ entendendo.net[...]…

  • jogos disse:

    jogo…

    [...]Geração de XML, validação e assinatura digital @ entendendo.net[...]…

  • loterias disse:

    política…

    [...]Geração de XML, validação e assinatura digital @ entendendo.net[...]…

  • loterias disse:

    mega sena…

    [...]Geração de XML, validação e assinatura digital @ entendendo.net[...]…

  • caixa disse:

    loterias…

    [...]Geração de XML, validação e assinatura digital @ entendendo.net[...]…

  • lotomania disse:

    mega sena…

    [...]Geração de XML, validação e assinatura digital @ entendendo.net[...]…

  • lotofacil disse:

    lotofacil…

    [...]Geração de XML, validação e assinatura digital @ entendendo.net[...]…

  • gratuito disse:

    classificados…

    [...]Geração de XML, validação e assinatura digital @ entendendo.net[...]…

 

Deixe uma resposta

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>