setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); } return $pdo; } function ensureTables($pdo) { $pdo->exec("CREATE TABLE IF NOT EXISTS admin.webhooks (id SERIAL PRIMARY KEY, name VARCHAR(255), url TEXT, method VARCHAR(10) DEFAULT 'POST', headers JSONB, status VARCHAR(50) DEFAULT 'active', last_triggered TIMESTAMP, success_count INTEGER DEFAULT 0, error_count INTEGER DEFAULT 0, created_at TIMESTAMP DEFAULT NOW())"); $pdo->exec("CREATE TABLE IF NOT EXISTS admin.webhook_logs (id SERIAL PRIMARY KEY, webhook_id INTEGER, request_body TEXT, response_code INTEGER, response_body TEXT, latency_ms INTEGER, status VARCHAR(50), created_at TIMESTAMP DEFAULT NOW())"); $pdo->exec("CREATE TABLE IF NOT EXISTS admin.webhook_incoming (id SERIAL PRIMARY KEY, endpoint VARCHAR(100), method VARCHAR(10), headers JSONB, body TEXT, ip VARCHAR(50), created_at TIMESTAMP DEFAULT NOW())"); } function triggerWebhook($webhook, $payload) { $start = microtime(true); $ch = curl_init($webhook['url']); $headers = json_decode($webhook['headers'] ?: '{}', true) ?: []; $headerList = ['Content-Type: application/json']; foreach ($headers as $k => $v) $headerList[] = "$k: $v"; curl_setopt_array($ch, [CURLOPT_CUSTOMREQUEST => $webhook['method'], CURLOPT_POSTFIELDS => json_encode($payload), CURLOPT_RETURNTRANSFER => true, CURLOPT_HTTPHEADER => $headerList, CURLOPT_TIMEOUT => 30]); $response = curl_exec($ch); $code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); return ['code' => $code, 'response' => $response, 'latency' => round((microtime(true) - $start) * 1000), 'success' => $code >= 200 && $code < 300]; } if (isset($_GET['incoming'])) { $pdo = getDb(); ensureTables($pdo); $stmt = $pdo->prepare("INSERT INTO admin.webhook_incoming (endpoint, method, headers, body, ip) VALUES (?, ?, ?, ?, ?)"); $stmt->execute([$_GET['incoming'], $_SERVER['REQUEST_METHOD'], json_encode(getallheaders()), file_get_contents('php://input'), $_SERVER['REMOTE_ADDR']]); echo json_encode(['success' => true, 'id' => $pdo->lastInsertId()]); exit; } if (isset($_GET['action'])) { header('Content-Type: application/json'); $pdo = getDb(); ensureTables($pdo); switch ($_GET['action']) { case 'stats': $webhooks = $pdo->query("SELECT COUNT(*) FROM admin.webhooks")->fetchColumn(); $today = $pdo->query("SELECT COUNT(*) FROM admin.webhook_logs WHERE created_at > NOW() - INTERVAL '24 hours'")->fetchColumn(); $success = $pdo->query("SELECT COUNT(*) FROM admin.webhook_logs WHERE status = 'success' AND created_at > NOW() - INTERVAL '24 hours'")->fetchColumn(); $incoming = $pdo->query("SELECT COUNT(*) FROM admin.webhook_incoming WHERE created_at > NOW() - INTERVAL '24 hours'")->fetchColumn(); echo json_encode(['webhooks' => (int)$webhooks, 'today' => (int)$today, 'success' => (int)$success, 'incoming' => (int)$incoming]); break; case 'list': echo json_encode($pdo->query("SELECT * FROM admin.webhooks ORDER BY name")->fetchAll(PDO::FETCH_ASSOC)); break; case 'add': $stmt = $pdo->prepare("INSERT INTO admin.webhooks (name, url, method, headers) VALUES (?, ?, ?, ?)"); $stmt->execute([$_POST['name'] ?? '', $_POST['url'] ?? '', $_POST['method'] ?? 'POST', $_POST['headers'] ?? '{}']); echo json_encode(['success' => true]); break; case 'delete': $pdo->exec("DELETE FROM admin.webhooks WHERE id = " . intval($_POST['id'] ?? 0)); echo json_encode(['success' => true]); break; case 'trigger': $id = intval($_POST['id'] ?? 0); $payload = json_decode($_POST['payload'] ?? '{}', true) ?: []; $webhook = $pdo->query("SELECT * FROM admin.webhooks WHERE id = $id")->fetch(PDO::FETCH_ASSOC); if (!$webhook) { echo json_encode(['error' => 'Not found']); break; } $result = triggerWebhook($webhook, $payload); $stmt = $pdo->prepare("INSERT INTO admin.webhook_logs (webhook_id, request_body, response_code, response_body, latency_ms, status) VALUES (?, ?, ?, ?, ?, ?)"); $stmt->execute([$id, json_encode($payload), $result['code'], $result['response'], $result['latency'], $result['success'] ? 'success' : 'error']); $field = $result['success'] ? 'success_count' : 'error_count'; $pdo->exec("UPDATE admin.webhooks SET $field = $field + 1, last_triggered = NOW() WHERE id = $id"); echo json_encode($result); break; case 'logs': $where = isset($_GET['webhook_id']) ? "WHERE webhook_id = " . intval($_GET['webhook_id']) : ""; echo json_encode($pdo->query("SELECT l.*, w.name as webhook_name FROM admin.webhook_logs l LEFT JOIN admin.webhooks w ON l.webhook_id = w.id $where ORDER BY l.created_at DESC LIMIT 100")->fetchAll(PDO::FETCH_ASSOC)); break; case 'incoming_logs': echo json_encode($pdo->query("SELECT * FROM admin.webhook_incoming ORDER BY created_at DESC LIMIT 100")->fetchAll(PDO::FETCH_ASSOC)); break; default: echo json_encode(['error' => 'Unknown']); } exit; } $pdo = getDb(); ensureTables($pdo); $incomingUrl = 'http://' . $_SERVER['HTTP_HOST'] . '/webhook-manager.php?incoming=my-endpoint'; ?> Webhook Manager - WEVAL SEND

Webhook Manager

-
Webhooks
-
Triggered 24h
-
Success
-
Incoming 24h
Outgoing
Incoming
Logs

Outgoing Webhooks

NameURLMethodOKErrLastActions

Incoming Webhooks

Receive webhooks at:

EndpointMethodIPBodyDate

Logs

WebhookCodeLatencyStatusDate