Beispiel #1
0
        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());
        }
Beispiel #2
0
        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());
        }