Crear QR de AFIP en C#

Con pocas líneas de código


Crear QR de AFIP en C#

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 SkiaSharp y Newtonsoft.Json

dotnet add package SkiaSharp
dotnet add package ZXing.Net
dotnet add package ZXing.Net.Bindings.SkiaSharp
dotnet add package Newtonsoft.Json

Y generamos el codigo QR

using System;
using System.Collections.Generic;
using System.Text;
using Newtonsoft.Json;
using SkiaSharp;
using ZXing.SkiaSharp;

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

        // Convertimos los datos a JSON y luego a Base64
        string jsonData = JsonConvert.SerializeObject(qrCodeData);
        string base64Data = Convert.ToBase64String(Encoding.UTF8.GetBytes(jsonData));

        // Preparamos el texto para el QR
        string qrCodeText = $"https://www.afip.gob.ar/fe/qr/?p={base64Data}";

        // Generamos el QR con SkiaSharp
        var qrCode = GenerateQrCode(qrCodeText, 200);

        // Guardamos el QR como archivo PNG
        string outputFilePath = "./qr-afip.png";
        using (var stream = System.IO.File.OpenWrite(outputFilePath))
        {
            qrCode.Encode(stream, SKEncodedImageFormat.Png, 100);
        }
        Console.WriteLine($"QR guardado en {outputFilePath}");

        // O convertimos el QR a Base64 para usar en un tag <img>
        string base64Image = ConvertQrToBase64(qrCode);
        Console.WriteLine($"data:image/png;base64,{base64Image}");
    }

    static SKBitmap GenerateQrCode(string text, int size)
    {
        // Generar el QR utilizando ZXing.Net
        var writer = new ZXing.SkiaSharp.BarcodeWriter
        {
            Format = ZXing.BarcodeFormat.QR_CODE,
            Options = new ZXing.Common.EncodingOptions
            {
                Height = size,
                Width = size,
                Margin = 1
            }
        };
        return writer.Write(text);
    }

    static string ConvertQrToBase64(SKBitmap qrCode)
    {
        using (var image = SKImage.FromBitmap(qrCode))
        using (var data = image.Encode(SKEncodedImageFormat.Png, 100))
        {
            return Convert.ToBase64String(data.ToArray());
        }
    }
}

QR de AFIP

Ya tenemos el QR listo para nuestro comprobante.

Conectate a AFIP sin vueltas

Certificados, codigo, tutoriales, soporte, todo lo que necesitas para usar los web services de AFIP en un solo lugar.