En el ecosistema tributario peruano, emitir boletas y facturas electrónicas de forma síncrona en el punto de venta es inviable durante campañas de alta demanda. La indisponibilidad temporal de los servidores de SUNAT o de los Operadores de Servicios Electrónicos (OSE) no puede detener la operación en caja.
# 1. Desacoplamiento de la Venta respecto a la Homologación Fiscal
El principio fundamental de una arquitectura resiliente es que la transacción comercial en caja debe completarse en menos de 300ms, emitiendo el ticket con su respectivo código hash tributario calculado localmente, mientras que el envío y recepción del CDR (Constancia de Recepción) se gestiona de forma asíncrona mediante colas de mensajes durables.
# 2. Firma Criptográfica de XMLs UBL 2.1 en Node.js
La firma digital exige canonizar el árbol XML según la especificación C14N e insertar la clave pública del certificado digital X.509 en el nodo ExtensionContent sin invalidar la integridad estructural del estándar UBL.
import { SignedXml } from 'xml-crypto';
import { readFileSync } from 'fs';
export function firmarComprobanteUBL(xmlString: string, pfxPath: string, password: string): string {
const pfxBuffer = readFileSync(pfxPath);
const { privateKey, certificate } = extraerCertificado(pfxBuffer, password);
const sig = new SignedXml();
sig.signingKey = privateKey;
sig.signatureAlgorithm = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256";
sig.canonicalizationAlgorithm = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315";
sig.addReference(
"//*[local-name(.)='ExtensionContent'][1]",
["http://www.w3.org/2000/09/xmldsig#enveloped-signature", "http://www.w3.org/TR/2001/REC-xml-c14n-20010315"],
"http://www.w3.org/2001/04/xmlenc#sha256"
);
sig.computeSignature(xmlString);
return sig.getSignedXml();
}# 3. Estrategia de Reintentos con Backoff Exponencial y Detección de Caídas
Si el web service de OSE responde con códigos HTTP 500, 502 o agota el timeout de 5 segundos, el comprobante se encola en Redis con política de reintentos exponenciales (10s, 30s, 2m, 15m), evitando saturar el canal de red.
- Validación previa del esquema XSD en local para evitar enviar XMLs con errores de sintaxis a SUNAT.
- Generación instantánea del PDF térmico con código QR y Hash SHA-1 para el cliente.
- Almacenamiento automático del CDR firmado en almacenamiento de objetos S3/MinIO para auditoría.