Crear QR de AFIP en C#
Con pocas líneas de código
Ivan Muñoz
dic 11, 2024
.NET
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());
}
}
}
Ya tenemos el QR listo para nuestro comprobante.