База знаний EMS-платформы PlatParts Руководство по настройке EMS-платформы PlatParts
v1.0.0

Входящий webhook

На этой странице 7

Входящий webhook (ваш сервер → PlatParts)

Способ передать событие или команду из CRM в магазин. Обработка — в PHP‑классе из manifest (inbound_webhook).

URL

http
POST https://{домен}/api/integrations/v1/integrations/inbound/{package}/{instance}
Content-Type: application/json
X-Integration-Signature: <hmac от raw body>
Параметр Описание
package Код модуля из manifest (MyCrm)
instance ID подключения из Подключения модулей

Ответ сразу: 202 Accepted {"accepted": true} — тело обрабатывается в очереди integrations.{package}.

Секрет

В credentials подключения (массив кредов инстанса):

json
{
  "inbound_webhook_secret": "длинный-случайный-секрет"
}

Подпись:

code
X-Integration-Signature = HMAC-SHA256(raw_body, inbound_webhook_secret)
Отличие от outbound

Outbound подписывает canonical JSON объекта. Inbound — сырые байты тела запроса. Алгоритмы проверки разные.

Dev: без секрета возможно только при INTEGRATIONS_DEBUG=true и INTEGRATION_INBOUND_REQUIRE_SECRET=false. Иначе 503 с текстом про inbound_webhook_secret.

Ошибки до очереди

HTTP Причина
404 Нет инстанса или неактивен
401 Неверная подпись
403 Пакет не operational (выключен / лицензия)
503 Секрет не задан (prod)

Handler в модуле

Manifest:

json
"capabilities": {
  "inbound_webhook": "Modules\\Integrations\\MyCrm\\MyCrmInboundWebhookHandler"
}

Класс:

php
use App\Integrations\Contracts\IntegrationInboundWebhookHandlerInterface;
use App\Models\IntegrationInstance;
use Illuminate\Http\Request;

final class MyCrmInboundWebhookHandler implements IntegrationInboundWebhookHandlerInterface
{
    public function handle(Request $request, IntegrationInstance $instance): array
    {
        // $instance->credentials, pick_up_point_id, package
        $event = $request->input('event');

        return ['status' => 200, 'body' => ['ok' => true]];
    }
}

Job вызывает handler асинхронно; HTTP‑клиент уже получил 202.

Пример запроса из CRM

bash
BODY='{"event":"status_from_crm","order_id":42,"status_code":"order.ready"}'
SECRET='your-inbound-secret'
SIG=$(echo -n "$BODY" | openssl dgst -sha256 -hmac "$SECRET" | awk '{print $2}')

curl -sS -X POST "https://example.com/api/integrations/v1/integrations/inbound/MyCrm/3" \
  -H "Content-Type: application/json" \
  -H "X-Integration-Signature: $SIG" \
  -d "$BODY"

В handler можно вызвать сервисы ядра (смена статуса, meta) — соблюдайте идемпотентность.

Очередь

Нужен worker на integrations.{package} (тот же, что для hooks.php).

Связанные разделы