Чеклист перед запуском в проде
Пройдите этот список перед тем, как первый реальный заказ пойдёт через вашу интеграцию.
Ключи и подпись
- API-ключ и HMAC-секрет получены отдельно для прод-окружения (не переиспользован секрет из тестового контура) и хранятся только в секретном хранилище backend — не в коде, не в клиенте. См. Безопасность.
- Формула подписи реализована и сверена с тестовым вектором — оба примера (POST с телом и GET без тела) дают заявленные значения.
-
X-Timestampберётся из системных часов backend, синхронизированных по NTP (допуск сервера — 60 секунд). -
X-Request-ID— новый UUID на каждый HTTP-запрос, включая повторные попытки одного и того же заказа. - Секрет вебхука (
webhookSecret) отличается от API-секрета и хранится отдельно.
Идемпотентность и ретраи
-
externalOrderIdгенерируется и сохраняется на вашей стороне до первой отправки заказа, не заново при каждой попытке. - Ретраи
POST /v1/ordersпри таймауте/5xx используют тот жеexternalOrderIdи то же содержимое, но новыйX-Request-ID. -
409 idempotency_conflictобрабатывается как стоп-сигнал (не как «попробовать ещё раз»), см. Идемпотентность.
Каталог и точки
- Список точек читается через
GET /v1/pointsиactive=false/точки вне ответа скрываются в UI, а не хардкодятся. - Перед показом блюда на сайте проверено, что оно есть в
GET /v1/points/{id}/products— это устраняет заранее известный класс422 product_mapping_not_found. - Адрес проверяется через
POST /v1/addresses/checkдо оплаты, обработаны все четыре статуса (ok/ambiguous/not_found/unknown), включая то, чтоunknownне блокирует оформление.
Обработка ошибок
- Реализована обработка каждого кода из Справочника ошибок, не только
200/201. -
413(превышение размера тела) распознаётся отдельно — это не JSON-ответ. - Неизвестный статус/код не интерпретируется как успех.
Вебхуки
- Эндпоинт приёма вебхуков публично доступен по
https://, проверяет подпись (ingressclient.VerifyWebhookили эквивалент) до разбора тела как доверенных данных. - Дедупликация по
eventIdреализована на уровне, предшествующем бизнес-эффекту (уникальный индекс или проверка «уже обработан»). - Обработчик отвечает
2xxбыстро (тяжёлая работа — асинхронно), учитывая 5-секундный таймаут воркера на попытку. - Реализован резервный поллинг на случай, если вебхук так и не доставлен (после исчерпания ретраев запись помечается
dead) — см. Вебхуки.
Состояния и статусы
- UI не блокируется ожиданием
CookingStarted/CookingCompleted— текущие кассы ВиЛ (iiko Front API V8 8.7) их не присылают, см. Жизненный цикл заказа. -
deliveryStatus,deliveryStatusAt,cancelReason,cancelDetailобрабатываются как поля, которые могут бытьnull, а не как опциональные ключи. - Русскоязычные подписи состояний в вашем UI взяты из таблиц Жизненного цикла заказа, а не придуманы заново — это упрощает будущую сверку с другими партнёрами на этом же API.
Отмена
- Кнопка/сценарий отмены на сайте отправляет валидный
reasonиз фиксированного набора (guest_request/payment_failed/duplicate/other). -
202(запрос принят, но отмена не гарантирована) и200(немедленная отмена/no-op) различаются в UI, если это важно для вашего сценария. -
409 cancel_rejectedне приводит к автоматическому повтору — гостю показывается «свяжитесь с рестораном», см. Отмену заказа.
Данные и безопасность
- Ни в одном логе на вашей стороне нет API-ключа, HMAC-секрета,
webhookSecretили заголовкаX-Signatureв открытом виде. - Номер телефона, имя и адрес гостя не пишутся в логи в открытом виде на вашей стороне (симметрично тому, что делает AploDelivery — см. Безопасность).
- Если интеграция когда-либо перейдёт на guest/loyalty-эндпоинты (v2, планируется) — прочитана и понята модель доверия к гостю: AploDelivery доверяет присланному телефону, аутентификация гостя — обязанность партнёра.
Готовность к поддержке
- Известен канал обращения в поддержку AploDelivery и что к обращению нужно приложить — см. Поддержку.
- На вашей стороне логируется собственный
X-Request-IDкаждого исходящего запроса (сервис его пока не эхает в ответе) — это единственный способ найти конкретный запрос при разборе инцидента.
Финальная проверка
- Пройден полный сценарий end-to-end на staging: точка → товары → адрес → создание заказа → получение вебхуков state/delivery-status → (опционально) отмена → сверка итогового состояния поллингом.
-
<уточняется>: отдельный sandbox с POS-симулятором (docs/PARTNER_API_V2_SPEC.md§9.4) пока не задеплоен — «staging» здесь означает реальный staging-контур AploDelivery с настоящим плагином на тестовой точке, а не автономный симулятор.