Kaip galime padėti?

Trumpai papasakokite, apie ką klausiate - atsakysime el. paštu.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.
Į pradžios puslapį

Webhooki: zdarzenia do twojego serwera

Podpisane webhooki i REST hooki reactive.chat – zdarzenia, nagłówki, treść, weryfikacja podpisu przez HMAC-SHA256, ponowienia, limity czasu, dezaktywacja i przykłady weryfikacji w PHP, Node i Pythonie.

Webhooki informują twój serwer, co dzieje się w czacie: nowa rozmowa, nowa wiadomość, przekazanie do zespołu, ocena. Są dwie drogi:

Zdarzenia

Rozmowy z wyszukiwarki strony (Smart Answer) wyzwalają zdarzenia dopiero wtedy, gdy stają się widoczne jako czat.

Konfiguracja podpisanego webhooka

W koncie, w sekcji Ustawienia → Integracje → Webhooks (uprawnienie: zarządzanie integracjami):

Przy zapisie nie jest wysyłane żadne wywołanie testowe. Po włączeniu może minąć do ok. 15 sekund, zanim zdarzenia zaczną płynąć; zdarzenia sprzed włączenia nie są dostarczane później.

Dostarczenie

POST /rc-webhook HTTP/1.1
Host: hooks.deine-firma.de
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":"Bardzo pomocne"}}

Nagłówki:

Treść:

Weryfikacja podpisu

Sprawdzaj przed jakimkolwiek przetwarzaniem: znacznik czasu najwyżej 300 sekund wstecz, podpis na surowej treści, porównanie w stałym czasie.

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);
// wykrywanie duplikatów: zapamiętaj $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);   // odpowiedz szybko, przetwarzaj potem
});

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()                      # surowe bajty
    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

Odpowiedzi, ponowienia, dezaktywacja

Odpowiadaj szybko kodem 2xx i przetwarzaj potem. Limity czasu: 4 sekundy na nawiązanie połączenia, 10 sekund łącznie. Przekierowania nie są obsługiwane.

Zdarzenia starsze niż godzina nie są już dostarczane. Gdy błędy się mnożą (5 w ciągu 60 sekund), dostarczanie do twojego celu zostaje wstrzymane na 30 sekund; zadania są potem ponawiane. Czat nigdy nie czeka na twój webhook.

Kolejność dostarczeń nie jest gwarantowana. W razie potrzeby sortuj według ts lub według seq wiadomości z API.

REST hooki (Zapier, Make, n8n)

Narzędzia automatyzacji same rejestrują swoje cele przez API serwera. Możesz z tego korzystać także bezpośrednio:

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.deine-firma.de/rc","source":"n8n"}'

Dostarczenie REST hooka:

POST https://hooks.deine-firma.de/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":"Assistent","via":null,"body":"…","redacted":false,"ts":1792503600120}}}

Czego nie ma

Dalej: API serwera

Paskutinį kartą atnaujinta: