FTP | CCD | Buscar | Trucos | Trabajo | Foros |
|
Registrarse | FAQ | Miembros | Calendario | Guía de estilo | Temas de Hoy |
|
Herramientas | Buscar en Tema | Desplegado |
|
#1
|
|||
|
|||
Firma Digital por DLL y XML schema binding de facturae
Hola
OS dejo mi planteamiento sobre la generación de XML y Firma por si le sirve a alguien para algo o le sirve de idea. La idea es aplicar el sistema de Firma por DLL para Verifactu y para facturae. 1-Guardar el certificado digital y la contraseña encriptada en la base de datos Código:
FileStream := TMemoryStream.Create; FileStream.LoadFromFile(Filename); // Fichero del certificado TempStream := TMemoryStream.Create; TempStream := EncriptarStream(FileStream); TBlobField(Dataset.FieldByName('CertFirmaDigital')).LoadFromStream(TempStream); Me acordé que hace unos años compré xmlblackbox para Delphi XE3 y no lo había usado nunca. Se me ocurrió que para no andar comprando librerias constantemente , se podía hacer una DLL con Delphi XE3 para firmar y poder usarla con mis aplicaciones de Delphi 11, etc... Código de la DLL con la funcion de firma en la carpeta DLLFirma y también las DLL compiladas por si sacan a alguien del paso, dejo el enlace para la descarga porque es demasiado grande para adjuntar con las DLL compiladas h t t p s : // drive.google.com/file/d/1vrtpSGHje-l-3XW6peIGqYxHkH0g9aYx/view?usp=drive_link Código:
// Para comprobar si un certificvado es Valido , pasando un IStream function StreamCertificadoValido(CertStream : IStream ; Password : Pchar) : Boolean; StdCall; // Para comprobar si un certificvado es Valido , pasando un String con la ubicación del fichero function FicheroCertificadoValido(Filename,Password : Pchar) : Boolean; StdCall; // Para firmar el XML , devuelve el XML Firmado function FirmaFacturae(CertStream,XMLFacturae : IStream ; Password : Pchar): Pchar; StdCall; // Para obtener cierta información del certificado (La idea final es devolver un XML con todo, pero...) function DatoCertificado(CertStream : IStream ; Password,Dato : Pchar) : Pchar; StdCall; Código:
// Ejemplos LLamada a las funciones de la DLL desde la Aplicacion //Definir las funciones function FirmaFacturae(CertStream,XMLFacturae : IStream ; Password : Pchar): Pchar; StdCall; external 'DLLFirmaCrt.x32.dll'; function FicheroCertificadoValido(Filename,Password : Pchar) : Boolean; StdCall; external 'DLLFirmaCrt.x32.dll' name 'FicheroCertificadoValido'; function StreamCertificadoValido(CertStream : IStream ; Password : Pchar) : Boolean; StdCall; external 'DLLFirmaCrt.x32.dll' name 'StreamCertificadoValido'; function DatoCertificado(CertStream : IStream ; Password,Dato : Pchar) : Pchar; StdCall; external 'DLLFirmaCrt.x32.dll' name 'DatoCertificado'; // Firmar XML facturae con la DLL procedure TFr_user.ButtonClick(Sender: TObject); var Fichero,XMLString,ResultadoXML : String; var XSendCertificadoFirma,SendXMLStream : IStream; var XMLFileStream : TStringStream; var TempStream : TMemoryStream; begin { Fichero := 'nombre del fichero xml o directamente usar XMLString' } XMLString := TFile.ReadAllText(Fichero,TEncoding.Unicode); // Test de firma // El certificado TBlobField(Dataset.FieldByName('CertFirmaDigital')).SaveToStream(TempStream); // Lo desencriptamos XCertificadoFirma := DesencriptarStream(TempStream); XCertificadoFirma.Seek(0,soFromBeginning); XSendCertificadoFirma := TStreamAdapter.Create(XCertificadoFirma, soReference); //soOwned //El XMl A firmar XMLFileStream := TStringStream.Create(XMLString,TEncoding.Unicode); SendXMLStream := TStreamAdapter.Create(XMLFileStream, soReference); // Adap`tamos a IStream if XSendCertificadoFirma <> nil then Begin ResultadoXML := FirmaFacturae(XSendCertificadoFirma,SendXMLStream,Pchar(XCertificadoPass)); // SI ho hay error , guardamos el fichero if Copy(ResultadoXML,1,7) <> '<Error>' then Begin TFile.WriteAllText(FicheroFirmado,ResultadoXML,TEncoding.Unicode); End else Begin // Error f_control(nil,'M',f_frase('NO SE HA PODIDO FIRMAR DIGITALMENTE LA FACTURA.',0),ResultadoXML,''); End; End else Begin //Showmessage('No hay certificado'); End; XMLFileStream.Free; SendXMLStream := nil; end; 3- Mi planteamiento de como generar el XML verifactu ya corre por este hilo. 4- Para generar el XML facturae. Usar el esquema que proporciona la AEAT y con XML Schema Binding generar el Pas "SistemaFacturaev3_2_2.pas" , lo adjunto en la carpetas Facturae. UFacturaE.pas es un ejemplo no terminado 100% de como se genera facilmente el XML Facturae, funciona , pero añadir cosas, solo es un ejemplo de como usar SistemaFacturaev3_2_2.pas Saludos Última edición por Delphier fecha: Hace 1 Hora a las 20:54:43. |
|
|
Temas Similares | ||||
Tema | Autor | Foro | Respuestas | Último mensaje |
Hijo de Informáticos | gluglu | Humor | 3 | 13-03-2007 11:05:35 |
Adictos informaticos ... | Trigger | Humor | 2 | 11-10-2004 12:18:32 |
Nosotros los Informáticos | Trigger | Humor | 1 | 10-10-2004 14:58:09 |
Patrón de los Informáticos. | obiwuan | Varios | 20 | 10-09-2003 14:44:54 |
Chistes Informaticos | jhonny | Humor | 2 | 11-08-2003 21:59:09 |
|