Три независимых механизма: REST API, подпись исходящих webhook, подпись входящих webhook.
1. REST API (модуль → PlatParts)
Где: Настройка API — создайте ключ, назначьте роли со scope.
Заголовок:
Authorization: Bearer {identifier}:{secret}
identifier— логин ключа;secret— показывается один раз при создании; хранится как hash.
Ошибки:
| HTTP | Причина |
|---|---|
401 |
Нет Bearer, неверный формат, неверный secret |
403 |
У ключа нет нужного scope |
Scope (права)
| Scope | Доступ |
|---|---|
orders.read |
Список и карточка заказов |
orders.write_status |
Смена статуса заказа и позиций |
orders.write_meta |
Meta заказа |
users.read |
Пользователи |
users.write_meta |
Meta пользователя |
payments.read |
Платежи |
documents.read |
Документы |
documents.write_external_ref |
Внешний ID документа |
organizations.read |
Организации |
products.read |
Товары |
pickup_points.read |
Точки выдачи |
integrations.trigger_sync |
POST .../integrations/{package}/sync |
Роли собирают список scope; у одного ключа может быть несколько ролей.
Привязка к точке выдачи
У ключа можно указать точку выдачи:
orders.read/ смена статусов — только заказы этой точки;- запрос чужого
order_id→403или404(в зависимости от endpoint); - фильтр
?pickup_point_id=должен совпадать с точкой ключа.
Ключ без точки — доступ ко всем заказам (осторожно на проде).
Подробные URL: REST API.
2. Исходящий webhook (PlatParts → ваш сервер)
Секрет задаётся на вкладке Исходящие webhooks подключения.
Заголовок: X-Integration-Signature
Алгоритм: HMAC-SHA256 от канонического JSON всего тела:
{
"hook": "order.created",
"payload": { ... },
"sent_at": "2026-05-29T12:00:00+00:00"
}
Канонизация: рекурсивная сортировка ключей, JSON_UNESCAPED_UNICODE — как App\Integrations\Support\IntegrationJsonSigner.
Inbound подписывает сырое тело запроса ($request->getContent()), не canonical JSON.
3. Входящий webhook (ваш сервер → PlatParts)
Секрет в credentials подключения: ключ inbound_webhook_secret.
Заголовок: X-Integration-Signature: HMAC-SHA256(raw_body, secret)
Dev без секрета: только если INTEGRATIONS_DEBUG=true и INTEGRATION_INBOUND_REQUIRE_SECRET=false. Иначе 503 Configure inbound_webhook_secret.
Переменные окружения
| Переменная | По умолчанию | Назначение |
|---|---|---|
INTEGRATIONS_DEBUG |
false |
Подробные логи, ослабление URL/секретов на dev |
INTEGRATION_INBOUND_REQUIRE_SECRET |
true |
Требовать секрет inbound |
INTEGRATION_OUTBOUND_ALLOW_HTTP |
false |
HTTP URL для outbound (иначе только HTTPS) |
INTEGRATION_API_AUDIT |
true |
Аудит REST‑запросов |