Foros del Web » Programación para mayores de 30 ;) » .NET »

[SOLUCIONADO] Facturación Electrónica SAT México (C#)

Estas en el tema de Facturación Electrónica SAT México (C#) en el foro de .NET en Foros del Web. Comparto código en C# para firmar facturas utilizando la definición del SAT 3.2 México. Pasos necesarios: 1. Genear XML con datos de factura 2. Obtener ...
  #1 (permalink)  
Antiguo 18/03/2013, 12:40
 
Fecha de Ingreso: marzo-2013
Mensajes: 1
Antigüedad: 11 años, 8 meses
Puntos: 1
Facturación Electrónica SAT México (C#)

Comparto código en C# para firmar facturas utilizando la definición del SAT 3.2 México.
Pasos necesarios:

1. Genear XML con datos de factura
2. Obtener Cadena Original usando xml generado.
3. Obtener “sello” de la cadena original (SHA1 y RSA)
4. Enviar XML a PAC (proveedor autorizado de certificación)

Necesitarán dos clases que adjunto:

• clFacturaElectronica.cs, está construida con la herramienta xsd.exe utilizando el xsd proporcionado por el SAT. ([URL="http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd"]http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd[/URL])
• clsSeguridad.cs, librería publicada en este mismo foro que está basada en “OpenSSL.cs”


Ahora, comencemos.


Es necesario tener la ruta a los archivos .cer y .key proporcionados por el SAT:

Cita:
(**** private String ***)
strPath = Path.GetDirectoryName(Application.ExecutablePath);
strCertFile = strPath + @"\aaa010101aaa__csd_01.cer";
strKeyFile = strPath + @"\aaa010101aaa__csd_01.key";
strKeyClave=@"12345678a";
(*** String deben ser llenados en algún momento previo al proceso ****)
Cita:
//Creamos una nueva clase y comenzamos a llenar
Comprobante oComp = new Comprobante();
oComp.Receptor = new ComprobanteReceptor();
oComp.Receptor.Domicilio = new t_Ubicacion();
oComp.Emisor = new ComprobanteEmisor();
oComp.Emisor.DomicilioFiscal = new t_UbicacionFiscal();
oComp.Emisor.RegimenFiscal = new ComprobanteEmisorRegimenFiscal[1];
oComp.Emisor.RegimenFiscal[0] = new ComprobanteEmisorRegimenFiscal();
oComp.Conceptos = new ComprobanteConcepto[1]; // N° Filas Detalle Factura
oComp.Impuestos = new ComprobanteImpuestos();
oComp.Impuestos.Traslados = new ComprobanteImpuestosTraslado[1];
oComp.Impuestos.Traslados[0] = new ComprobanteImpuestosTraslado();

// Datos
oComp.version = “3.2”;
oComp.folio = “111”;
....
.... deben llenar todas las propiedades necesarias.
....


X509Certificate2 x509 = new X509Certificate2(strCertFile);
if (x509 != null)
{
oComp.certificado = Convert.ToBase64String(x509.RawData);
oComp.noCertificado = clsSeguridad.HexToString(x509.SerialNumber);
}

oComp.sello = "**Pendiente**";
XmlDocument oXML = Class2XmlDocument(oComp);
String strCadenaOriginal = ObtieneCadenaOriginal_XSLT(oXML);
String strSello = ObtieneSello_RSA(strCadenaOriginal);
oXML.ChildNodes[1].Attributes["sello"].Value = strSello;
txbResultado.Text = oXML.InnerXml; // texbox con el resultado xml que se debe enviar al PAC

Funciones:
Cita:
public XmlDocument Class2XmlDocument(object pClass)
{
XmlDocument oXML = new XmlDocument();
XmlSerializerNamespaces oXMLSerializeNS = new XmlSerializerNamespaces();
XmlSerializer oXMLSerialize = new XmlSerializer(pClass.GetType());
MemoryStream oMS = new MemoryStream();
StreamWriter oSW = new StreamWriter(oMS, Encoding.UTF8);
oXMLSerializeNS.Add("cfdi", strSAT_CFDI);
oXMLSerializeNS.Add("xsi", strSAT_XSI);
oXMLSerialize.Serialize(oSW, pClass, oXMLSerializeNS);
oMS.Flush();
oMS.Position = 0;
oXML.Load(oMS);
oMS.Dispose();
oSW.Dispose();
XmlSchemaSet schemas = new XmlSchemaSet();
schemas.Add("http://www.sat.gob.mx/cfd/3", "http://www.sat.gob.mx/sitio_internet/cfd/3/cfdv32.xsd");
oXML.Schemas.Add(schemas);
ValidationEventHandler eventHandler = new ValidationEventHandler(Class2XmlDocument_Validatio n);
oXML.Validate(eventHandler);
return oXML;
}
Cita:
private String ObtieneCadenaOriginal_XSLT(XmlDocument pXML)
{
XslCompiledTransform oXSLT = new XslCompiledTransform();
oXSLT.Load(strXLST);
MemoryStream oMS = new MemoryStream();
oXSLT.Transform(pXML, null, oMS);
oMS.Flush();
oMS.Position = 0;
StreamReader oSR = new StreamReader(oMS,Encoding.UTF8);
String strCadena = oSR.ReadToEnd();
oMS.Dispose();
oSR.Dispose();
return strCadena;
}
Cita:
private String ObtieneSello_RSA(String pCadenaOriginal)
{
SecureString lSecStr = new SecureString();
lSecStr.Clear();
foreach (char c in strKeyClave.ToCharArray())
lSecStr.AppendChar(c);
Byte[] pLlavePrivadaenBytes = System.IO.File.ReadAllBytes(strKeyFile);
RSACryptoServiceProvider lrsa = clsSeguridad.DecodeEncryptedPrivateKeyInfo(pLlaveP rivadaenBytes, lSecStr);
SHA1CryptoServiceProvider oSHA1 = new SHA1CryptoServiceProvider();
Byte[] bytesFirmados_SHA = lrsa.SignData(Encoding.UTF8.GetBytes(pCadenaOrigin al.Trim()), oSHA1);
return Convert.ToBase64String(bytesFirmados_SHA);
}
clFacturacionElectronica.cs:
clsSeguridad.cs
http://rapidshare.com/files/1020870058/clSeguridad.zip
http://rapidshare.com/files/956031239/clFacturacionElectronica.zip

Última edición por CeJotaDe; 18/03/2013 a las 12:56
  #2 (permalink)  
Antiguo 25/04/2013, 11:33
 
Fecha de Ingreso: junio-2011
Ubicación: Tuxtla Gutiérrez
Mensajes: 2
Antigüedad: 13 años, 5 meses
Puntos: 0
Respuesta: Facturación Electrónica SAT México (C#)

hem, no puedo decargar esas clases, rapidshare dice
Código HTML:
"La descarga de este archivo no ha sido habilitada. Solo el usuario que lo cargó puede habilitar la opción de descarga."
:-/
  #3 (permalink)  
Antiguo 16/07/2013, 05:14
 
Fecha de Ingreso: julio-2013
Mensajes: 1
Antigüedad: 11 años, 4 meses
Puntos: 0
Respuesta: Facturación Electrónica SAT México (C#)

Hola . Las descargas de rapidshare no funcionan .

clFacturacionElectronica.cs:
clsSeguridad.cs
http://rapidshare.com/files/1020870058/clSeguridad.zip
http://rapidshare.com/files/956031239/clFacturacionElectronica.zip

podrias subirlas de nuevo :)

Gracias
  #4 (permalink)  
Antiguo 15/08/2013, 19:28
 
Fecha de Ingreso: agosto-2013
Mensajes: 1
Antigüedad: 11 años, 3 meses
Puntos: 0
Respuesta: Facturación Electrónica SAT México (C#)

Disculpa, donde puedo descargar la librería clsSeguridad.cs?

gracias
  #5 (permalink)  
Antiguo 28/08/2013, 14:46
 
Fecha de Ingreso: noviembre-2002
Ubicación: DF
Mensajes: 1.056
Antigüedad: 22 años
Puntos: 37
Respuesta: Facturación Electrónica SAT México (C#)

Si desean generar el Sello Digital accediendo directo al .key sin el uso de otros componentes con código C# puro, busquen opensslkey.cs en google.
  #6 (permalink)  
Antiguo 01/02/2014, 11:41
 
Fecha de Ingreso: febrero-2014
Mensajes: 1
Antigüedad: 10 años, 9 meses
Puntos: 0
Respuesta: Facturación Electrónica SAT México (C#)

hola q tal tengo una duda como lleno el regimen fiscal y como lleno conceptos espero me puedan ayudar

Última edición por zirba3220; 01/02/2014 a las 11:41 Razón: error

Etiquetas: cfdi, facturacion, mexico, sat
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta

SíEste tema le ha gustado a 3 personas




La zona horaria es GMT -6. Ahora son las 12:02.