
Мова 🇺🇦 Українська
Огляд
Реалізація
За лаштунками
За допомогою FastComments можна викликати кінцеву точку API щоразу, коли коментар додається, оновлюється або видаляється з нашої системи.
Ми реалізуємо це за допомогою асинхронних вебхуків через HTTP/HTTPS.
Що таке вебхуки 
Вебхук — це механізм або інтеграція між двома системами, де "виробник" (FastComments) ініціює подію яку "споживач" (Ви) обробляє через виклик API.
Підтримувані події та ресурси 
FastComments підтримує вебхуки лише для ресурсу Comment.
Ми підтримуємо вебхуки для створення коментаря, видалення та оновлення.
Кожен із цих випадків вважається окремою подією в нашій системі і тому має різну семантику та структуру подій вебхука.
Налаштування локальної розробки 
Для локальної розробки використовуйте інструмент на кшталт ngrok.
Щоб спростити підтримку безпеки системи, локальна розробка слідує тому ж процесу, що й налаштування та захист інших середовищ.
Step 1: Add "localhost" to domains in your account.
Додайте "localhost" як домен тут.
Step 2: Pick an API Key
Ми будемо додавати конфігурацію webhook для вашого домену, тому нам знадобиться API key. Ви можете зробити це тут.
Під «Associate with domain» — виберіть ваш домен "localhost".
NOTE: Alternatively, you can use one API Secret for all testing activity and staging environments. Simply add an API Secret for "All Domains", and give it a name like "test".
Переконайтесь, що у вас визначено API Secret для ваших продукційних доменів. Події для всіх інших доменів використовуватимуть загальний (тестовий) секрет.
Step 3: Add Your Webhook
Поки запущено ngrok або подібний інструмент, встановіть значення для "localhost" тут.
When clicking Send Test Payload, ми надішлемо два тестові події, щоб перевірити, що ви валідируєте API key.
Після успішної валідації натисніть Save.
Step 4: Add A Comment
Тепер ви можете додавати, редагувати або видаляти коментарі та повинні побачити, як ми викликаємо вашу локальну машину розробника цими подіями, використовуючи ваш тестовий API key. Може бути затримка до 30 секунд щоб події дісталися до вашої машини.
Налаштування 
Виконайте ті самі кроки для localhost, що й для production. Переконайтеся, що у вас налаштовані production domains та API Secrets.
Спочатку перейдіть до Webhooks admin. Це доступно через Manage Data -> Webhooks.
The configuration page appears as follows:
На цій сторінці ви можете вказати endpoints для кожного типу події коментаря.
Для кожного типу подій обов'язково натискайте Send Test Payload, щоб переконатися, що інтеграція налаштована правильно. Деталі див. у наступному розділі "Testing".
Тестування 
У розділі адміністрування Webhooks є кнопки Send Test Payload для кожного типу події (Create, Update, Delete). Події Create і Update надсилають тестовий об'єкт WebhookComment, а при тестуванні Delete буде надіслано тестове тіло запиту, що містить лише ID.
Перевірка коректності payload'ів
Під час тестування інтеграції webhook переконайтеся, що вхідні запити містять наступні заголовки:
token- Ваш API SecretX-FastComments-Timestamp- Unix-мітка часу (у секундах)X-FastComments-Signature- HMAC-SHA256 підпис
Використовуйте перевірку підпису HMAC, щоб переконатися, що payload'и автентичні.
Інструменти для тестування
Ви можете використовувати інструменти, такі як webhook.site або ngrok, щоб переглядати вхідні payload'и webhook під час розробки.
Типи подій
- Create Event: Викликається, коли створюється новий коментар. Default method: PUT
- Update Event: Викликається, коли коментар редагується. Default method: PUT
- Delete Event: Викликається, коли коментар видаляється. Default method: DELETE
Кожна подія містить повні дані коментаря в тілі запиту (див. Структури даних щодо формату payload).
Структури даних 
Єдина структура, що надсилається через вебхуки, — це об'єкт WebhookComment, наведений нижче у TypeScript.
Структура об'єкта WebhookComment
Структура події "Create"
Тіло запиту для події "create" — це об'єкт WebhookComment.
Структура події "Update"
Тіло запиту для події "update" — це об'єкт WebhookComment.
Структура події "Delete"
Тіло запиту для події "delete" — це об'єкт WebhookComment.
Зміни станом на 14 листопада 2023 року
Раніше тіло запиту для події "delete" містило лише id коментаря. Тепер воно містить повний коментар на момент видалення.
Run 
Коли користувачів тегають у коментарі, інформація зберігається у списку, названому mentions. Кожен об'єкт у цьому списку має таку структуру.
Run 
HTTP Methods
Ви можете налаштувати HTTP-метод для кожного типу події вебхука в панелі адміністратора:
- Create Event: POST або PUT (за замовчуванням: PUT)
- Update Event: POST або PUT (за замовчуванням: PUT)
- Delete Event: DELETE, POST або PUT (за замовчуванням: DELETE)
Оскільки всі запити містять ID, операції Create та Update за замовчуванням є ідемпотентними (PUT). Повторення одного й того ж запиту Create або Update не повинно створювати дублікати об'єктів на вашій стороні.
Request Headers
Кожен запит вебхука включає наступні заголовки:
| Header | Description |
|---|---|
Content-Type |
application/json |
token |
Ваш секрет API |
X-FastComments-Timestamp |
Unix-мітка часу (секунди), коли запит було підписано |
X-FastComments-Signature |
HMAC-SHA256 підпис (sha256=<hex>) |
Див. Безпека та API-токени для інформації про перевірку підпису HMAC.
Безпека та API-токени 
FastComments webhook requests include multiple authentication mechanisms for security.
Headers Sent
| Header | Description |
|---|---|
token |
Your API Secret (for backwards compatibility) |
X-FastComments-Timestamp |
Unix timestamp (seconds) when the request was signed |
X-FastComments-Signature |
HMAC-SHA256 signature of the payload |
HMAC Signature Verification (Recommended)
We strongly recommend verifying the HMAC signature to ensure webhook payloads are authentic and haven't been tampered with.
Signature Format: sha256=<hex-encoded-signature>
How the signature is computed:
- Concatenate:
timestamp + "." + JSON_payload_body - Compute HMAC-SHA256 using your API Secret as the key
- Hex-encode the result
Example Verification (Node.js)
const crypto = require('crypto');
function verifyWebhookSignature(req, apiSecret) {
const timestamp = req.headers['x-fastcomments-timestamp'];
const signature = req.headers['x-fastcomments-signature'];
if (!timestamp || !signature) {
return false;
}
// Перевірити, що мітка часу є актуальною (протягом 5 хвилин)
const now = Math.floor(Date.now() / 1000);
if (Math.abs(now - parseInt(timestamp, 10)) > 300) {
return false; // Запобігання повторним атакам (replay attacks)
}
// Перевірка підпису
const payload = JSON.stringify(req.body);
const expectedSignature = crypto
.createHmac('sha256', apiSecret)
.update(`${timestamp}.${payload}`)
.digest('hex');
return signature === `sha256=${expectedSignature}`;
}
Example Verification (Python)
import hmac
import hashlib
import time
import json
def verify_webhook_signature(headers, body, api_secret):
timestamp = headers.get('X-FastComments-Timestamp')
signature = headers.get('X-FastComments-Signature')
if not timestamp or not signature:
return False
# Перевірте, що мітка часу є актуальною
now = int(time.time())
if abs(now - int(timestamp)) > 300:
return False
# Перевірка підпису
payload = json.dumps(body, separators=(',', ':'))
message = f"{timestamp}.{payload}"
expected = hmac.new(
api_secret.encode(),
message.encode(),
hashlib.sha256
).hexdigest()
return signature == f"sha256={expected}"
Example Verification (PHP)
function verifyWebhookSignature($headers, $body, $apiSecret) {
$timestamp = $headers['X-FastComments-Timestamp'] ?? null;
$signature = $headers['X-FastComments-Signature'] ?? null;
if (!$timestamp || !$signature) {
return false;
}
// Перевірте, що мітка часу є актуальною (протягом 5 хвилин)
$now = time();
if (abs($now - intval($timestamp)) > 300) {
return false;
}
// Перевірка підпису
$payload = json_encode($body, JSON_UNESCAPED_SLASHES);
$message = $timestamp . '.' . $payload;
$expectedSignature = 'sha256=' . hash_hmac('sha256', $message, $apiSecret);
return hash_equals($expectedSignature, $signature);
}
Legacy Authentication
The token header containing your API Secret is still sent for backwards compatibility. However, we recommend migrating to HMAC verification for improved security as it protects against replay attacks.
Як це працює та обробка повторних спроб 
Усі зміни об'єкта Comment у системі викликають подію, яка потрапляє в чергу.
Початковий вебхук зазвичай надсилається протягом шести секунд після виникнення джерела події.
Ви можете відстежувати цю чергу в панелі адміністрування Webhooks на випадок, якщо ваш API вийде з ладу.
Якщо запит до вашого API не вдається, ми повторно помістимо його в чергу за певним графіком.
Цей графік — 1 Minute * the retry count. Якщо виклик не вдається один раз, він спробує ще раз через
хвилину. Якщо він не вдасться двічі, тоді зачекає дві хвилини, і так далі. Це зроблено для того, щоб ми
не перевантажували ваш API, якщо він виходить з ладу з причин, пов'язаних з навантаженням.
Вебхуки можна скасувати на сторінці журналу.
На завершення
Цим завершується наша документація Webhooks.
Ми сподіваємося, що інтеграція FastComments Webhook є зрозумілою та швидкою у налаштуванні.
Якщо ви вважаєте, що виявили будь-які прогалини в нашій документації, повідомте нас нижче.