Skip to content

Generacion de QR

Jacobo Cantorna Cigarrán edited this page Oct 11, 2026 · 2 revisions

Generación de QR de validación

La AEAT exige incluir en las facturas VeriFactu una URL/código QR que permita validar la factura en su sede electrónica. No existe una clase QrHelper independiente — estos métodos viven directamente en Invoice.

Solo la URL

String url = invoice.getValidationUrl(false);            // false = entorno de pruebas, true = producción (sistema VERI*FACTU)
String urlNoVerifactu = invoice.getValidationUrl(false, false); // sistema que emite facturas no verificables

Requiere que issuerTaxId, invoiceNumber e issueDate estén rellenos en el Invoice (lanza IllegalStateException si falta alguno). La URL sigue la especificación de la AEAT ("Características del QR", v0.5.0):

Sistema Pruebas Producción
VERI*FACTU (facturas verificables) https://prewww2.aeat.es/wlpl/TIKE-CONT/ValidarQR?... https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQR?...
No verificable https://prewww2.aeat.es/wlpl/TIKE-CONT/ValidarQRNoVerifactu?... https://www2.agenciatributaria.gob.es/wlpl/TIKE-CONT/ValidarQRNoVerifactu?...

Los cuatro parámetros (nif, numserie, fecha=dd-MM-yyyy, importe con punto decimal) van codificados en UTF-8: un número de serie como 12345678&G33 se envía como 12345678%26G33. El parámetro formato=json nunca puede ir en la URL del QR.

Imagen PNG del QR

byte[] qrPngDefault = invoice.getValidationQR(false);          // 200x200 px (tamaño por defecto)
byte[] qrPng300 = invoice.getValidationQR(false, 300);         // tamaño personalizado en píxeles
byte[] qrNoVerifactu = invoice.getValidationQR(false, false, 300); // sistema no verificable

Internamente usa ZXing con corrección de errores nivel M (obligatorio según la AEAT, ISO/IEC 18004:2015). Los métodos declaran throws Exception (propagado desde ZXing).

Cómo imprimirlo en la factura

La AEAT exige que el QR impreso mida entre 30x30 y 40x40 mm, con al menos 2 mm de margen en blanco (se recomiendan 6 mm), situado al principio de la factura, con el texto «QR tributario:» encima y, en sistemas VERI*FACTU, la frase «Factura verificable en la sede electrónica de la AEAT» o «VERI*FACTU» debajo. El SDK genera la imagen; la maquetación es responsabilidad de tu sistema.

Para guardar el resultado a disco:

java.nio.file.Files.write(java.nio.file.Paths.get("factura-qr.png"), qrPng300);

O para incrustarlo en un PDF/HTML, conviértelo a Base64:

String base64Png = java.util.Base64.getEncoder().encodeToString(qrPng300);
String dataUri = "data:image/png;base64," + base64Png;

Ejemplo completo: QrCodeExample.java.

Clone this wiki locally