Ver Mensaje Individual
  #95 (permalink)  
Antiguo 21/12/2010, 12:38
mrcs_jvc
 
Fecha de Ingreso: diciembre-2010
Mensajes: 2
Antigüedad: 13 años, 7 meses
Puntos: 0
Respuesta: Facturas Digitales SAT - Mexico C#

Hola, solo para agradecer a todos y de paso postear mis resultados. No se como este esto, pero ahi va mi solucion que me genera un sello valido:

Código C#:
Ver original
  1. public static void Prueba()
  2. {
  3.     Comprobante cfd = new Comprobante();
  4.     // ...
  5.     // Llenar datos del comprobante.
  6.     // ...
  7.  
  8.     cfd.Emisor = new ComprobanteEmisor();
  9.     // ...
  10.     // Llenar datos del emisor.
  11.     // ...
  12.  
  13.     cfd.Emisor.DomicilioFiscal = new t_UbicacionFiscal();
  14.     // ...
  15.     // Llenar datos del domicilio fiscal.
  16.     // ...
  17.  
  18.     cfd.Receptor = new ComprobanteReceptor();
  19.     // ...
  20.     // Llenar datos del receptor.
  21.     // ...
  22.  
  23.     cfd.Receptor.Domicilio = new t_Ubicacion();
  24.     // ...
  25.     // Llenar datos del domicilio.
  26.     // ...
  27.  
  28.     cfd.Conceptos = new ComprobanteConcepto[n];
  29.     cfd.Conceptos[i] = new ComprobanteConcepto();
  30.     // ...
  31.     // Llenar datos de cada concepto.
  32.     // ...
  33.  
  34.     cfd.Impuestos = new ComprobanteImpuestos();
  35.     // ...
  36.     // Llenar datos de impuestos.
  37.     // ...
  38.  
  39.     // Obtener la cadena original.
  40.     string co = GenerarCadenaOriginal(cfd);
  41.  
  42.     // DIGESTION MD5 <- Ignoro para que sirva, pero como se ve, Copy / Paste de uno de los posts.
  43.     MD5 md5 = new MD5CryptoServiceProvider();
  44.     byte[] data = md5.ComputeHash(UTF8Encoding.UTF8.GetBytes(co));
  45.     StringBuilder sBuilder = new StringBuilder();
  46.     for (int i = 0; i <= data.Length - 1; i++)
  47.     {
  48.         sBuilder.Append(data[i].ToString("x2"));
  49.     }
  50.     string cadmd5 = sBuilder.ToString();
  51.  
  52.     // Obtener el archivo *.p12 como se menciono en algun post.
  53.     X509C.X509Certificate2 _MiCertificado = new X509C.X509Certificate2(@"x:\micert.p12", "mipass");
  54.     RSACryptoServiceProvider RSA = (RSACryptoServiceProvider)_MiCertificado.PrivateKey;
  55.     MD5CryptoServiceProvider hasher = new MD5CryptoServiceProvider();
  56.     byte[] bytesFirmados = RSA.SignData(System.Text.Encoding.UTF8.GetBytes(co), hasher);
  57.     string sello = Convert.ToBase64String(bytesFirmados);
  58.  
  59.     // Agregamos el sello.
  60.     cfd.sello = sello;
  61.  
  62.     // ...
  63.     // De igual manera, conseguir el numero de certificado.
  64.     // ...
  65.  
  66.     // Generar el comprobante fiscal digital
  67.     GenerarCfd(cfd, @"x:\cfd.xml");
  68. }
  69.  
  70. /// <summary>
  71. /// Genera la cadena original a partir
  72. /// </summary>
  73. /// <param name="cfd">Instancia de la clase Comprobante con la informacion del Comprobante Fiscal Digital.</param>
  74. /// <returns>Un valor de tipo string con el valor de la cadena original.</returns>
  75. public static string GenerarCadenaOriginal(Comprobante cfd)
  76. {
  77.     XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces();
  78.     xmlNameSpace.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
  79.  
  80.     MemoryStream xmlCadenaOriginal = new MemoryStream();
  81.     XmlTextWriter xmlTextWriter = new XmlTextWriter(xmlCadenaOriginal, Encoding.UTF8);
  82.  
  83.     xmlTextWriter.Formatting = Formatting.Indented;
  84.     XmlSerializer xs = new XmlSerializer(typeof(Comprobante));
  85.  
  86.     xs.Serialize(xmlTextWriter, cfd, xmlNameSpace);
  87.  
  88.     xmlCadenaOriginal.Position = 0;
  89.  
  90.     XPathDocument xpathdoc = new XPathDocument(xmlCadenaOriginal);
  91.     XslTransform xsltrans = new XslTransform();
  92.     xsltrans.Load("E:\\cadenaoriginal_2_0.xslt");
  93.  
  94.     MemoryStream strCadenaOriginal = new MemoryStream();
  95.     XmlTextWriter writer = new XmlTextWriter(strCadenaOriginal, null);
  96.     xsltrans.Transform(xpathdoc, null, writer);
  97.  
  98.     strCadenaOriginal.Position = 0;
  99.     StreamReader sr = new StreamReader(strCadenaOriginal);
  100.     string cadenaOriginal = sr.ReadToEnd();
  101.     sr.Close();
  102.     sr.Dispose();
  103.     sr = null;
  104.  
  105.     writer.Close();
  106.     writer = null;
  107.  
  108.     xmlTextWriter.Close();
  109.     xmlTextWriter = null;
  110.  
  111.     xmlCadenaOriginal.Close();
  112.     xmlCadenaOriginal.Dispose();
  113.     xmlCadenaOriginal = null;
  114.  
  115.     return cadenaOriginal;
  116. }
  117.  
  118. /// <summary>
  119. /// Genera el Comprobante Fiscal Digital.
  120. /// </summary>
  121. /// <param name="cfd">Instancia de la clase Comprobante con la informacion del Comprobante Fiscal Digital.</param>
  122. /// <param name="archivo">Ubicacion del archivo a generar.</param>
  123. public static void GenerarCfd(Comprobante cfd, String archivo)
  124. {
  125.     XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces();
  126.     xmlNameSpace.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
  127.  
  128.     XmlTextWriter xmlTextWriter = new XmlTextWriter(archivo, Encoding.UTF8);
  129.  
  130.     xmlTextWriter.Formatting = Formatting.Indented;
  131.     XmlSerializer xs = new XmlSerializer(typeof(Comprobante));
  132.     xs.Serialize(xmlTextWriter, cfd, xmlNameSpace);
  133.     xmlTextWriter.Close();
  134.     xmlTextWriter = null;
  135. }

[URL="http://www.forosdelweb.com/f78/facturas-digitales-sat-mexico-c-803607/index3.html#post3573197"]Aqui esta el post en el que el usuario J_L_A menciona como generar las clases a partir del archivo [B]cfdv2.xsd[/B][/URL]

Gracias a todos.

Última edición por mrcs_jvc; 21/12/2010 a las 12:43 Razón: Update