Cómo crear una aplicación con Delphi para firmar digitalmente una factura (o fichero) utilizando la dll AEATFACT.dll que AEAT pone a disposición de los desarrolladores de software. También explica como comprobar la validez de un documento firmado digitalmente.
- Introducción a la firma electrónica.
- Descarga e instalación del componente de la AEAT en Delphi 6.
- Programa en Delphi 6 para firmar ficheros.
- Probando AjpdSoft Firma telemática.
Introducción a la firma electrónica
La AEAT (Agencia Tributaria) ha puesto a disposición de los desarrolladores de software una librería (dll) para incluirla en los lenguajes de programación y utilizar los métodos de que dispone. Permite firmar un documento digital (pdf, jpg, xml, …) y permite verificar que la validez de la firma. Con estos dos métodos es suficiente para firmar y comprobar la validez de un documento firmado. Un documento firmado digitalmente (y validado correctamente) tendrá la misma validez legal que otro impreso y firmado manualmente.
Para la firma de los documentos telemáticos, el emisor (el que firma el documento) debe disponer de un certificado de usuario de una de las Autoridades de Certificación válidas para facturación telemática. Las Autoridades de Certificación para los certificados reconocidas por la AEAT se pueden consultar en su web oficial. El certificado suele ser el mismo que se utiliza para la presentación telemática de las declaraciones en la AEAT, ya que no existen certificados especiales para facturación telemática. Normalmente suele ser el Clase 2 CA de la FNMT.
Descarga e instalación del componente de la AEAT en Delphi 6
En primer lugar descargaremos la dll AEATFACT.dll de AjpdSoft Firma telemática, una vez descargado lo registraremos en el sistema, previamente lo copiaremos a la carpeta donde queramos dejarlo definitivamente y lo registraremos. Para registrarlo podemos usar AjpdSoft Registro de OCX/DLL:
Seleccionamos el fichero AEATFACT.dll:
Y pulsamos en «Registrar»:
Para registrarlo manualmente, el comando es:
regsvr32 RutaFichero\AEATFACT.dll
Programa en Delphi 6 para firmar ficheros
Una vez registrado podremos utilizarlo desde Delphi, para ello abrirnos Delphi, menú «File» – «New» – «Application» y en el formulario de la aplicación añadimos un TEdit para el fichero a firmar, otro para el DNI y otro para el fichero de firma resultante. Añadiremos también un TButton para seleccionar el fichero a firmar, otro para la verificación de la firma y otro más para firmar el fichero:
El código para el botón «Seleccionar fichero» será:
1 2 3 4 5 6 7 8 9 10 11 12 |
procedure TformMenuPrincipal.bSeleccionarClick(Sender: TObject); begin dlFichero.Title := 'Seleccione fichero a firmar/verificar'; if dlFichero.Execute then begin txtFichero.Text := dlFichero.FileName; if ExtractFileExt (txtFichero.Text) = '.fir' then bVerificar.SetFocus else txtDNI.SetFocus; end; end; |
El código para el botón «Verificar» será:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
procedure TformMenuPrincipal.bVerificarClick(Sender: TObject); var pAEAT : Variant; error : string; begin if MessageDlg('La verificación digital de un fichero necesita conexión a ' + 'Internet, en concreto a la web de la AEAT: + ' 'https://www1.aeat.es/pymes1/facturaf.html' + chr(13) + chr(13) + '¿Desea continuar con el proceso de verificación?', mtConfirmation, [mbyes, mbno], 0) = mryes then begin try pAEAT := CreateOleObject('AEATFACT.AeatFactCtl'); if (not (VarIsNull(pAEAT))) then begin try error := pAEAT.VERIFICA(txtFichero.Text, txtDestino.Text); if copy (error, 1, 2) = '00' then MessageDlg('La verificación del fichero es correcta.' + chr(13) + chr(13) + 'Datos del firmante: ' + chr(13) + chr(13) + copy (error, 3, length(error)), mtInformation, [mbok], 0) else begin MessageDlg (copy(error, 3, length(error)), mtWarning, [mbOK], 0); txtDNI.SetFocus; end finally pAEAT := Unassigned; end; end; except MessageDlg ('No ha podido crearse el objeto AEAT, compruebe ' + 'que tiene registrado el fichero AEATFACT.dll', mtInformation, [mbOK], 0); end; end; end; |
El código para el botón «Firmar» será:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 |
procedure TformMenuPrincipal.bFirmarClick(Sender: TObject); var pAEAT : Variant; error : string; begin if FileExists(txtFichero.Text) then begin try pAEAT := CreateOleObject('AEATFACT.AeatFactCtl'); if (not (VarIsNull(pAEAT))) then begin try error := pAEAT.FIRMA(txtFichero.Text, txtDNI.text, txtDestino.Text); if copy (error, 1, 2) = '00' then MessageDlg('El fichero se ha firmado correctamente.' + chr(13) + chr(13) + 'Datos del certificado: ' + chr(13) + chr(13) + copy (error, 3, length(error)), mtInformation, [mbok], 0) else begin MessageDlg (copy(error, 3, length(error)), mtWarning, [mbOK], 0); txtDNI.SetFocus; end finally pAEAT := Unassigned; end; end; except MessageDlg ('No ha podido crearse el objeto AEAT, compruebe ' + 'que tiene registrado el fichero AEATFACT.dll', mtInformation, [mbOK], 0); end; end else MessageDlg('El fichero a firmar digitalmente no existe.', mtWarning, [mbok], 0); end; |
El programa resultante tendrá este aspecto:
Probando AjpdSoft Firma telemática
Para probar AjpdSoft Firma telemática, seleccionaremos un fichero a firmar e introduciremos el DNI del certificado que tengamos instalado en el PC (o el certificado alojado en la tarjeta Smart Card Reader). Si utilizamos un Smart Card Reader (lector de tarjetas) nos pedirá la contraseña de la misma con una ventana como esta:
Tras introducir la contraseña de la tarjeta (si se utiliza un Smart Card Reader), si el proceso se ha realizado correctamente, nos aparecerá un mensaje como este:
Para validar un fichero firmado, lo seleccionaremos y pulsaremos en «Validar». Si la firma es correcta nos aparecerá un mensaje como este (recordamos que es preciso tener conexión a Internet para realizar la validación):