- Desarrolladores
- Guías
- Webhooks: entérate de cada cambio
Webhooks: entérate de cada cambio
Recibe un POST firmado cada vez que cambia el menú, en vez de consultar la API cada rato.
En vez de consultar la API cada rato, registra una URL y Delimenu le enviará un POST cada vez que cambie el menú: al crear, editar o borrar un producto o una categoría, y al cambiar los datos del restaurante. Se crean desde Configuración › Webhooks en el panel o con POST /restaurants/{ref}/webhooks, hasta 5 por restaurante.
Eventos disponibles: product.created, product.updated, product.deleted, category.created, category.updated, category.deleted, restaurant.updated, restaurant.deleted.
Verificar la firma
Cada petición viene firmada en la cabecera Delimenu-Signature con el secreto del endpoint, que se muestra una sola vez. Verifícala siempre, sobre el cuerpo tal como llegó:
import { createHmac, timingSafeEqual } from 'node:crypto'
// rawBody: the request body exactly as received (a string or Buffer), not re-serialized JSON
export function verifyDelimenuWebhook(rawBody, header, secret) {
const parts = Object.fromEntries(header.split(',').map(part => part.split('=')))
const timestamp = Number(parts.t)
if (!timestamp || Math.abs(Date.now() / 1000 - timestamp) > 300) return false
const expected = createHmac('sha256', secret).update(`${timestamp}.${rawBody}`).digest('hex')
const received = Buffer.from(parts.v1 ?? '', 'hex')
return received.length === 32 && timingSafeEqual(received, Buffer.from(expected, 'hex'))
}
// const ok = verifyDelimenuWebhook(rawBody, req.headers['delimenu-signature'], process.env.DELIMENU_WEBHOOK_SECRET)Reintentos
Responde con cualquier 2xx en menos de 10 segundos y haz el trabajo después. Si falla, reintentamos con espera creciente hasta 8 veces durante cerca de un día, así que usa el id del evento para no procesarlo dos veces. Un endpoint que agota los reintentos en 20 eventos seguidos se desactiva; lo vuelves a activar desde el panel.