Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   ASPX (.net) (http://www.forosdelweb.com/f78/)
-   -   Facturas Digitales SAT - Mexico C# (http://www.forosdelweb.com/f78/facturas-digitales-sat-mexico-c-803607/)

javalos532 19/08/2010 21:42

Respuesta: Facturas Digitales SAT - Mexico C#
 
Muchas gracias polacp86, reviso esta pagina y cualquier resultado lo notifico... todavia no tengo la parte del xml pero si termino la parte del sellado me dedicare al 100% de hacer lo del XML y te ayudo en esta parte.

javalos532 21/08/2010 10:15

Respuesta: Facturas Digitales SAT - Mexico C#
 
Que tal polacp86, implemente la funcion para sellar que indican en la pagina y que son tal cual los pasos que indicas y no llego al mismo sello que con OpenSSL... que me podra faltar ? incluso ya valide y el MD5 y este valor si me da igual pero al momento de obtener el sello no coinciden..

Gracias.

polacp86 24/08/2010 16:55

Respuesta: Facturas Digitales SAT - Mexico C#
 
Hola javalos, que raro que no sale el mismo resultado, revisaste el codigo que viene hasta el final de la pagina?????????? ese fue el que utilice.

MarkX 25/08/2010 12:40

Respuesta: Facturas Digitales SAT - Mexico C#
 
Hola a TODOS
les comento que finalmente logre obtener un sello digital verificado por el validador del SAT con lo siguiente:

Dim objCert As New X509Certificates.X509Certificate2("archivo.p12", "b0123456789")
Dim lRSA As RSACryptoServiceProvider = objCert.PrivateKey
Dim lhasher As New MD5CryptoServiceProvider()
Dim bytesFirmados As Byte() = lRSA.SignData(System.Text.Encoding.UTF8.GetBytes(p CadenaOriginal), lhasher)
Return Convert.ToBase64String(bytesFirmados)

El problema es que no he podido hacerlo 100% NET debido a que no he encontrado la forma de generar el archivo con formato p12 directamente desde .NET sin utilizar el openssl.

Alguien tiene una idea de como combinar los archivos .key y .cer en uno solo con formato p12 (o bien pfx) SIN UTILIZAR openSSL??


Gracias de Antemano y Saludos

javalos532 25/08/2010 21:04

Respuesta: Facturas Digitales SAT - Mexico C#
 
Hola a todos, alguien ya tiene este codigo en C#.... con VB me sale perfecto el sello pero en C# no me da igual ...ese es el codigo que estoy utilizando...

X509Certificate2 _MiCertificado = new X509Certificate2(@"....cert.p12", "12345");
RSACryptoServiceProvider RSA = (RSACryptoServiceProvider)_MiCertificado.PrivateKe y;
MD5 hasher = MD5CryptoServiceProvider.Create();
byte[] bytesFirmados = RSA.SignData(System.Text.Encoding.UTF8.GetBytes(pD ato), hasher);
return Convert.ToBase64String(bytesFirmados);

Gracias.

javalos532 25/08/2010 21:15

Respuesta: Facturas Digitales SAT - Mexico C#
 
Ya encontre la solucion...
El problema era que no estaba mandando la cadena original, el codigo funciona perfectamente...

MarkX 31/08/2010 09:58

Respuesta: Facturas Digitales SAT - Mexico C#
 
Chequen la info de esta pagina,
http://www.jensign.com/opensslkey/index.html
de ahi pueden sacar lo necesario para leer la llave privada de el archivo .key directamente desde C# y generar el RSACryptoServiceProvider

Suerte

HugoLuna 02/09/2010 12:29

Respuesta: Facturas Digitales SAT - Mexico C#
 
Saludos, hasta hace unos dias lograba enviar satisfactoriamente los certificados en al validador del SAT, a partir del fin de semana pasado me empezo a validar campos que antes no hacia, como que el numero exterior y la localidad iban nullas, despues de buscarle encontre que habian nuevos certificados de pruebas los baje pero me marca error de que el sello no es valido.

Saben ustedes algo de esto?, si ha cambiado algo en validaciones?.

Saludos.

Hugo Luna

hegaes 06/09/2010 11:19

Respuesta: Facturas Digitales SAT - Mexico C#
 
Solo quiero agradecer a todas las personas que han participado y aportado sus conocimientos en este foro, he leido y seguido sus recomendaciones y funcionan a la perfección, ya he podido validar en la pagina del SAT. Mil gracias!!!

Baskes 08/09/2010 09:37

Respuesta: Facturas Digitales SAT - Mexico C#
 
Cita:

Iniciado por javalos532 (Mensaje 3393653)
Pongo el codigo de los pasos en el que no me da la digetion correcta que el SAT indica.

// Introducimos la cadena original provista por el SAT
string Strcadenaoriginal = "||A|1|2005-09-02T16:30:00|1|ISP900909Q88|Industrias del Sur Poniente, S.A. de C.V.|Alvaro Obregón|37|3|Col. Roma Norte|México|Cuauhtémoc|Distrito Federal|México|06700|Pino Suarez|23|Centro|Monterrey|Monterrey|Nuevo Léon|México|95460|CAUR390312S87|Rosa María Calderón Uriegas|Topochico|52|Jardines del Valle|Monterrey|Monterrey|Nuevo León|México|95465|10|Caja|Vasos decorados|20|200|1|pieza|Charola metálica|150|150|IVA|52.5||";

// Metemos la cadena a un archivo de texto
System.IO.File.WriteAllText(@"D:\SAT\Files\Out\Fil eOriginal.txt", strcadenaoriginal);

// Transformamos la cadena a UTF8
string contenido;
using (StreamReader sr = new StreamReader(@"D:\SAT\Files\Out\FileOriginal.txt",
Encoding.GetEncoding(1252)))
{
contenido = sr.ReadToEnd();
}
using (StreamWriter sw = new StreamWriter(@"D:\SAT\Files\Out\UTF8.txt", false, Encoding.UTF8))
{
sw.Write(contenido);
}

//Aquí lo que hacemos es escribir un txt (MD5.txt) con la digestión MD5 para usarlo en el sellado
Strcadena = ObtenerMd5(@"D:\SAT\Files\Out\UTF8.txt");


Para la digestion en MD5 utilizo la siguiente instruccion con OpenSSL
D:\OpenSSL\bin\openssl.exe dgst -MD5 D:\SAT\Files\Out\UTF8.txt > D:\SAT\Files\Out\MD5.txt


Pero aqui no llego al resultado del SAT.... a mi me da la siguiente cadena:
ce33abebf7f795780806c97d0e6e2c03 y debe ser:
8aa2b617944427353697e694a2e35a07

Alguna idea de que me puede estar faltando ?

Gracias.

No se ya resolviste tu problema, pero con este código, me da correcto.
Código:

            MD5 md5Hasher = new MD5CryptoServiceProvider();
            byte[] data = md5Hasher.ComputeHash(UTF8Encoding.UTF8.GetBytes(input));
            StringBuilder sBuilder = new StringBuilder();
            for (int i = 0; i <= data.Length - 1; i++)
            {
                sBuilder.Append(data[i].ToString("x2"));
            }           
            return sBuilder.ToString();

Pero en el caso de la cadena que esta de ejemplo en la página del Sat en este momento, no me funciona.

Ejemplo de Cadena Original:

||2.0|ABCD|2|03-05-2010T14:11:36|49|2008|INGRESO|UNA SOLA EXHIBICIÓN|
2000.00|00.00|2320.00|PAMC660606ER9|CONTRIBUYENTE PRUEBASEIS PATERNOSEIS
MATERNOSEIS|PRUEBA SEIS|6|6|PUEBLA CENTRO|PUEBLA|PUEBLA|PUEBLA||MÉXICO|
72000|CAUR390312S87|ROSA MARÍA CÁLDERON URIEGAS|TOPOCHICO|52|
JARDINES DEL VALLE|NUEVO LEÓN|MEXICO|95465|1.00|SERVICIO|01|
ASESORIA FISCAL Y ADMINISTRATIVA|2000.00|IVA|16.00|320.00||

Resultado de la digestión MD5 como HEX:

03abe73de4ca428816de4af6f6f737a7

Ami me da como resultado:
b64df6b8cbd7031c53ba5a1fe6ae4ab5

¿Alguna idea?

Ivan_A_R 14/09/2010 15:11

Respuesta: Facturas Digitales SAT - Mexico C#
 
Cita:

Iniciado por javalos532 (Mensaje 3533221)
Hola a todos, alguien ya tiene este codigo en C#.... con VB me sale perfecto el sello pero en C# no me da igual ...ese es el codigo que estoy utilizando...

X509Certificate2 _MiCertificado = new X509Certificate2(@"....cert.p12", "12345");
RSACryptoServiceProvider RSA = (RSACryptoServiceProvider)_MiCertificado.PrivateKe y;
MD5 hasher = MD5CryptoServiceProvider.Create();
byte[] bytesFirmados = RSA.SignData(System.Text.Encoding.UTF8.GetBytes(pD ato), hasher);
return Convert.ToBase64String(bytesFirmados);

Gracias.

Disculpa Javalo, en pDato que estas mandando? La cadena original en forma de string?

javalos532 15/09/2010 10:37

Respuesta: Facturas Digitales SAT - Mexico C#
 
Asi es Ivan, ahi tienes que colocar la cadena Original como string.

Saludos.

Baskes 20/09/2010 09:55

Respuesta: Facturas Digitales SAT - Mexico C#
 
Cita:

Iniciado por F_tanori (Mensaje 3483422)
El procedimiento es correcto aparentemente el problema es que no pasa la validacion, como comentabamos en el otro foro (solocodigo) , el proceso es el indicado por SAT, segun la imagen (Extraida de una presentacion de power point de ellos mismos (SAT)). hemos usado el mismo hash md5 que da el validador del SAT, pero el sello no es igual, hice la prueba con FIRMASAT y el sello si pasa la validacion :neurotico

¿Y como validar si el sello es correcto para el SAT?

Yo sigo todo el procedimiento y al validar el sello digital, me indica que no es valido. Compare mi cadena original con la que me da el SAT y es la misma, así como hash de MD5. ¿Como saber si mi sello digital es correcto?

Este es el código que uso para generar el sello digital:
Código:

System.Diagnostics.Process proc = new System.Diagnostics.Process();
                proc.EnableRaisingEvents = true;
                proc.StartInfo.UseShellExecute = false;
                proc.StartInfo.CreateNoWindow = true;
                proc.StartInfo.RedirectStandardOutput = true;
                proc.StartInfo.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory; // Application.StartupPath;
                proc.StartInfo.FileName = "openssl.exe";
               
                proc.StartInfo.Arguments = "pkcs8 -inform DER -in aaa010101aaa_csd_01.key -passin pass:a0123456789 -out PrivateKEY.PEM ";
                proc.Start();
                proc.WaitForExit();
                ////Extraer la Llave Publica del Certificado
                proc.StartInfo.FileName = "openssl.exe";
                proc.StartInfo.Arguments = "x509 -inform DER -outform PEM -in aaa010101aaa_CSD_01.cer -pubkey -out PublicKEY.PEM";
               
                proc.Start();
                proc.WaitForExit();
                ////Firmar Hash Md5 con la llave privada
                proc.StartInfo.FileName = "openssl.exe ";
                proc.StartInfo.Arguments = string.Concat("dgst -out Firma.binario -sign PrivateKEY.PEM ", CrearHash(md5));
               
                proc.Start();
                proc.WaitForExit();
                proc.StartInfo.FileName = "openssl.exe ";
                proc.StartInfo.Arguments = "enc -in Firma.binario -a -A -out Firma.base64";
                proc.Start();
                proc.WaitForExit();


BenuR 20/09/2010 17:10

Respuesta: Facturas Digitales SAT - Mexico C#
 
Cita:

Iniciado por javalos532 (Mensaje 3525739)
Solucionado.... el problema fue que debo utilizar los .pem y nos el .cer y .key.

Gracias.

de dónde obtuviste los .pem?... me arroja el mismo error que a tí utilizando los .cer y .key

BenuR 20/09/2010 17:16

Respuesta: Facturas Digitales SAT - Mexico C#
 
Cita:

Iniciado por polacp86 (Mensaje 3525417)
P.D. Alguien que tenga ejemplos de como generar los comprobantes en xml !!!!!!!!!!!!!!!!!!!!!!!

Yo comencé por realizar los XML, todavía no genero los sellos ni nada de eso, pero mira el código para escribir es mas o menos así:

Código:

            string xmlns = "http://www.sat.gob.mx/cfd/2";
            StreamWriter writer;
            XmlTextWriter xmlWriter;
           
                //Crear archivo XML
                writer = File.CreateText(_xmlPath);
                writer.Close();

                //Preparar archivo
                xmlWriter = new XmlTextWriter(_xmlPath, System.Text.Encoding.UTF8);
                xmlWriter.Formatting = Formatting.Indented;
                xmlWriter.WriteStartDocument();
               
                //Insertar elementos
                xmlWriter.WriteStartElement("Comprobante");
                xmlWriter.WriteAttributeString("xmlns", "xsi", null, "http://www.w3.org/2001/XMLSchema-instance");
                xmlWriter.WriteAttributeString("xmlns", xmlns);
                xmlWriter.WriteAttributeString("xsi", "schemaLocation", null, xmlns + " http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd");
               
                xmlWriter.WriteStartElement("Emisor");
                xmlWriter.WriteStartElement("DomicilioFiscal");
                xmlWriter.WriteEndElement();
                xmlWriter.WriteEndElement();

                xmlWriter.WriteStartElement("Receptor");
                xmlWriter.WriteStartElement("Domicilio");
                xmlWriter.WriteEndElement();
                xmlWriter.WriteEndElement();

                xmlWriter.WriteStartElement("Conceptos");
                xmlWriter.WriteEndElement();

                xmlWriter.WriteStartElement("Impuestos");
                xmlWriter.WriteStartElement("Traslados");
                xmlWriter.WriteEndElement();
                xmlWriter.WriteEndElement();
               
                xmlWriter.WriteEndElement();
               
                //Cerrar
                xmlWriter.Close();

_xmlPath es la ubicación donde se guardará el archivo y necesitarás las librerías "System.XML" y "System.IO".

así ya tendrás la estructura general del documento (nodos) y sólo te faltará llenarlo (atributos y propiedades)...

ssjantonio 21/09/2010 16:34

Respuesta: Facturas Digitales SAT - Mexico C#
 
A principios de año escribi un Wrapper En C++\CLI de OpenSSL para convertir el .CER y .KEY a PEM, y funciones para firmar, abandone el proyecto y haciendo pruebas me encontre con varios memory leaks asi que el dia de hoy me habia dado a la tarea de hacer lo mismo con Bouncy (aunque la otra libreria este funcionando correctamente), ya tengo el método para convertir los archivos .cer a PEM, sin embargo no he logrado convertir el .key a PEM, alguien lo ha logrado?

Aquí esta el método para convertir los .CER a PEM usando Bouncy Castle:

public void DERToPEM(string sFileFrom, string sFileTo)
{
using(System.IO.Stream sr = System.IO.File.OpenRead(sFileFrom))
{
Org.BouncyCastle.X509.X509CertificateParser cp = new X509CertificateParser();
var cert = cp.ReadCertificate(sr);

var pKey = cert.GetPublicKey();

using(System.IO.TextWriter tw = new System.IO.StreamWriter(sFileTo))
{
PemWriter pw = new PemWriter(tw);
pw.WriteObject(pKey);
pw.WriteObject(cert);
tw.Close();
}
}
}

Si a alguien le interesa la librería en C++\CLI para que haga pruebas y corregir los memory leaks puedo enviárselos a su correo.

winexim 22/09/2010 23:43

Respuesta: Facturas Digitales SAT - Mexico C#
 
Publicado hoy Jueves 23 en el diario oficial de la federacion

DOF: 23/09/2010
ANEXO 20 de la Primera Resolución de Modificaciones a la Resolución Miscelánea Fiscal para 2010, publicada el 14 de septiembre de 2010.
Al margen un sello con el Escudo Nacional, que dice: Estados Unidos Mexicanos.- Secretaría de Hacienda y Crédito Público.
Modificación al Anexo 20 de la Resolución Miscelánea Fiscal para 2010

Este es el link



http://www.dof.gob.mx/nota_detalle.p...cha=23/09/2010


Contenido

Medios electrónicos

I. Del Comprobante Fiscal Digital:
A. Características técnicas del archivo que contenga el informe mensual de comprobantes fiscales digitales emitidos
B. Estándar de comprobante fiscal digital
C. Generación de sellos digitales para comprobantes fiscales digitales
II. Del Comprobante Fiscal Digital por Internet:
A. Estándar de comprobante fiscal digital por internet
B. Generación de sellos digitales para comprobantes fiscales digitales por internet
C. Estándar y uso del complemento obligatorio: Timbre Fiscal Digital del SAT
D. Estándar del servicio de cancelación
E. Especificación técnica del código de barras bidimensional
III. De los distintos medios de comprobación digital:
A. Estándares y especificaciones técnicas que deberán cumplir las aplicaciones informáticas para la generación de claves de criptografía asimétrica a utilizar para Firma Electrónica Avanzada
B. Uso de la facilidad de nodos opcionales <Complemento> y <ComplementoConcepto>
C. Uso de la facilidad de ensobretado <Addenda>

J_L_A 26/09/2010 06:49

Respuesta: Facturas Digitales SAT - Mexico C#
 
Buen dia a todos los visitantes del foro. Les doy otra liga para ver la última versión de "Anexo 20 de la Primera Resolución de Modificaciones a la Resolución Miscelánea Fiscal para 2010, publicada el 14 de septiembre de 2010." en formato doc.

http://www.sat.gob.mx/sitio_internet/informacion_fiscal/legislacion/52_18801.html

A primera vista hay un cambio importante para quienes están en la etapa de generar el sello digital, ahora en lugar de utilizar digestión MD5, el SAT pide que se utilice SHA-1. Aun falta saber cuando entrarán en operación los nuevos cambios pero conviene estar enterados.

A la orden si es que les puedo ayudar en algo. Estoy usando c sharp con openssl y ya logré pasar todas casi todas las etapas (obviamente exceptuando las últimas novedades). Estoy en la parte de los complementos y addendas aunque creo que no me van a ser necesarias.

Saludos!

J_L_A 26/09/2010 07:59

Respuesta: Facturas Digitales SAT - Mexico C#
 
BenuR, hay una manera más fácil para generar el xml.

-Convertir cfdv2.xsd (está en la página del SAT) a clase de c# desde la linea de comandos ms-dos:
Código:

%:\>xsd cfdv2.xsd /c
(Devuelve cfdv2.cs)
-Integrarlo al proyecto como módulo de clase, por ejemplo con el nombre Comprobante.cs

-Ahora se declara una variable de tipo Comprobante
Código:

Comprobante comprobante = new Comprobante();
-Se le asignan valores:
Código:

comprobante.version = "2.0";
comprobante.serie = "ABCD";
.
.
.

... y así con cada clase (emisor, receptor, conceptos, impuestos, etc.) del módulo Comprobante.cs:
Código:

ComprobanteEmisor comprobanteEmisor = new ComprobanteEmisor();

comprobanteEmisor.nombre = "Juan Pérez";
comprobanteEmisor.rfc = "ABCD0102039Z0";
.
.
.

-Después se genera el xml con:
Código:

using System.xml;
using System.Xml.Serialization;
using System.Text.Encoding;

XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces();
xmlNameSpace.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
XmlTextWriter xmlTextWriter = new XmlTextWriter(RutaConNombreArchivoSinExtension + ".xml", Encoding.UTF8);
xmlTextWriter.Formatting = Formatting.Indented;
XmlSerializer xs = new XmlSerializer(typeof(Comprobante));

xs.Serialize(xmlTextWriter, comprobante, xmlNameSpace);
xmlTextWriter.Close();

Será necesario generar el xml dos veces: la segunda para insertarle el sello digital. Si quieren mas adelante los digo como se hace.

Espero sirva. A la orden para dudas, correcciones u objeciones.

Saludos!

J_L_A 26/09/2010 08:09

Respuesta: Facturas Digitales SAT - Mexico C#
 
Me faltó decir:

Buscar el xml en la ruta que pusieron en "RutaConNombreArchivoSinExtension"

Nos1 28/09/2010 17:42

Respuesta: Facturas Digitales SAT - Mexico C#
 
Muchas Gracias JLA,
Pudieras mostrar el codigo que va despues? (para insertarle el sello digital, etc)

ah, y otra pregunta, en este caso como manejas las adendas especiales de las empresas que asi lo requieren (soriana, etc)?
Gracias de antemano.
Nos1

Nos1 28/09/2010 17:52

Respuesta: Facturas Digitales SAT - Mexico C#
 
ah, y otra pregunta, como manejas las adendas especiales de las empresas que asi lo requieren (soriana, etc)?
Gracias.
Nos1

J_L_A 29/09/2010 17:26

Respuesta: Facturas Digitales SAT - Mexico C#
 
Cita:

Iniciado por Nos1 (Mensaje 3576804)
Muchas Gracias JLA,
Pudieras mostrar el codigo que va despues? (para insertarle el sello digital, etc)

ah, y otra pregunta, en este caso como manejas las adendas especiales de las empresas que asi lo requieren (soriana, etc)?
Gracias de antemano.
Nos1

Que tal NOS1:
Ya tienes generado el sello digital y está listo para insertarlo? Por favor concrétame mas tu pregunta para que te pueda ayudar, por ejemplo no se a que te refieres con el "etc".

En cuanto a las addendas, comentaba mas arriba que apenas estoy llegando ahi y en ese punto aun no puedo aportar, lo siento. Pero quizá haya alguien en el foro que nos pueda echar una mano.

Saludos a todos!

Nos1 30/09/2010 14:26

Respuesta: Facturas Digitales SAT - Mexico C#
 
Cita:

Iniciado por J_L_A (Mensaje 3578255)
Que tal NOS1:
Ya tienes generado el sello digital y está listo para insertarlo? Por favor concrétame mas tu pregunta para que te pueda ayudar, por ejemplo no se a que te refieres con el "etc".

En cuanto a las addendas, comentaba mas arriba que apenas estoy llegando ahi y en ese punto aun no puedo aportar, lo siento. Pero quizá haya alguien en el foro que nos pueda echar una mano.

Saludos a todos!

Hola,
Perdón, era una tontería por la cual no se me generaba el sello digital (puse una contraseña de prueba). Aun me falta corroborar que el sello sea el correcto (se que hay una pagina de la sat para verificar eso, tengo que investigar).

En cuanto a la addenda, si, me refiero a las grandes cadenas que exigen cosas en particular ahi, dado que yo seguí el camino de 100% .net que amablemente otros foreros aportarton (no usar comandos), yo tambien estaré viendo como hacer esto de la addenda.
Todo empieza con un ComprobanteAddenda ca = new ComprobanteAddenda(); al parecer, sin embargo, por lo complejas que son las addendas, a mi se me haría mas comodo un parser (algo para simplemente ir concatenando strings) en lugar de usar nodos y elementos, etc. Sin embargo no se si eso sea lo mas apropiado una vez que el resto del XML lo generé con la clase "opensslkey.cs". Tampoco sé de antemano como incluir el parser ahí.
Cualquier recomendación o expericia tuya o de cualquier forero es gratamente bienvenida.
Saludos.

ecastilloc 14/10/2010 13:13

Respuesta: Facturas Digitales SAT - Mexico C#
 
Cita:

Iniciado por J_L_A (Mensaje 3573197)
BenuR, hay una manera más fácil para generar el xml.

-Convertir cfdv2.xsd (está en la página del SAT) a clase de c# desde la linea de comandos ms-dos:
Código:

%:\>xsd cfdv2.xsd /c
(Devuelve cfdv2.cs)
-Integrarlo al proyecto como módulo de clase, por ejemplo con el nombre Comprobante.cs

-Ahora se declara una variable de tipo Comprobante
Código:

Comprobante comprobante = new Comprobante();
-Se le asignan valores:
Código:

comprobante.version = "2.0";
comprobante.serie = "ABCD";
.
.
.

... y así con cada clase (emisor, receptor, conceptos, impuestos, etc.) del módulo Comprobante.cs:
Código:

ComprobanteEmisor comprobanteEmisor = new ComprobanteEmisor();

comprobanteEmisor.nombre = "Juan Pérez";
comprobanteEmisor.rfc = "ABCD0102039Z0";
.
.
.

-Después se genera el xml con:
Código:

using System.xml;
using System.Xml.Serialization;
using System.Text.Encoding;

XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces();
xmlNameSpace.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
XmlTextWriter xmlTextWriter = new XmlTextWriter(RutaConNombreArchivoSinExtension + ".xml", Encoding.UTF8);
xmlTextWriter.Formatting = Formatting.Indented;
XmlSerializer xs = new XmlSerializer(typeof(Comprobante));

xs.Serialize(xmlTextWriter, comprobante, xmlNameSpace);
xmlTextWriter.Close();

Será necesario generar el xml dos veces: la segunda para insertarle el sello digital. Si quieren mas adelante los digo como se hace.

Espero sirva. A la orden para dudas, correcciones u objeciones.

Saludos!

Hola Qué tal a todos, muchas gracias por las contribuciones de todos. Quisiera despejar una duda en cuanto a la construcción del XML, ya que me atoré en la parte de conceptos, tengo el siguiente código, el cual funciona a la perfección hasta la parte de conceptos que es donde me manda el sig mensaje: "Referencia a objeto no establecida como instancia de un objeto". '¿¿Alguien me podría decir por que pasa esto??, ¿Necesito un constructor??

private void crearCFD_Click(object sender, EventArgs e)
{

Comprobante comprobante = new Comprobante();
ComprobanteEmisor comprobanteEmisor = new ComprobanteEmisor();
t_UbicacionFiscal ubicacionEmisor = new t_UbicacionFiscal();
ComprobanteReceptor comprobanteReceptor = new ComprobanteReceptor();
t_Ubicacion ubicacionReceptor = new t_Ubicacion();
ComprobanteConcepto[] comprobanteConcepto = new ComprobanteConcepto[10];


comprobante.version = "2.0";
comprobante.serie = "ABCD";
comprobante.folio = "12345";
comprobante.fecha = Convert.ToDateTime("2010-05-03T14:11:36");
comprobante.noCertificado = "20001000000100000377";
comprobante.subTotal = 2000.00M;
comprobante.total = 2320.00M;
comprobante.noAprobacion = "49";
comprobante.anoAprobacion = "2010";
comprobante.formaDePago = "PAGO EN UNA SOLA EXHIBICIÓN";
comprobante.descuento = 0.00M;
comprobante.metodoDePago = "EFECTIVO";



comprobanteEmisor.nombre = "CONTRIBUYENTE PRUEBASEIS PATERNOSEIS MATERNOSEIS";
comprobanteEmisor.rfc = "PAMC660606ER9";

ubicacionEmisor.calle = "PRUEBA SEIS";
ubicacionEmisor.noExterior = "6";
ubicacionEmisor.noInterior = "6";
ubicacionEmisor.colonia = "PUEBLA CENTRO";
ubicacionEmisor.localidad = "PUEBLA";
ubicacionEmisor.municipio = "PUEBLA";
ubicacionEmisor.estado = "PUEBLA";
ubicacionEmisor.pais = "MÉXICO";
ubicacionEmisor.codigoPostal = "72000";

comprobanteReceptor.nombre = "ROSA MARÍA CALDERÓN UIRIEGAS";
comprobanteReceptor.rfc = "CAUR390312S87";
ubicacionReceptor.calle = "TOPOCHICO";
ubicacionReceptor.noExterior = "52";
ubicacionReceptor.colonia = "JARDINES DEL VALLE";
ubicacionReceptor.estado = "NUEVO LEON";
ubicacionReceptor.pais = "México";
ubicacionReceptor.codigoPostal = "95465";


comprobanteConcepto[0].unidad = "Servicio";
comprobanteConcepto[0].noIdentificacion = "01";
comprobanteConcepto[0].descripcion = "Asesoria Fiscal y administrativa";
comprobanteConcepto[0].valorUnitario = 2000.00M;
comprobanteConcepto[0].importe = 2000.00M;


comprobanteEmisor.DomicilioFiscal = ubicacionEmisor;
comprobante.Emisor = comprobanteEmisor;
comprobanteReceptor.Domicilio = ubicacionReceptor;
comprobante.Receptor = comprobanteReceptor;
comprobante.Conceptos = comprobanteConcepto;


XmlSerializerNamespaces xmlNameSpace = new XmlSerializerNamespaces();
xmlNameSpace.Add("schemaLocation", "http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd");
xmlNameSpace.Add("xsi", "http://www.w3.org/2001/XMLSchema-instance");
XmlTextWriter xmlTextWriter = new XmlTextWriter("C:\\Users\\BJK1\\Desktop\\archivo" + ".xml", Encoding.UTF8);
xmlTextWriter.Formatting = Formatting.Indented;
XmlSerializer xs = new XmlSerializer(typeof(Comprobante));

xs.Serialize(xmlTextWriter, comprobante, xmlNameSpace);
xmlTextWriter.Close();

}

riotamesis 18/10/2010 18:13

Respuesta: Facturas Digitales SAT - Mexico C#
 
Justo yo estaba con el mismo problema

Antes de asignarle los valores debes inicializar el objeto en cada posicion,

comprobanteConcepto[0] = new ComprobanteConcepto();

y ya despues asignas tus valores

comprobanteConcepto[0].unidad = "Servicio";
comprobanteConcepto[0].noIdentificacion = "01";
comprobanteConcepto[0].descripcion = "Asesoria Fiscal y administrativa";
comprobanteConcepto[0].valorUnitario = 2000.00M;
comprobanteConcepto[0].importe = 2000.00M;

A mi me funciono...

Saludos

Nos1 19/10/2010 11:52

Respuesta: Facturas Digitales SAT - Mexico C#
 
Alguien sabe como se puede obtener la cadena original, si nos basamos en este esquema (usando la clase .cs)? espero no sea demasiado obvia mi pregunta.
Saludos.

Nos1 19/10/2010 14:52

Respuesta: Facturas Digitales SAT - Mexico C#
 
Tratando de contestarme a mi mismo, vi el formato

http://www.sat.gob.mx/sitio_internet/e_sat/comprobantes_fiscales/15_6543.html

Supongo que no hay atajos mas que hacerlo a mano, y no es posible que se emita en automático la cadena original

jgarcia3465 21/10/2010 21:08

Respuesta: Facturas Digitales SAT - Mexico C#
 
Saludos javalos532, estoy buscando el código fuente para emitir CFD´s del SAT con todas las características, lo tienes? lo vendes? Me interesa en VB.net

Alguien sabe de quién lo tenga disponible? Me urge para implementarlo en la empresa donde laboro, me meti en aprietos, les dije que no era necesario el ContPAQ, échenme la mano porque me puede costar la chamba...

Gracias,

José Luis
[email protected]

bichoikaro 23/10/2010 09:58

Respuesta: Facturas Digitales SAT - Mexico C#
 
bien,... YO HE PODIDO ASER LA DIGESTION, PERO NO PUEDO GENERAR EL SELLO... COMO PUEDO GENERAR EL SELLO EN C#... ¡¡
A Y EN QUE4 MOMENTO USO EL CERTIFICADO DEL SAT Y EL ARCHIVO .KEY

ASI GENERO LA DIGESTION MD5

cadena = @"||A|1|2005-09-02T16:30:00|1|ISP900909Q88|Industrias del Sur Poniente, S.A. de C.V.|Alvaro Obregón|37|3|Col. Roma Norte|México|Cuauhtémoc|Distrito Federal|México|06700|Pino Suarez|23|Centro|Monterrey|Monterrey|Nuevo Léon|México|95460|CAUR390312S87|Rosa María Calderón Uriegas|Topochico|52|Jardines del Valle|Monterrey|Monterrey|Nuevo León|México|95465|10|Caja|Vasos decorados|20|200|1|pieza|Charola metálica|150|150|IVA|52.5||";
sw.Write(cadena);
sw.Close();

MessageBox.Show("cadena {0}, '" + cadena + "'");
System.IO.StreamReader sr = new StreamReader(fic);
txt = sr.ReadToEnd();
sr.Close();
//DIGESTION MD5
MD5 md5 = new MD5CryptoServiceProvider();
byte[] data = md5.ComputeHash(UTF8Encoding.UTF8.GetBytes(cadena) );
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i <= data.Length - 1; i++)
{
sBuilder.Append(data[i].ToString("x2"));
}
string cadmd5 = sBuilder.ToString();
MessageBox.Show("encriptando cadena md5: {0}, '" + sBuilder + "' LA CAD STRINGG: {1}, '" + sBuilder + "'");

denisa 26/10/2010 17:42

Respuesta: Facturas Digitales SAT - Mexico C#
 
Hola Tengo una duda aqui

xmlNameSpace.Add("schemaLocation", "http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd");


output

xmlns:schemaLocation="http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd"

Deberia?

xsi:schemaLocation="http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd"

me podrían ayudar con esto

denisa 26/10/2010 17:43

Respuesta: Facturas Digitales SAT - Mexico C#
 
Cita:

Iniciado por denisa (Mensaje 3612520)
Hola Tengo una duda aqui

xmlNameSpace.Add("schemaLocation", "http://www.sat.gob.mx/cfd/2 http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd");


output

xmlns:schemaLocation="http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd"

Deberia?

xsi:schemaLocation="http://www.sat.gob.mx/sitio_internet/cfd/2/cfdv2.xsd"

me podrían ayudar con esto


GoLuM83 03/11/2010 18:44

Respuesta: Facturas Digitales SAT - Mexico C#
 
Hola ecastilloc puse tu codigo de comprobantes para generar el XML solo que me arroja un error al serializar

The global XML attribute 'fecha' from namespace '' references distinct types System.DateTime and System.DateTime. Use XML attributes to specify another XML name or namespace for the attribute or types.

Me podrias ayudar?

Gracias

GoLuM83 03/11/2010 18:54

Respuesta: Facturas Digitales SAT - Mexico C#
 
Ups al parecer con la conversion a .cs se agrego un campo fecha con tipo de dato date, solo lo quite y ya funciono una disculpa.

zeroccm 08/11/2010 15:56

Respuesta: Facturas Digitales SAT - Mexico C#
 
Cita:

Iniciado por riotamesis (Mensaje 3601885)
Justo yo estaba con el mismo problema

Antes de asignarle los valores debes inicializar el objeto en cada posicion,

comprobanteConcepto[0] = new ComprobanteConcepto();

y ya despues asignas tus valores

comprobanteConcepto[0].unidad = "Servicio";
comprobanteConcepto[0].noIdentificacion = "01";
comprobanteConcepto[0].descripcion = "Asesoria Fiscal y administrativa";
comprobanteConcepto[0].valorUnitario = 2000.00M;
comprobanteConcepto[0].importe = 2000.00M;

A mi me funciono...

Saludos

Hola disculpa como agregas el IVa o el ISR por que no encuentro como, gracias.

aldaking 09/11/2010 18:49

Respuesta: Facturas Digitales SAT - Mexico C#
 
Este es el código que uso para generar el sello digital:
Código:

.
.
.
                ////Firmar Hash Md5 con la llave privada
                proc.StartInfo.FileName = "openssl.exe ";
                proc.StartInfo.Arguments = string.Concat("dgst -out Firma.binario -sign PrivateKEY.PEM ", CrearHash(md5));
               
                proc.Start();
                proc.WaitForExit();
                proc.StartInfo.FileName = "openssl.exe ";
                proc.StartInfo.Arguments = "enc -in Firma.binario -a -A -out Firma.base64";
                proc.Start();
                proc.WaitForExit();

Que es lo que haces en esta parte del codigo donde dice... CrearHash(md5)...porque concatenas???

estoy en esa parte y no se que mas hacer :S

arcangeldoc 10/11/2010 17:59

Respuesta: Facturas Digitales SAT - Mexico C#
 
Cita:

Iniciado por aldaking (Mensaje 3629883)
Este es el código que uso para generar el sello digital:
Código:

.
.
.
                ////Firmar Hash Md5 con la llave privada
                proc.StartInfo.FileName = "openssl.exe ";
                proc.StartInfo.Arguments = string.Concat("dgst -out Firma.binario -sign PrivateKEY.PEM ", CrearHash(md5));
               
                proc.Start();
                proc.WaitForExit();
                proc.StartInfo.FileName = "openssl.exe ";
                proc.StartInfo.Arguments = "enc -in Firma.binario -a -A -out Firma.base64";
                proc.Start();
                proc.WaitForExit();

Que es lo que haces en esta parte del codigo donde dice... CrearHash(md5)...porque concatenas???

estoy en esa parte y no se que mas hacer :S


Este es la funcion que el crea

le envias tu cadena original

public static string CrearHash(string input)
{
MD5 md5Hasher = MD5.Create();
byte[] data = md5Hasher.ComputeHash(UTF8Encoding.UTF8.GetBytes(i nput));
StringBuilder sBuilder = new StringBuilder();
for (int i = 0; i < data.Length; i++){
sBuilder.Append(data[i].ToString("x2"));
}
return sBuilder.ToString();
}

arcangeldoc 10/11/2010 18:05

Respuesta: Facturas Digitales SAT - Mexico C#
 
Con respecto a la cadena Original y la creacion del sello digital

al ejecutar el siguiente comando creo el sello digital

$ openssl dgst -MD5 -sign aaa010101aaa_CSD_01.key.pem cadena_original.txt | openssl enc -base64 -a

pero al crearlo sobre lo siguiente comando el sello digital varia

$ xsltproc cadenaoriginal_2_0.xslt 1.xml | openssl dgst -MD5 -sign aaa010101aaa_CSD_01.key.pem | openssl enc -base64 -a

NOTA: xsloproc genera la cadena original automaticamente segun la informacion que entrega el xslt del SAT

Alguien le ha pasado lo mismo

Esto usando Linux

killer_beaner 13/11/2010 23:41

Respuesta: Facturas Digitales SAT - Mexico C#
 
Cita:

Iniciado por Baskes (Mensaje 3565231)
¿Y como validar si el sello es correcto para el SAT?

Yo sigo todo el procedimiento y al validar el sello digital, me indica que no es valido. Compare mi cadena original con la que me da el SAT y es la misma, así como hash de MD5. ¿Como saber si mi sello digital es correcto?

Este es el código que uso para generar el sello digital:
Código:

System.Diagnostics.Process proc = new System.Diagnostics.Process();
                proc.EnableRaisingEvents = true;
                proc.StartInfo.UseShellExecute = false;
                proc.StartInfo.CreateNoWindow = true;
                proc.StartInfo.RedirectStandardOutput = true;
                proc.StartInfo.WorkingDirectory = AppDomain.CurrentDomain.BaseDirectory; // Application.StartupPath;
                proc.StartInfo.FileName = "openssl.exe";
               
                proc.StartInfo.Arguments = "pkcs8 -inform DER -in aaa010101aaa_csd_01.key -passin pass:a0123456789 -out PrivateKEY.PEM ";
                proc.Start();
                proc.WaitForExit();
                ////Extraer la Llave Publica del Certificado
                proc.StartInfo.FileName = "openssl.exe";
                proc.StartInfo.Arguments = "x509 -inform DER -outform PEM -in aaa010101aaa_CSD_01.cer -pubkey -out PublicKEY.PEM";
               
                proc.Start();
                proc.WaitForExit();
                ////Firmar Hash Md5 con la llave privada
                proc.StartInfo.FileName = "openssl.exe ";
                proc.StartInfo.Arguments = string.Concat("dgst -out Firma.binario -sign PrivateKEY.PEM ", CrearHash(md5));
               
                proc.Start();
                proc.WaitForExit();
                proc.StartInfo.FileName = "openssl.exe ";
                proc.StartInfo.Arguments = "enc -in Firma.binario -a -A -out Firma.base64";
                proc.Start();
                proc.WaitForExit();


Compañeros que tal muy buena tarde,

Estoy desarrollando el sistema de facturación y tengo problema en la generación del .xml
También sigo al pie de la letra el procedimiento y al validar me indica igual que no es válido. Pero que fue leído exitosamente.
Lo que si les puedo decir es que el archivo .xml se tiene que guardar en UTF_8 en lugar de ascii que es como lo genera.
Abriéndolo con un editor de texto profesional (ultraedit) el xml lo muestra como archivo DOS, convirtiéndolo el mismo archivo a formato utf_8 y salvarlo para posteriormente validarlo en el SAT, mi problema es que no lo puedo salvar, me lo regresa al formato 2
alguna idea?

BenuR 17/11/2010 17:43

Respuesta: Facturas Digitales SAT - Mexico C#
 
Cita:

Iniciado por Nos1 (Mensaje 3603116)
Tratando de contestarme a mi mismo, vi el formato

http://www.sat.gob.mx/sitio_internet/e_sat/comprobantes_fiscales/15_6543.html

Supongo que no hay atajos mas que hacerlo a mano, y no es posible que se emita en automático la cadena original

Si se puede, necesitas el archivo cadenaoriginal_2_0.xslt, y el archivo XML ya generado, las instrucciones son:

Código:

  string tempFile = "./ostring.txt";
            XslCompiledTransform xslt = new XslCompiledTransform();
            xslt.Load("cadenaoriginal_2_0.xslt");

            using (FileStream f = new FileStream(tempFile, FileMode.OpenOrCreate, FileAccess.Write))
            {
                xslt.Transform(_xmlPath, null, f);
            }

tempFile contiene la cadena original...

roku_xd 01/12/2010 13:11

Respuesta: Facturas Digitales SAT - Mexico C#
 
Cita:

Iniciado por ElTajito (Mensaje 3446449)
Gracias a todos por su ayuda, gracias a Dios, ya quedo todo en C#.


Disculpa...funciona al 100 tu sistema???
Responde pronto

freevirus78 20/12/2010 12:16

Respuesta: Facturas Digitales SAT - Mexico C#
 
Que tal, antes que nada un saludo a todos, esta es la primera vez que escribo en este foro, pero realmente necesito ayuda.

Estoy atorado con la generacion del archivo con la cadena original, ya que al guardarlo o me lo guarda en ansi o utf8 pero con bom.

El problema es que si guardo el texto de la cadena original dentro de la variable si me lo guarda sin bom, pero si la variable que tiene la cadena original es producto de las concatenaciones ya no me funciona, espero me haya dado a entender, por ejemplo:

Funciona:

strCadOriginal = "||2.0|FAPBL|38|20-12-2010T11:..."

No funciona:

strCadIriginal = strVersion & strSerie & ...

Sabran por que es esto, tengo mas de tres dias con esto y no puedo resolverlo, les agradezco su atencion.


Gracias





Cita:

Iniciado por thebman (Mensaje 3399757)
Que tal eh llegado a la digestion MD5 usando el openSSL en conjunto con vb.net
el error que existe es que cuando la funcion donde guardamos el archivo recibe el parametro de codificar a utf 8 el archivo se guarda como UTF-8 pero al principio del archivo se agrega que la codificacion usada es UTF8 y por eso la digesion con el openSSL no da igual que en el sat intenta guardar el archivo sin darle codificacion y te funcionara.

Dim cadenaoriginal As String = "||A|1|2005-09-02T16:30:00|1|ISP900909Q88|Industrias del Sur Poniente, S.A. de C.V.|Alvaro Obregón|37|3|Col. Roma Norte|México|Cuauhtémoc|Distrito Federal|México|06700|Pino Suarez|23|Centro|Monterrey|Monterrey|Nuevo Léon|México|95460|CAUR390312S87|Rosa María Calderón Uriegas|Topochico|52|Jardines del Valle|Monterrey|Monterrey|Nuevo León|México|95465|10|Caja|Vasos decorados|20|200|1|pieza|Charola metálica|150|150|IVA|52.5||"


System.IO.File.WriteAllText("C:\cadena.txt", CADENAORIGINAL)

despues aplica la digestion MD5 al archivo cadena.txt y te regresara el resultado.

Nota: No tenemos que darle el formato al archivo porque la instruccion usada ya la guarda en ese formato.

Saludos.


freevirus78 20/12/2010 12:18

Respuesta: Facturas Digitales SAT - Mexico C#
 
Que tal, antes que nada un saludo a todos, esta es la primera vez que escribo en este foro, pero realmente necesito ayuda.

Estoy atorado con la generacion del archivo con la cadena original, ya que al guardarlo o me lo guarda en ansi o utf8 pero con bom.

El problema es que si guardo el texto de la cadena original dentro de la variable si me lo guarda sin bom, pero si la variable que tiene la cadena original es producto de las concatenaciones ya no me funciona, espero me haya dado a entender, por ejemplo:

Funciona:

strCadOriginal = "||2.0|FAPBL|38|20-12-2010T11:..."

No funciona:

strCadIriginal = strVersion & strSerie & ...

Sabran por que es esto, tengo mas de tres dias con esto y no puedo resolverlo, les agradezco su atencion.


Gracias

wwwmaster 20/12/2010 17:09

Respuesta: Facturas Digitales SAT - Mexico C#
 
Ve en el foro de .net
http://www.forosdelweb.com/f29/factu...mexico-806167/

Como recomendacion, es mejor generar la cadena original mediante la transformacion via XSLT con el archivo publicado x el sat. Queda en 3 o 4 lineas y te evitas problemas.

mrcs_jvc 21/12/2010 12:38

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.

gujaci 07/01/2011 15:41

Respuesta: Facturas Digitales SAT - Mexico C#
 
Gracias a todos los que ponen sus dudas y soluciones he logrado crear mi comprobante fiscal digital, de aquí y de otras páginas, les dejo mi código por si a alguien le sirve, es visual basic 2008:

Cadena Original:

Cadena = “|”
SGL_Query = “SELECT EFA_CEFA,EFA_NUME,CONVERT(VARCHAR,EFA_FECH,126),CT E_NORS,CTE_RFCC,CTE_CALL,CTE_NEXT,CTE_NINT,CTE_COL O,”
SGL_Query = SGL_Query & “PDM_DESC, ENT_DESC, PAI_DESC, CTE_CODP ”
SGL_Query = SGL_Query & “FROM TDFCTEFA, TCFCTCTE, TCRHUPAI, TCRHUPDM, TCRHUENT ”
SGL_Query = SGL_Query & “WHERE EFA_CCTE = CTE_CCTE And CTE_CPDM = PDM_CPDM And CTE_CENT = ENT_CENT ”
SGL_Query = SGL_Query & “And CTE_CPAI = PAI_CPAI ”
SGL_Query = SGL_Query & ” AND EFA_CEFA=” & Val(Txt_Clave.Text)
Call Ejecuta(sat, SGL_Query)
Do Until TraeSig(sat) = NOMOREROWS
Cadena = Cadena + “|2.0|A”
Cadena = Cadena + “|” + Trim(DameDato(sat, 2))
Cadena = Cadena + “|” + Trim(DameDato(sat, 3))
Cadena = Cadena + “|174911|2010|ingreso|efectivo|Pago en una sola exhibicion|subtotal|0|grantotal”
Cadena = Cadena + “|JSI060303UA9|JF SISTEMAS, S. A. DE C. V.|MIRAVEREDA|23|B|CUMBRIA”
Cadena = Cadena + “|CUAUTITLAN IZCALLI|ESTADO DE MEXICO|MEXICO|54740″
Cadena = Cadena + “|” + Trim(DameDato(sat, 5))
Cadena = Cadena + “|” + Trim(DameDato(sat, 4))
Cadena = Cadena + “|” + Trim(DameDato(sat, 6))
If Trim(DameDato(sat, 7)) + Trim(DameDato(sat, 8)) “” Then
Cadena = Cadena + “|” + Trim(DameDato(sat, 7)) + Trim(DameDato(sat, 8))
Else
Cadena = Cadena + “|”
End If
Cadena = Cadena + “|” + Trim(DameDato(sat, 9))
Cadena = Cadena + “|” + Trim(DameDato(sat, 10))
Cadena = Cadena + “|” + Trim(DameDato(sat, 11))
Cadena = Cadena + “|” + Trim(DameDato(sat, 12))
Cadena = Cadena + “|” + Trim(DameDato(sat, 13))
Loop
SGL_Query = “SELECT DFE_CANT,DFE_CONC,DFE_IMPO,DFE_CANT*DFE_IMPO,DFE_I IVA*DFE_CANT,DFE_CONS ”
SGL_Query = SGL_Query & “FROM TDFCTDFE WHERE DFE_CEFA=” & Val(Txt_Clave.Text)
Call Ejecuta(sat, SGL_Query)
Dim ImpIva As Double
ImpIva = 0
GTotal = 0
Subtotal = 0
Do Until TraeSig(sat) = NOMOREROWS
Cadena = Cadena + “|” + Trim(DameDato(sat, 1))
Cadena = Cadena + “|PZA”
Cadena = Cadena + “|” + Trim(DameDato(sat, 6))
Cadena = Cadena + “|” + Trim(DameDato(sat, 2))
Cadena = Cadena + “|” + Trim(Str(CorrigeMoneda(DameDato(sat, 3))))
Cadena = Cadena + “|” + Trim(Str(CorrigeMoneda(DameDato(sat, 4))))
ImpIva = ImpIva + Val(CorrigeMoneda(DameDato(sat, 5)))
Subtotal = Subtotal + CorrigeMoneda(DameDato(sat, 4))
GTotal = GTotal + CorrigeMoneda(DameDato(sat, 4)) + CorrigeMoneda(DameDato(sat, 5))
Loop
Cadena = Cadena + “|IVA|” + Trim(Str(IIva * 100))
Cadena = Cadena + “|” & Trim(Str(ImpIva))
Cadena = Cadena + “|” & Trim(Str(ImpIva))
Cadena = Cadena + “||”
Cadena = Replace(Cadena, “subtotal”, Trim(Str(Subtotal)))
Cadena = Replace(Cadena, “grantotal”, Trim(Str(GTotal)))
System.IO.File.WriteAllText(“C:\SARV3.1J\ELE\caden a_orig.txt”, Cadena)

archivo XML:

Dim ANIO As Long
ANIO = 0
SGL_Query = “SELECT YEAR(EFA_FECH) FROM TDFCTEFA WHERE EFA_CEFA=” & Val(Txt_Clave.Text)
Call Ejecuta(sat, SGL_Query)
Do Until TraeSig(sat) = NOMOREROWS
ANIO = Val(DameDato(sat, 1))
Loop
Dim W As New XmlTextWriter(“C:\SARV3.1J\ELE\” & Txt_Clave.Text & “.xml”, System.Text.Encoding.UTF8)
W.WriteStartDocument()
Shell(“C:\OpenSSL-Win32\bin\openssl.exe pkcs8 -inform DER -in C:\SARv3.1J\ELE\JSI060303UA9_0903250930.key -passin pass:chela2009 -out C:\SARV3.1J\ELE\JSI.key.pem”)
System.Threading.Thread.Sleep(500)
Shell(“C:\OpenSSL-Win32\bin\openssl.exe x509 -inform DER -outform PEM -in C:\SARv3.1J\ELE\jsi060303ua9_1010061243s.cer -pubkey -passin pass:chela2009 -out C:\SARV3.1J\ELE\JSI.cer.pem”)
System.Threading.Thread.Sleep(500)
If ANIO 0 Then
W.WriteStartElement(“Impuestos”)
W.WriteAttributeString(“totalImpuestosTrasladados” , Trim(Str(ImpIva)))
W.WriteStartElement(“Traslados”)
W.WriteStartElement(“Traslado”)
W.WriteAttributeString(“impuesto”, “IVA”)
W.WriteAttributeString(“tasa”, Trim(Str((IIva * 100))))
W.WriteAttributeString(“importe”, Trim(Str(ImpIva)))
W.WriteEndElement() ‘finaliza traslado
W.WriteFullEndElement() ‘finaliza traslados
W.WriteFullEndElement() ‘finaliza impuestos
End If
W.WriteStartElement(“Impresion”)
W.WriteAttributeString(“CadenaOriginal”, Cadena)
W.WriteFullEndElement()
‘…………………………………
W.WriteFullEndElement() ‘finaliza comprobante
W.WriteEndDocument() ‘finaliza documento
W.Flush()
W.Close()

obviamente yo uso mi base de datos, espero entiendan el código y lo adapten al suyo.

javalos532 10/01/2011 22:33

Respuesta: Facturas Digitales SAT - Mexico C#
 
Que tal grupo, como les va ? ya tenia mucho que no entraba pero me gustaria saber si alguien ya sustituyo el metodo MD5 por SHA-1 en C# .

Gracias a todos y seguimos en contacto.
Saludos.

mrcs_jvc 11/01/2011 15:45

Respuesta: Facturas Digitales SAT - Mexico C#
 
Revisa esta clase [URL="http://msdn.microsoft.com/es-es/library/system.security.cryptography.sha1cryptoserviceprov ider%28VS.80%29.aspx"]SHA1CryptoServiceProvider[/URL]

gerloxxx 10/02/2011 12:13

Respuesta: Facturas Digitales SAT - Mexico C#
 
Hola a todos, hace poco empece con esto de la facturacion electronica, y gracias a todos sus aportes, rapidamente he conseguido generar un sello valido en C#

Me gustaria que me asesoraran en que pasos siguen, por el momento estoy abordando los siguientes:

1. Crear xml de la factura con sello digital
2. Reporte mensual
3. Pdf para mostrar la factura (todavia investigando)

pero no se que mas sigue :(
Agradeceria mucho tips, que es eso de la norma para respaldarlas, que otros procesos hay, consideraciones... casi no quiero nada jeje

y de verdad muchas gracias a todos

danfred 25/02/2011 12:55

Respuesta: Facturas Digitales SAT - Mexico C#
 
A mi tambien me esta funcionando el código que mencionas, pero ahora ocupo el 'validador' o sea leer del XML el certificado, leer el sello digital y leer la cadena y validar con esos tres datos, he podido leer los datos pero la funcion en c# rsa.VerifyData(); no me funciona, te anexo el codigo para que le eches un ojo, en teoria deberia de funcionar:

public string ValidaSelloDigital2(string selloDigital, string cert, string cadena)
{
try
{
byte[] sello_byte = Convert.FromBase64String( selloDigital);
byte[] cert_byte = Convert.FromBase64String( cert);

X509Certificate2 certificado = new X509Certificate2( cert_byte);
//initialze the byte arrays to the public key information.
byte[] pk = certificado.GetPublicKey();

//Create a new instance of RSACryptoServiceProvider.
RSACryptoServiceProvider rsa = new RSACryptoServiceProvider();
rsa.PersistKeyInCsp = false;
//Get an instance of RSAParameters from ExportParameters function.
RSAParameters RSAKeyInfo = rsa.ExportParameters(false);

//Set RSAKeyInfo to the public key values.
RSAKeyInfo.Modulus = pk;
//Import key parameters into RSA.
rsa.ImportParameters(RSAKeyInfo);

byte[] cadena_byte = System.Text.Encoding.UTF8.GetBytes(cadena);
System.Security.Cryptography.SHA1CryptoServiceProv ider x =
new System.Security.Cryptography.SHA1CryptoServiceProv ider();
byte[] data = x.ComputeHash(cadena_byte);

System.Security.Cryptography.MD5CryptoServiceProvi der x2 =
new System.Security.Cryptography.MD5CryptoServiceProvi der();
byte[] data2 = x2.ComputeHash(cadena_byte);

bool result = rsa.VerifyHash(data2, CryptoConfig.MapNameToOID("MD5"), sello_byte);
bool result2 = rsa.VerifyHash(data, CryptoConfig.MapNameToOID("SHA1"), sello_byte);

string ret = "Sello inválido.";

if (result)
{
ret = "Sello válido con digestion MD5 " + hash_md5(cadena);
}
else
{
if (result2)
{
ret = "Sello válido con digestion SHA1 " + hash_sha1(cadena);
}
}
return ret;
}
catch (Exception ex)
{
return "Error al desencriptar el sello digital " + ex.ToString();
}
}


Cita:

Iniciado por javalos532 (Mensaje 3533221)
Hola a todos, alguien ya tiene este codigo en C#.... con VB me sale perfecto el sello pero en C# no me da igual ...ese es el codigo que estoy utilizando...

X509Certificate2 _MiCertificado = new X509Certificate2(@"....cert.p12", "12345");
RSACryptoServiceProvider RSA = (RSACryptoServiceProvider)_MiCertificado.PrivateKe y;
MD5 hasher = MD5CryptoServiceProvider.Create();
byte[] bytesFirmados = RSA.SignData(System.Text.Encoding.UTF8.GetBytes(pD ato), hasher);
return Convert.ToBase64String(bytesFirmados);

Gracias.



La zona horaria es GMT -6. Ahora son las 09:50.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2025, Jelsoft Enterprises Ltd.