/// <summary> /// Adiciona e valida uma nota a ser enviada apartir de um arquivo XML. /// </summary> /// <param name="arquivoCaminhoXml"></param> public void AdicionarNota(String arquivoCaminhoXml) { //Carrega uma nota XML e passa para um objeto Nota var nota = new Nota(arquivoCaminhoXml); AdicionarNota(nota); }
/// <summary> /// Adiciona e valida uma nota a ser enviada. /// </summary> /// <param name="nota"></param> public void AdicionarNota(Nota nota) { var bllAssinatura = new AssinaturaDeXml(); var bllXml = new Xml(); //Verifica se já passou o limite de notas por lote (regra do SEFAZ). if (notaLista.Count >= 50) { throw new Exception("Limite máximo por lote é de 50 arquivos"); } //Assina a nota try { bllAssinatura.AssinarNota(nota, NFeContexto.Certificado, "NFe"); } catch (Exception e) { throw new Exception("Erro ao assinar Nota: " + e.Message); } //Verifica se a nota está de acordo com o schema, se não estiver vai disparar um erro try { bllXml.ValidaSchema(nota.CaminhoFisico, Util.ContentFolderSchemaValidacao + "\\" + NFeContexto.Versao.PastaXml + "\\" + arquivoSchema); } catch (Exception e) { throw new Exception("Erro ao validar Nota: " + e.Message); } //Adiciona para a lista do lote a serem enviadas notaLista.Add(nota); }
private RetornoSimples EnviarEvento(StringBuilder eventoXml, String id, String arquivoEvento, String schema) { var documentXml = Assinar(eventoXml, id, schema); var xmlDoc = new XmlDocument(); xmlDoc.Load(arquivoEvento); var conteudoXml = xmlDoc.OuterXml; var nota = new Nota(NFeContexto) {CaminhoFisico = arquivoEvento}; var bllXml = new Xml(); var xmlString = new StringBuilder(); xmlString.Append("<?xml version=\"1.0\" encoding=\"utf-8\"?>"); xmlString.Append("<envEvento versao=\"1.00\" xmlns=\"http://www.portalfiscal.inf.br/nfe\">"); xmlString.Append(" <idLote>0131318</idLote>"); xmlString.Append(conteudoXml); xmlString.Append("</envEvento>"); var SW_2 = File.CreateText(arquivoEvento); SW_2.Write(xmlString.ToString()); SW_2.Close(); //Verifica se a nota está de acordo com o schema, se não estiver vai disparar um erro try { bllXml.ValidaSchema(arquivoEvento, Util.ContentFolderSchemaValidacao + "\\" + NFeContexto.Versao.PastaXml + "\\" + schema); } catch (Exception e) { throw new Exception("Erro ao validar Nota: " + e.Message); } var recepcao = new RecepcaoEvento2.RecepcaoEvento(); var cabecalho = new nfeCabecMsg(); cabecalho.cUF = "35"; cabecalho.versaoDados = "1.00"; recepcao.nfeCabecMsgValue = cabecalho; recepcao.ClientCertificates.Add(NFeContexto.Certificado); var resposta = recepcao.nfeRecepcaoEvento(Xml.StringToXml(xmlString.ToString())); var status = resposta["retEvento"]["infEvento"]["xMotivo"].InnerText; var motivo = resposta["retEvento"]["infEvento"]["cStat"].InnerText; return new RetornoSimples(status, motivo); }
private String Assinar(Nota nota, X509Certificate2 x509Cert, String TagAssinatura, String URI = "") { string xmlString; using (var srReader = File.OpenText(nota.CaminhoFisico)) { xmlString = srReader.ReadToEnd(); } // Create a new XML document. var doc = new XmlDocument(); // Format the document to ignore white spaces. doc.PreserveWhitespace = false; doc.LoadXml(xmlString); XmlDocument xMLDoc; var reference = new Reference(); if (!String.IsNullOrEmpty(nota.NotaId)) reference.Uri = "#" + TagAssinatura + nota.NotaId; else if (!String.IsNullOrEmpty(URI)) reference.Uri = URI; // Create a SignedXml object. var signedXml = new SignedXml(doc); // Add the key to the SignedXml document signedXml.SigningKey = x509Cert.PrivateKey; // Add an enveloped transformation to the reference. var env = new XmlDsigEnvelopedSignatureTransform(); reference.AddTransform(env); var c14 = new XmlDsigC14NTransform(); reference.AddTransform(c14); // Add the reference to the SignedXml object. signedXml.AddReference(reference); // Create a new KeyInfo object var keyInfo = new KeyInfo(); // Load the certificate into a KeyInfoX509Data object // and add it to the KeyInfo object. keyInfo.AddClause(new KeyInfoX509Data(x509Cert)); // Add the KeyInfo object to the SignedXml object. signedXml.KeyInfo = keyInfo; signedXml.ComputeSignature(); // Get the XML representation of the signature and save // it to an XmlElement object. var xmlDigitalSignature = signedXml.GetXml(); // Gravar o elemento no documento XML var assinaturaNodes = doc.GetElementsByTagName(TagAssinatura); foreach (XmlNode nodes in assinaturaNodes) { nodes.AppendChild(doc.ImportNode(xmlDigitalSignature, true)); break; } xMLDoc = new XmlDocument(); xMLDoc.PreserveWhitespace = false; xMLDoc = doc; // Atualizar a string do XML já assinada var StringXMLAssinado = xMLDoc.OuterXml; //Atualiza a nota assinada nota.ConteudoXml = StringXMLAssinado; // Gravar o XML Assinado no HD var SignedFile = nota.CaminhoFisico; var SW_2 = File.CreateText(SignedFile); SW_2.Write(StringXMLAssinado); SW_2.Close(); return SignedFile; }
/// <summary> /// Assina um arquivo Xml /// </summary> /// <param name="arquivoNome"></param> /// <param name="operacao"></param> /// <param name="x509Cert"></param> public String AssinarNota(Nota nota, X509Certificate2 x509Cert, String tagAssinatura, String uri = "") { //Abrir o arquivo XML a ser assinado e ler o seu conteúdo return Assinar(nota, x509Cert, tagAssinatura, uri); }
private String Assinar(StringBuilder xmlStringBuilder, String id, String schema) { var bllXml = new Xml(); var arquivoTemporario = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location) + "\\temp.xml"; var sw2 = File.CreateText(arquivoTemporario); sw2.Write(xmlStringBuilder.ToString()); sw2.Close(); var nota = new Nota(NFeContexto) {CaminhoFisico = arquivoTemporario}; //Assina a nota var bllAssinatura = new AssinaturaDeXml(); try { bllAssinatura.AssinarNota(nota, NFeContexto.Certificado, "evento", "#" + id); } catch (Exception e) { throw new Exception("Erro ao assinar Nota: " + e.Message); } return xmlStringBuilder.ToString(); }