Integraciones
Webhooks
Endpoints de webhook entrantes para canales Meta: Facebook Messenger, Instagram DM y WhatsApp.
Datos rápidos#
| URL base | https://helpstack.eu/api/webhooks |
| Autenticación (verificación) | hub.verify_token debe coincidir con el token de verificación configurado (handshake GET) |
| Autenticación (recepción) | x-hub-signature-256: sha256=<HMAC-SHA256(rawBody, FACEBOOK_APP_SECRET)> |
| Content-Type | application/json |
| Visibilidad | Los endpoints son públicos; la seguridad la proveen el token + la firma |
Los webhooks se reciben en helpstack.eu; usted registra esa URL de callback en el panel de Meta App. El token de verificación y el secreto de la aplicación son configurados por HelpStack (consulte las variables de entorno mencionadas a continuación).
Cómo funciona el handshake (todos los proveedores)#
Meta verifica un webhook enviando un GET con tres parámetros de consulta. HelpStack devuelve el challenge solo si el token de verificación coincide.
GET /api/webhooks/facebook
?hub.mode=subscribe
&hub.verify_token=TOKEN
&hub.challenge=CHALLENGE
- Si
TOKENcoincide con el token de verificación configurado → responder200con el valor raw deCHALLENGE. - De lo contrario → responder
403.
Cómo funciona la verificación de firma (todos los proveedores)#
Cada POST lleva un encabezado x-hub-signature-256. La firma se calcula sobre el cuerpo raw de la solicitud usando HMAC-SHA256 con clave FACEBOOK_APP_SECRET, precedida por sha256=.
x-hub-signature-256: sha256=<hex HMAC-SHA256(rawBody, FACEBOOK_APP_SECRET)>
Ejemplo en Node (cómo calcular/verificar):
import crypto from 'node:crypto';
function verifySignature(rawBody, headerValue, appSecret) {
const expected =
'sha256=' +
crypto.createHmac('sha256', appSecret).update(rawBody).digest('hex');
return headerValue === expected;
}
Atención — use el cuerpo raw. La firma se calcula sobre los bytes exactos enviados por Meta. HelpStack lee el cuerpo como texto raw antes de parsear el JSON. Si construye su propio verificador, no vuelva a serializar el objeto JSON parseado (el orden de claves/espacios en blanco diferirá y la firma no coincidirá). Capture el string del cuerpo raw y calcule el HMAC sobre ese.
Facebook / Messenger#
| Endpoint de verificación | GET /api/webhooks/facebook |
| Endpoint de recepción | POST /api/webhooks/facebook |
| Clave de firma | FACEBOOK_APP_SECRET |
| Env del token de verificación | FACEBOOK_VERIFY_TOKEN |
Forma del payload entrante. El cuerpo contiene un array entry[]. Cada entrada tiene:
entry[].messaging[]— formato Messenger heredado, oentry[].changes[]— formato más reciente.
Coincidencia de canal y procesamiento. El manejador hace coincidir un canal por facebookPageId / credentials.pageId, luego:
- Crea o actualiza una conversación identificada por el PSID del remitente.
- Almacena el mensaje entrante.
- Obtiene el perfil del remitente y descarga adjuntos al almacenamiento.
- Emite un evento en tiempo real al panel de control.
Instagram#
| Endpoint | GET/POST /api/webhooks/instagram |
| Clave de firma | FACEBOOK_APP_SECRET |
| Env del token de verificación | INSTAGRAM_VERIFY_TOKEN (recurre a FACEBOOK_VERIFY_TOKEN) |
Hace coincidir canales gestionados por OAuth por id de cuenta de Instagram. El handshake y la verificación de firma funcionan igual que en Facebook.
WhatsApp#
| Endpoint | GET/POST /api/webhooks/whatsapp |
| Clave de firma | FACEBOOK_APP_SECRET |
| Env del token de verificación | WHATSAPP_VERIFY_TOKEN (recurre a FACEBOOK_VERIFY_TOKEN) |
Forma del payload entrante. El cuerpo contiene entry[].changes[].value con messages[] y contacts[]. El manejador hace coincidir un canal por credentials.phoneNumberId e identifica la conversación por el número de teléfono del remitente.
Variables de entorno#
| Variable | Usada por | Propósito |
|---|---|---|
FACEBOOK_APP_SECRET | FB, IG, WhatsApp | Clave de firma HMAC-SHA256 para x-hub-signature-256 |
FACEBOOK_VERIFY_TOKEN | FB (fallback para IG/WhatsApp) | Token de verificación del handshake GET |
INSTAGRAM_VERIFY_TOKEN | Token de verificación; recurre a FACEBOOK_VERIFY_TOKEN | |
WHATSAPP_VERIFY_TOKEN | Token de verificación; recurre a FACEBOOK_VERIFY_TOKEN |
Registrar en el panel de Meta App#
Para Messenger (el mismo patrón aplica a Instagram y WhatsApp con sus respectivos endpoints):
- En el panel de Meta App, abra el producto (Messenger / Instagram / WhatsApp) → Webhooks.
- URL de callback:
https://helpstack.eu/api/webhooks/facebook(Instagram:.../api/webhooks/instagram, WhatsApp:.../api/webhooks/whatsapp.) - Token de verificación: el valor que configuró en
FACEBOOK_VERIFY_TOKEN(o el token específico del proveedor). - Haga clic en Verify and Save — Meta envía el handshake
GET; tiene éxito cuando el token coincide. - Suscribirse a campos: suscríbase a los campos
messages/messagingpara que los eventos de mensajes se entreguen. - Asegúrese de que el App Secret de su aplicación coincida con
FACEBOOK_APP_SECRETpara que la verificación de firma pase enPOST.
Después de guardar, envíe un mensaje de prueba a la página/cuenta — debería aparecer como una nueva conversación en el panel de control.