private CfdiResult EscribirXml(String rutaSalida, bool sellar, String rutaCert, String rutaKey, String contrasena, String rutaXsltCadenaOriginal) { decimal subtotal = 0; decimal impuestosTrasladados = 0; decimal impuestosRetenidos = 0; foreach (ComprobanteConcepto concepto in conceptosField) { subtotal += concepto.Importe; foreach (ComprobanteConceptoImpuestosTraslado i in concepto.Impuestos.Traslados) { impuestosTrasladados += i.Importe; } if (concepto.Impuestos.Retenciones != null) { foreach (ComprobanteConceptoImpuestosRetencion i in concepto.Impuestos.Retenciones) { impuestosRetenidos += i.Importe; } } } ComprobanteImpuestosTraslado cImpuestoIVA = new ComprobanteImpuestosTraslado(); cImpuestoIVA.Importe = impuestosTrasladados; cImpuestoIVA.TasaOCuota = Conceptos[0].Impuestos.Traslados[0].TasaOCuota; cImpuestoIVA.Impuesto = Conceptos[0].Impuestos.Traslados[0].Impuesto; decimal impuestosLocales = 0; //Impuestos locales, ISH foreach (ImpuestosLocalesTrasladosLocales l in ImpuestosLocalesTraslados) { impuestosLocales += l.Importe; } this.SubTotal = subtotal; this.Total = subtotal + impuestosTrasladados - this.Descuento + impuestosLocales; this.Impuestos = new ComprobanteImpuestos() { TotalImpuestosRetenidos = impuestosRetenidos, TotalImpuestosRetenidosSpecified = true, TotalImpuestosTrasladados = impuestosTrasladados, TotalImpuestosTrasladadosSpecified = true, Traslados = new ComprobanteImpuestosTraslado[] { cImpuestoIVA } }; if (sellar) { if (ImpuestosLocalesTraslados.Count > 0) { ProcesarImpuestosLocales(rutaSalida); } else { SerializarObjeto(rutaSalida); } CfdiResult r = SellarXml(rutaCert, rutaKey, contrasena, rutaSalida); if (!r.Correcto) { return(r); } } else { SerializarObjeto(rutaSalida); } if (sellar) { ValidarXML(rutaSalida); } return(new CfdiResult()); }
public CfdiResult SellarXml(String rutaCert, String rutaKey, String contrasena, String rutaArchivoXmlOrigen) { CfdiResult result = AgregarCertificado(rutaCert); if (!result.Correcto) { return(result); } PrivateKey privKey = new PrivateKey(); XDocument xDoc = XDocument.Load(rutaArchivoXmlOrigen); xDoc.Root.SetAttributeValue("Certificado", this.Certificado); xDoc.Root.SetAttributeValue("NoCertificado", this.NoCertificado); xDoc.Save(rutaArchivoXmlOrigen); String cadenaOriginal = GetCadenaOriginal(this.RutaXSLTCadenaOriginal, rutaArchivoXmlOrigen); if (!privKey.LoadPkcs8EncryptedFile(rutaKey, contrasena)) { return(new CfdiResult(false, privKey.LastErrorText)); } String privKeyXml = privKey.GetXml(); Rsa rsa = new Rsa(); String hashAlg = "SHA-256"; if (!rsa.UnlockComponent("RSAT34MB34N_7F1CD986683M")) { return(new CfdiResult(false, rsa.LastErrorText)); } if (!rsa.ImportPrivateKey(privKeyXml)) { return(new CfdiResult(false, rsa.LastErrorText)); } rsa.Charset = "UTF-8"; rsa.EncodingMode = "base64"; rsa.LittleEndian = false; Cert cert = new Cert(); if (!cert.LoadFromFile(rutaCert)) { return(new CfdiResult(false, cert.LastErrorText)); } String selloBase64 = rsa.SignStringENC(cadenaOriginal, hashAlg); PublicKey publicKey = cert.ExportPublicKey(); Rsa rsa2 = new Rsa(); if (!rsa2.ImportPublicKey(publicKey.GetXml())) { return(new CfdiResult(false, rsa2.LastErrorText)); } rsa2.Charset = "utf-8"; rsa2.EncodingMode = "base64"; rsa2.LittleEndian = false; if (!rsa2.VerifyStringENC(cadenaOriginal, hashAlg, selloBase64)) { return(new CfdiResult(false, rsa2.LastErrorText)); } cert.Dispose(); privKey.Dispose(); publicKey.Dispose(); this.Sello = selloBase64; xDoc.Root.SetAttributeValue("Sello", selloBase64); //String xml = xDoc.ToString(); //File.WriteAllText(rutaArchivoXmlOrigen, xml); xDoc.Save(rutaArchivoXmlOrigen); //SerializarObjeto(rutaArchivoXmlOrigen); return(new CfdiResult()); }