$_POST['name'] ?? '', 'url' => $_POST['url'] ?? '', 'secret' => $_POST['secret'] ?? '', 'is_active' => ($_POST['status'] ?? 'active') === 'active', 'events' => $_POST['events'] ?? [], ]); audit_log($staff['id'], ($action === 'create' ? 'Webhook erstellt: ' : 'Webhook aktualisiert: ') . trim($_POST['name'] ?? '')); flash('success', $action === 'create' ? 'Webhook erstellt.' : 'Änderungen gespeichert.'); redirect('/staff/webhooks.php'); } catch (AdminModelException $e) { $errors[] = $e->getMessage(); } } if ($action === 'delete') { $pdo->prepare('DELETE FROM webhooks WHERE id = ?')->execute([(int) $_POST['id']]); audit_log($staff['id'], 'Webhook gelöscht: #' . (int) $_POST['id']); flash('success', 'Webhook gelöscht.'); redirect('/staff/webhooks.php'); } if ($action === 'test') { $hook = $pdo->prepare('SELECT * FROM webhooks WHERE id = ?'); $hook->execute([(int) $_POST['id']]); if ($row = $hook->fetch()) { $payload = ['event' => 'test', 'occurredAt' => gmdate('c'), 'message' => 'Test-Ereignis von DeskHub']; [$status, $error] = webhook_deliver($row, $payload); $error === null ? flash('success', "Test erfolgreich zugestellt (HTTP {$status}).") : flash('error', 'Test fehlgeschlagen: ' . $error); } redirect('/staff/webhooks.php?edit=' . (int) $_POST['id']); } if ($action === 'reactivate') { $pdo->prepare('UPDATE webhooks SET is_active = 1, fail_count = 0 WHERE id = ?')->execute([(int) $_POST['id']]); redirect('/staff/webhooks.php'); } } $isNew = isset($_GET['new']); $editId = (int) ($_GET['edit'] ?? 0); $showForm = $isNew || $editId || ($errors && in_array($_POST['action'] ?? '', ['create', 'update'], true)); $hooks = $pdo->query('SELECT * FROM webhooks ORDER BY name')->fetchAll(); $editHook = null; if ($editId) { $stmt = $pdo->prepare('SELECT * FROM webhooks WHERE id = ?'); $stmt->execute([$editId]); $editHook = $stmt->fetch() ?: null; } $pageTitle = 'Webhooks'; $activePage = 'webhooks'; require __DIR__ . '/_header.php'; ?>
$_POST[$k] ?? $default; $v = fn(string $k, string $col, $default = '') => $f($k, $editHook[$col] ?? $default); $curActive = $_POST ? (($_POST['status'] ?? 'active') === 'active') : (bool) ($editHook['is_active'] ?? 1); $curEvents = $_POST ? (array) ($_POST['events'] ?? []) : ($editHook ? explode(',', $editHook['events']) : array_keys($eventLabels)); ?>

—

'Webhook', 'events' => 'Ereignisse']); ?>

Ziel

Jede Zustellung enthält den Header X-DeskHub-Signature: sha256=… (HMAC-SHA256 des Körpers mit diesem Geheimnis), damit dein System die Herkunft prüfen kann.

Letzte Zustellung: ' . e($editHook['last_error']) . '' : '' ?> 0 ? ' · ' . (int) $editHook['fail_count'] . ' Fehler in Folge (nach 10 wird der Webhook automatisch deaktiviert)' : '' ?>

Abbrechen
(verwendet die gespeicherten Werte)

Webhooks

Neuen Webhook hinzufügen

DeskHub meldet Ereignisse (Ticket erstellt, beantwortet, Status geändert, zugewiesen) per HTTP-POST an die hinterlegten URLs – z. B. für Chat-Benachrichtigungen oder Ihr eigenes System. Tickets von außen anlegen: API-Schlüssel.

NameURLEreignisseStatusLetzte Zustellung
$eventLabels[$k] ?? $k, explode(',', $h['events'])))) ?> = 10 ? '
wegen Fehlern abgeschaltet
' : '' ?>
' . e($h['last_error']) . '' : ($h['last_status'] ? ' · HTTP ' . (int) $h['last_status'] : '') ?> Bearbeiten ·
·
Noch keine Webhooks angelegt.