چطور می‌توانیم کمک کنیم؟

کوتاه بفرمایید موضوع چیست؛ از طریق ایمیل با شما تماس می‌گیریم.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.
رفتن به صفحه اصلی

Webhooks: eventos a su servidor

Webhooks firmados y REST hooks de reactive.chat: eventos, cabeceras, cuerpo, verificación de firmas con HMAC-SHA256, reintentos, tiempos de espera, desactivación y ejemplos de verificación en PHP, Node y Python.

Los webhooks comunican a su servidor lo que ocurre en el chat: una conversación nueva, un mensaje nuevo, una transferencia al equipo o una valoración. Hay dos vías:

Eventos

Las conversaciones de la búsqueda del sitio web (Smart Answer) solo generan eventos cuando se hacen visibles como chat.

Configurar el webhook firmado

En su cuenta, en Ajustes → Integraciones → Webhooks (permiso: gestionar integraciones):

Al guardar no se envía ninguna llamada de prueba. Tras activarlo, los eventos pueden tardar hasta unos 15 segundos en empezar a enviarse; los anteriores a la activación no se entregan retroactivamente.

La entrega

POST /rc-webhook HTTP/1.1
Host: hooks.your-company.com
Content-Type: application/json; charset=utf-8
User-Agent: reactive.chat-webhook/1.0
X-RC-Event: csat.submitted
X-RC-Delivery: 01JAB3C4D5E6F7G8H9JKMNPQRS
X-RC-Timestamp: 1792503600
X-RC-Signature: sha256=3f0a1c...

{"id":"01JAB3C4D5E6F7G8H9JKMNPQRS","event":"csat.submitted","ts":1792503600,"site_key":"ABCDEFGHJKLMNPQRSTUVWX12","conversation_id":"01JAB2...","session_id":"s_...","visitor_id":"v_...","data":{"score":5,"comment":"Very helpful"}}

Cabeceras:

Cuerpo:

Verificar la firma

Verifique antes de cualquier procesamiento: marca de tiempo con una antigüedad máxima de 300 segundos, firma sobre el cuerpo sin procesar y comparación en tiempo constante.

PHP:

<?php
$geheim = getenv('RC_WEBHOOK_SECRET');
$body   = file_get_contents('php://input');
$ts     = $_SERVER['HTTP_X_RC_TIMESTAMP'] ?? '';
$sig    = $_SERVER['HTTP_X_RC_SIGNATURE'] ?? '';

if (!ctype_digit($ts) || abs(time() - (int) $ts) > 300) { http_response_code(401); exit; }
$soll = 'sha256=' . hash_hmac('sha256', $ts . '.' . $body, $geheim);
if (!hash_equals($soll, $sig)) { http_response_code(401); exit; }

$ereignis = json_decode($body, true);
// detect duplicates: remember $ereignis['id']
http_response_code(204);

Node.js (Express):

const crypto = require('crypto');
app.post('/rc-webhook', express.raw({ type: 'application/json' }), (req, res) => {
  const ts = req.get('X-RC-Timestamp') || '';
  const sig = req.get('X-RC-Signature') || '';
  if (!/^\d+$/.test(ts) || Math.abs(Date.now() / 1000 - Number(ts)) > 300) return res.sendStatus(401);
  const soll = 'sha256=' + crypto.createHmac('sha256', process.env.RC_WEBHOOK_SECRET)
    .update(ts + '.' + req.body.toString('utf8')).digest('hex');
  if (sig.length !== soll.length || !crypto.timingSafeEqual(Buffer.from(sig), Buffer.from(soll))) {
    return res.sendStatus(401);
  }
  const ereignis = JSON.parse(req.body.toString('utf8'));
  res.sendStatus(204);
  verarbeiteSpaeter(ereignis);   // respond quickly, work afterwards
});

Python (Flask):

import hmac, hashlib, os, time
from flask import request, abort

@app.post("/rc-webhook")
def rc_webhook():
    ts = request.headers.get("X-RC-Timestamp", "")
    sig = request.headers.get("X-RC-Signature", "")
    body = request.get_data()                      # raw bytes
    if not ts.isdigit() or abs(time.time() - int(ts)) > 300:
        abort(401)
    soll = "sha256=" + hmac.new(os.environ["RC_WEBHOOK_SECRET"].encode(),
                                ts.encode() + b"." + body, hashlib.sha256).hexdigest()
    if not hmac.compare_digest(soll, sig):
        abort(401)
    return "", 204

Respuestas, reintentos y desactivación

Responda rápidamente con un 2xx y procese después. Tiempos de espera: 4 segundos para establecer la conexión y 10 segundos en total. No se siguen redirecciones.

Los eventos con más de una hora de antigüedad dejan de entregarse. Si se acumulan errores (5 en 60 segundos), la entrega a su destino se pausa durante 30 segundos; después se reintentan las tareas. El chat nunca espera a su webhook.

No se garantiza el orden de las entregas. Si es necesario, ordene por ts o por el seq de los mensajes de la API.

REST hooks (Zapier, Make, n8n)

Las herramientas de automatización registran sus destinos por sí mismas mediante la API de servidor. También puede hacerlo directamente:

curl -X POST https://reactive.chat/v1/hooks \
  -H "Authorization: Bearer rc_live_..." \
  -H "Content-Type: application/json" \
  -d '{"event":"message.created","target_url":"https://hooks.your-company.com/rc","source":"n8n"}'

Entrega de un REST hook:

POST https://hooks.your-company.com/rc
Content-Type: application/json
User-Agent: reactive.chat-n8n/1.0
X-RC-Event: message.created
X-RC-Delivery: 01JAB3...

{"event":"message.created","delivery_id":"01JAB3...","data":{"name":"message.created","ts":1792503600123,"site_key":"...","conversation_id":"...","session_id":"...","visitor_id":"...","message":{"id":"...","seq":7,"kind":"text","direction":"in","author_type":"bot","author_name":"Assistant","via":null,"body":"…","redacted":false,"ts":1792503600120}}}

Qué no existe

Siguiente: API de servidor

آخرین به‌روزرسانی: