Desarrollo para Verifactu en Delphi

Ayuda a desarrolladores para integrar Verifactu con Delphi: aprende a realizar peticiones REST, generar facturas con QR, firmar con certificado digital y crear XML de forma eficiente.

screenshot
Verifacti

Verifacti

18 mar 2025

Cómo hacer una petición a una API Rest desde Delphi

Para realizar peticiones HTTP en Delphi a una API como la de Verifacti se puede utilizar el siguiente código.

uses
  System.SysUtils, System.Classes, System.Net.HttpClient, System.Net.URLClient;

procedure CreateInvoice;
var
  HttpClient: TNetHTTPClient;
  Response: IHTTPResponse;
  JSONData: TStringStream;
  URL: string;
begin
  URL := 'https://api.verifacti.com/verifactu/create';
  HttpClient := TNetHTTPClient.Create(nil);
  try
    HttpClient.CustomHeaders['Authorization'] := 'Bearer <API_KEY>';
    HttpClient.ContentType := 'application/json';

    JSONData := TStringStream.Create(
      '{' +
      '"serie": "A",' +
      '"numero": "234634",' +
      '"fecha_expedicion": "02-12-2024",' +
      '"tipo_factura": "F1",' +
      '"descripcion": "Descripcion de la operacion",' +
      '"nif": "A15022510",' +
      '"nombre": "Nombre cliente",' +
      '"lineas": [{' +
      '"base_imponible": "200",' +
      '"tipo_impositivo": "21",' +
      '"cuota_repercutida": "42"' +
      '}],' +
      '"importe_total": "242"' +
      '}',
      TEncoding.UTF8
    );
    try
      Response := HttpClient.Post(URL, JSONData);
      if Response.StatusCode = 200 then
        WriteLn('Success: ' + Response.ContentAsString())
      else
        WriteLn('Error: ' + Response.StatusCode.ToString);
    finally
      JSONData.Free;
    end;
  finally
    HttpClient.Free;
  end;
end;

Estas unidades forman parte de la RTL estándar de Delphi y están disponibles en las versiones de Delphi que soportan TNetHTTPClient (típicamente Delphi XE8 y posteriores)

Ejemplo de integración con WinHttpRequest

Si prefieres utilizar WinHttpRequest en Delphi, se puede hacer de la siguiente forma:

uses
  ComObj, SysUtils, ActiveX;

procedure CreateInvoiceWithWinHttp;
var
  WinHttp: OleVariant;
  URL, APIKey, JSONData, Response: string;
begin
  CoInitialize(nil);
  try
    URL := 'https://api.verifacti.com/verifactu/create';
    APIKey := '<API_KEY>';
    JSONData := '{' +
      '"serie": "A",' +
      '"numero": "234634",' +
      '"fecha_expedicion": "02-12-2024",' +
      '"tipo_factura": "F1",' +
      '"descripcion": "Descripcion de la operacion",' +
      '"nif": "A15022510",' +
      '"nombre": "Nombre cliente",' +
      '"lineas": [{' +
      '"base_imponible": "200",' +
      '"tipo_impositivo": "21",' +
      '"cuota_repercutida": "42"' +
      '}],' +
      '"importe_total": "242"' +
      '}';
      
    WinHttp := CreateOleObject('WinHttp.WinHttpRequest.5.1');
    WinHttp.Open('POST', URL, False);
    WinHttp.SetRequestHeader('Authorization', 'Bearer ' + APIKey);
    WinHttp.SetRequestHeader('Content-Type', 'application/json');
    WinHttp.Send(JSONData);
    Response := WinHttp.ResponseText;
    
    WriteLn('Response: ' + Response);
  finally
    CoUninitialize;
  end;
end;

Cómo pegar el QR a la factura en Delphi

Para incrustar un código QR en un PDF, se pueden usar librerías como:

Ejemplo con SynPDF:

uses
  SynPDF;

procedure AgregarQRAlPDF;
var
  Doc: TPdfDocumentGDI;
  Page: TPdfPage;
  QRBitmap: TBitmap;
begin
  Doc := TPdfDocumentGDI.Create;
  try
    Page := Doc.AddPage;
    QRBitmap := TBitmap.Create;
    try
      // Aquí se cargaría la imagen del QR en QRBitmap
      Page.RenderDraw(QRBitmap, 100, 100, 200, 200);
    finally
      QRBitmap.Free;
    end;
    Doc.SaveToFile('FacturaConQR.pdf');
  finally
    Doc.Free;
  end;
end;

Cómo generar un QR en Delphi

Se pueden usar las siguientes librerías para generar códigos QR en Delphi:

Ejemplo con DelphiZXingQRCode:

uses
  DelphiZXingQRCode, Vcl.Graphics;

procedure GenerarQR;
var
  QRCode: TDelphiZXingQRCode;
  Bitmap: TBitmap;
begin
  QRCode := TDelphiZXingQRCode.Create;
  try
    QRCode.Data := 'https://verifacti.com';
    QRCode.Encoding := TQRCodeEncoding.qrAuto;
    Bitmap := TBitmap.Create;
    try
      Bitmap.SetSize(QRCode.Rows, QRCode.Columns);
      QRCode.DrawBitmap(Bitmap);
      Bitmap.SaveToFile('QRFactura.bmp');
    finally
      Bitmap.Free;
    end;
  finally
    QRCode.Free;
  end;
end;

Posts relacionados

Obligatoriedad Verifactu: ¿para quién es obligatorio Verifactu?

Obligatoriedad Verifactu. Quién está obligado al cumplimiento de VeriFactu. Obligatoriedad para sisemas informáticos de facturación, personas jurídicas y autónomos.

El Reglamento VeriFactu: ley y normativa para VeriFactu

Explicación sobre el Real Decreto 1007/2023, conocido como el reglamento VeriFactu. Resumen e implicaciones del reglamento VeriFactu.

Más de 25 ejemplos de facturas Verifactu: guía completa para desarrolladores

Colección completa de ejemplos de facturas Verifactu: simplificada, normal, rectificativa, intracomunitaria, exportación, IGIC, IPSI, anulación y más. JSON listos para copiar.