ISO8601, 'data' => array]. - Интерфейс отображает только метку времени и содержимое data. */ $EXPECTED_KEY = '1234567'; $LOG_FILE = __DIR__ . '/webhook_demo.log'; $MAX_SHOW = 50; function send_json(int $code, $data): void { http_response_code($code); header('Content-Type: application/json; charset=utf-8'); echo json_encode($data, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); exit; } function esc($s): string { return htmlspecialchars((string)$s, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); } /* Разбор тела запроса: поддерживается JSON, form-data и raw-пары */ function parse_input_payload(): array { $ct = $_SERVER['CONTENT_TYPE'] ?? ''; $raw = file_get_contents('php://input') ?: ''; if (stripos((string)$ct, 'application/json') !== false) { $d = @json_decode($raw, true); if (is_array($d)) return $d; } if (!empty($_POST)) return $_POST; if ($raw !== '') { parse_str($raw, $vars); if (!empty($vars)) return $vars; $d = @json_decode($raw, true); if (is_array($d)) return $d; } return []; } /* Формируем запись для лога: только time + data */ function normalize_event(array $raw): array { $data = (isset($raw['data']) && is_array($raw['data'])) ? $raw['data'] : $raw; if (empty($data['id']) && !empty($data['publicId'])) { $data['id'] = (string)$data['publicId']; } return [ 'time' => date('c'), 'data' => $data, ]; } /* Запись в лог: строка JSON на каждой строке */ function append_log(string $file, array $entry): bool { $line = json_encode($entry, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES); if ($line === false) return false; return file_put_contents($file, $line . PHP_EOL, FILE_APPEND | LOCK_EX) !== false; } /* Чтение последних N записей из лога */ function read_last_entries(string $file, int $n): array { if (!is_readable($file)) return []; $lines = @file($file, FILE_IGNORE_NEW_LINES | FILE_SKIP_EMPTY_LINES); if (!is_array($lines) || count($lines) === 0) return []; $lines = array_slice($lines, -$n); $out = []; foreach ($lines as $ln) { $obj = @json_decode($ln, true); if (is_array($obj)) $out[] = $obj; } return array_reverse($out); } /* ---------- main ---------- */ $method = $_SERVER['REQUEST_METHOD'] ?? 'GET'; $key = $_GET['key'] ?? ''; if ($EXPECTED_KEY !== '' && $key !== $EXPECTED_KEY) { http_response_code(403); echo 'Forbidden'; exit; } if ($method === 'POST' || $method === 'PUT') { $raw = parse_input_payload(); $evt = normalize_event($raw); // ['time' => ..., 'data' => ...] $ok = append_log($LOG_FILE, $evt); if (!$ok) send_json(500, ['ok' => false, 'error' => 'cannot_write_log']); send_json(200, ['ok' => true]); } /* GET: рендер страницы */ $entries = read_last_entries($LOG_FILE, $MAX_SHOW); ?> Webhook demo — Perezvonok.ru

Perezvonok.ru: демонстрация webhook

Данные от Perezvonok.ru
Записей нет. Сделайте тестовую заявку на вашем сайте и обновите страницу.
Показаны только поля из data
'.esc($k).':
'.esc(is_scalar($d[$k]) ? $d[$k] : json_encode($d[$k], JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES)).'
'; } } if (!empty($d['utm_first']) && is_array($d['utm_first'])) { echo '
utm_first:
'.esc(json_encode($d['utm_first'], JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES)).'
'; } if (!empty($d['utm_last']) && is_array($d['utm_last'])) { echo '
utm_last:
'.esc(json_encode($d['utm_last'], JSON_UNESCAPED_UNICODE|JSON_PRETTY_PRINT|JSON_UNESCAPED_SLASHES)).'
'; } $skip = ['utm_raw'=>1,'utm_all'=>1,'utm_first'=>1,'utm_last'=>1]; foreach ($d as $k => $v) { if (isset($skip[$k])) continue; if (in_array($k, $order, true)) continue; if ($v === null) continue; if (is_string($v) && trim($v) === '') continue; echo '
'.esc($k).':
'.esc(is_scalar($v) ? $v : json_encode($v, JSON_UNESCAPED_UNICODE|JSON_UNESCAPED_SLASHES)).'
'; } ?>
Raw entry (лог):