Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Principal > Internet
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Grupo de Teaming del ClubDelphi

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo Hace 2 Horas
Delphier Delphier is offline
Miembro
 
Registrado: feb 2024
Posts: 15
Poder: 0
Delphier Va por buen camino
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);
2-Para firmar XML facturae y "Verifactu (Cuando se publique si es válida) "

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.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

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


La franja horaria es GMT +2. Ahora son las 22:54:20.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi