Polling vs webhook
Hacienda demora segundos o minutos en resolver un comprobante. Tenés dos formas de enterarte del resultado: consultar repetidamente (polling) o recibir una notificación (webhook). El primero es simple pero caro y lento; el segundo es la opción recomendada cuando podés exponer un endpoint público.
Patrón polling (no recomendado)
Consultás el detalle del comprobante en bucle hasta que cambie de estado. Sirve para pruebas locales o cuando no podés exponer un endpoint público.
async function esperarHacienda(clave, maxIntentos = 30) {
for (let i = 0; i < maxIntentos; i++) {
const { data } = await axios.get(`/api/v1/facturas/${clave}`);
if (data.estadoHacienda === 'aceptado') return data;
if (data.estadoHacienda === 'rechazado') throw new Error('Rechazado');
await sleep(30000); // 30s
}
throw new Error('Timeout esperando Hacienda');
}Patrón webhook (recomendado)
Emitís y olvidás. LX CloudPos te notifica cuando Hacienda responde y vos solo lees el resultado de tu propia base de datos.
// 1. Emisor: emite y olvida
await emitirFactura(data);
// 2. Receptor webhook: marca el resultado
app.post('/webhooks/lxs', verificarHmac, async (req, res) => {
const evento = parsearEvento(req.body);
await db.facturas.update({
where: { clave: evento.clave },
data: { estadoFinal: evento.ind_estado }
});
res.status(200).end();
});
// 3. Frontend: consulta el estado de la BD propia, sin tocar la API