Repository navigation
Generacion de QR
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.
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 verificablesRequiere 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.
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 verificableInternamente 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).
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.