Nola lagun zaitzakegu?

Esaguzu labur zertaz ari zaren, eta posta elektronikoz erantzungo dizugu.

This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.
Itzuli hasierako orrira

Webhook’lar: sunucunuza olaylar

reactive.chat imzalı webhook’ları ve REST hook’ları: olaylar, başlıklar, gövde, HMAC-SHA256 imza doğrulaması, yeniden denemeler, zaman aşımları, devre dışı bırakma; PHP, Node ve Python doğrulama örnekleri.

Webhook’lar sohbette olanları sunucunuza bildirir: yeni sohbet, yeni mesaj, ekibe aktarma, değerlendirme. İki yol vardır:

Olaylar

Site içi aramadan gelen sohbetler (Smart Answer) yalnızca sohbet olarak görünür olduklarında olay tetikler.

İmzalı webhook kurulumu

Hesabınızda Ayarlar → Entegrasyonlar → Webhook’lar altında (yetki: entegrasyonları yönetme):

Kaydederken test çağrısı gönderilmez. Açıldıktan sonra olayların gelmeye başlaması yaklaşık 15 saniyeyi bulabilir; açılmadan önceki olaylar sonradan iletilmez.

İletim

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"}}

Başlıklar:

Gövde:

İmzayı doğrulama

Herhangi bir işlemden önce doğrulayın: zaman damgası en fazla 300 saniye eski, imza ham gövde üzerinden, sabit süreli karşılaştırma.

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

Yanıtlar, yeniden denemeler, devre dışı bırakma

Hızlıca 2xx yanıtı verip ardından işleyin. Zaman aşımları: bağlantı kurulumu için 4 saniye, toplam 10 saniye. Yönlendirmeler izlenmez.

Bir saatten eski olaylar artık iletilmez. Hatalar birikirse (60 saniyede 5) hedefinize iletim 30 saniye duraklar; ardından işler yeniden denenir. Sohbet webhook’unuzu asla beklemez.

İletim sırası garanti edilmez. Gerekirse ts veya API’den gelen mesajların seq değerine göre sıralayın.

REST hook’ları (Zapier, Make, n8n)

Otomasyon araçları sunucu API’si üzerinden hedeflerine kendileri abone olur. Bunu doğrudan da kullanabilirsiniz:

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"}'

REST hook iletimi:

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}}}

Bulunmayan özellikler

Sonraki: Sunucu API’si

Azken eguneratzea: