Crear QR de AFIP en Java

Con pocas líneas de código


Crear QR de AFIP en Java

Luego de obtener el CAE vamos a generar el QR de AFIP para nuestro comprobante.

Preparamos el QR

Para generar el QR vamos a utilizar ZXing, una popular librería para trabajar con códigos QR en Java, y Gson para trabajar con JSON.

Primero, añadimos la dependencia de Maven:

<dependency>
    <groupId>com.google.code.gson</groupId>
    <artifactId>gson</artifactId>
    <version>2.11.0</version>
</dependency>

<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>core</artifactId>
    <version>3.5.1</version>
</dependency>
<dependency>
    <groupId>com.google.zxing</groupId>
    <artifactId>javase</artifactId>
    <version>3.5.1</version>
</dependency>

Y generamos el codigo QR

package com.example;

import com.google.zxing.BarcodeFormat;
import com.google.zxing.WriterException;
import com.google.zxing.client.j2se.MatrixToImageWriter;
import com.google.zxing.common.BitMatrix;
import com.google.zxing.qrcode.QRCodeWriter;
import com.google.gson.Gson;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.file.FileSystems;
import java.nio.file.Path;
import java.util.Base64;
import java.util.HashMap;
import java.util.Map;

public class Main {

    public static void main(String[] args) {
        // Datos para el QR (Respetar los tipos string/numero)
        Map<String, Object> qrCodeData = new HashMap<>();
        qrCodeData.put("ver", 1); // Versión del formato de los datos (1 por defecto)
        qrCodeData.put("fecha", "2017-10-25"); // Fecha de emisión del comprobante
        qrCodeData.put("cuit", 12345678912L); // Cuit del Emisor del comprobante
        qrCodeData.put("ptoVta", 1); // Punto de venta utilizado para emitir el comprobante
        qrCodeData.put("tipoCmp", 6); // Tipo de comprobante
        qrCodeData.put("nroCmp", 32); // Número del comprobante
        qrCodeData.put("importe", 150); // Importe Total del comprobante (en la moneda en la que fue emitido)
        qrCodeData.put("moneda", "ARS"); // Moneda del comprobante
        qrCodeData.put("ctz", 1); // Cotización en pesos argentinos de la moneda utilizada
        qrCodeData.put("tipoDocRec", 80); // Código del Tipo de documento del receptor
        qrCodeData.put("nroDocRec", 12345678912L); // Número de documento del receptor
        qrCodeData.put("tipoCodAut", "E"); // “A” para comprobante autorizado por CAEA, “E” para comprobante autorizado por CAE
        qrCodeData.put("codAut", 12345678912345L); // CAE o CAEA, según corresponda

        // Convertimos los datos a JSON y los codificamos en Base64
        String json = new Gson().toJson(qrCodeData);
        String qrCodeText = "https://www.afip.gob.ar/fe/qr/?p=" + Base64.getUrlEncoder().encodeToString(json.getBytes());

        // Generamos el QR
        QRCodeWriter qrCodeWriter = new QRCodeWriter();
        int width = 200;
        int height = 200;
        try {
            BitMatrix bitMatrix = qrCodeWriter.encode(qrCodeText, BarcodeFormat.QR_CODE, width, height);

            // Guardamos el QR como una imagen PNG
            Path path = FileSystems.getDefault().getPath("./qr-afip.png");
            MatrixToImageWriter.writeToPath(bitMatrix, "PNG", path);
            System.out.println("QR generado correctamente: " + path.toAbsolutePath());

            // O convertimos el QR a Base64 para usarlo en HTML
            ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
            MatrixToImageWriter.writeToStream(bitMatrix, "PNG", byteArrayOutputStream);
            String base64Image = Base64.getEncoder().encodeToString(byteArrayOutputStream.toByteArray());

            System.out.println("Base64 para <img>: data:image/png;base64," + base64Image);

        } catch (WriterException | IOException e) {
            System.err.println("Error al generar el QR: " + e.getMessage());
        }
    }
}

QR de AFIP

Ya tenemos el QR listo para nuestro comprobante.

Conéctate a AFIP/ARCA
sin vueltas

Certificados, código, tutoriales, soporte... Todo lo que necesitas para usar los web services de AFIP/ARCA en un solo lugar.