C sharp - Factura electronica

<<>>
 
Vista:

Factura electronica

Publicado por Xavi (7 intervenciones) el 04/04/2025 13:21:46
Buenos dias
Haber si alguien me puede ayudar que llevo tiempo en ello y no me sale.
Tengo que firmar documentos xml por el tema de la factura electronica que obliga el gobierno.
En principio me la firma, pero al validarla en la pagina de la AEAT me dice que la firma es incorrecta.
Link Validacion https://face.gob.es/es/facturas/validar-visualizar-facturas
Os paso el codigo y haber si alguien ve algo que me dejo?. Gracias
-------------------------------------------------------------------------------------------------------------
private void Button8_Click(object sender, EventArgs e)
{

string archivoXml = Environment.CurrentDirectory + @"\\Archivo.xml";
string archivoPfx = Environment.CurrentDirectory + @"\\CERTIFICADO.pfx";
string contrasenaPfx = "XXXXXXXXXX";
string archivoFirmado = Environment.CurrentDirectory + @"\\firmada.xml";

// Cargar el certificado PFX
X509Certificate2 cert = new(archivoPfx, contrasenaPfx);

// Cargar el documento XML
XmlDocument xmlDoc = new();
xmlDoc.PreserveWhitespace = true;
xmlDoc.Load(archivoXml);

// Firmar el XML
SignXml(xmlDoc, cert);

// Guardar el XML firmado
xmlDoc.Save(archivoFirmado);

Console.WriteLine("El documento XML ha sido firmado y guardado en: " + archivoFirmado);

}

private static void SignXml(XmlDocument xmlDoc, X509Certificate2 cert)
{

// Crear una nueva instancia de la clase SignedXml
SignedXml signedXml = new(xmlDoc);

// Asignar el certificado como clave de firma
signedXml.SigningKey = cert.GetRSAPrivateKey();

// Crear un objeto Reference para identificar el nodo que se firmará
Reference reference = new();
reference.Uri = ""; // Firmamos todo el documento

// Añadir transformaciones para asegurar que el contenido XML es tratado correctamente
XmlDsigEnvelopedSignatureTransform env = new();
reference.AddTransform(env);

// Añadir la referencia al objeto SignedXml
signedXml.AddReference(reference);

// Especificar el algoritmo de firma con SHA-256
signedXml.SignedInfo.SignatureMethod = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";

// Crear el objeto KeyInfo
KeyInfo keyInfo = new();
keyInfo.AddClause(new KeyInfoX509Data(cert));

// Asignar el KeyInfo al objeto SignedXml
signedXml.KeyInfo = keyInfo;

// Firmar el XML
signedXml.ComputeSignature();

// Obtener la firma generada y añadirla al XML
XmlElement xmlSignature = signedXml.GetXml();
xmlDoc.DocumentElement.AppendChild(xmlDoc.ImportNode(xmlSignature, true));

}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
sin imagen de perfil

Factura electronica

Publicado por Plugged (1 intervención) el 01/05/2025 10:29:40
Buenas Xavi.

Si es para Verifactu, desarrollé una librería (DLL) en Delphi pero que se puede utilizar C# (32 y 64, son DLLs distintas).

Una función sencilla (de usar), pasa tres parámetros (InputXml, OutputXml, CertificateSerialNumber) y a volar.

En el caso que tengas interés, enviame un correo, puedo facturar (en el caso que necesite una factura).

Un saludo.

[email protected]
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

Factura electronica

Publicado por Xavi (1 intervención) el 02/05/2025 08:24:33
Gracias por responder
te e enviado un mail
Saludos
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar