Входящий webhook (ваш сервер → PlatParts)
Способ передать событие или команду из CRM в магазин. Обработка — в PHP‑классе из manifest (inbound_webhook).
URL
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 подключения (массив кредов инстанса):
{
"inbound_webhook_secret": "длинный-случайный-секрет"
}
Подпись:
X-Integration-Signature = HMAC-SHA256(raw_body, inbound_webhook_secret)
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:
"capabilities": {
"inbound_webhook": "Modules\\Integrations\\MyCrm\\MyCrmInboundWebhookHandler"
}
Класс:
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
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).