Аутентификация и подпись
Почему я получаю 401 на каждый запрос?
Почему я получаю 401 на каждый запрос?
- Сериализуйте тело один раз в переменную и используйте её и для подписи, и для отправки.
- Каноническая строка — ровно
timestamp\nPOST\npath\nbody, с переводами строк\n. path— с ведущим слэшем (/v1/payment), без базового URL.- Подпись — hex в нижнем регистре.
401 auth.bad_timestamp — что это?
401 auth.bad_timestamp — что это?
X-Timestamp отсутствует или не число. Передавайте unix‑секунды (целое), не миллисекунды.merchant.bad_signature (проверка окна
±5 мин встроена в сверку подписи), а не auth.bad_timestamp. Синхронизируйте время (NTP).401 auth.ip_not_allowed, хотя подпись верна
401 auth.ip_not_allowed, хотя подпись верна
Подпись запроса работает, а вебхук «не проходит» проверку
Подпись запроса работает, а вебхук «не проходит» проверку
timestamp\nMETHOD\npath\nbody. Подпись вебхука —
timestamp.сырое_тело (точка‑разделитель, без метода и пути), другим секретом. →
Объект вебхукаПлатежи
Создал платёж, а address пустой
Создал платёж, а address пустой
is_multi: true): вы не задали to_currency/network,
и адрес выделится только после того, как покупатель выберет валюту на hosted‑странице через
/v1/pay/{id}/select. Если адрес нужен сразу — задайте валюту и сеть при
создании. → Три режима создания счётаpayment.network_required при создании
payment.network_required при создании
USDT их много), а network вы не указали. Укажите сеть явно
или используйте валюту с единственной сетью. → Поддерживаемые сетиpayment.below_minimum
payment.below_minimum
Покупатель оплатил, но статус всё ещё не paid
Покупатель оплатил, но статус всё ещё не paid
confirm_check означает, что транзакцию видят и ждут
подтверждений сети. Число подтверждений зависит от суммы и сети — крупный платёж ждёт дольше. Пока
не достигнут порог, статус не станет paid. → Приём первого платежаПришло меньше, чем выставил, — что делать?
Пришло меньше, чем выставил, — что делать?
paid. Если нет и срок вышел — wrong_amount, и средства вернутся при включённом
автовозврате. → Недоплата и переплатаВебхуки
Вебхук вообще не приходит
Вебхук вообще не приходит
- Endpoint зарегистрирован? Вызовите
/v1/webhooksи сохраните секрет. Без регистрации доставок нет вовсе — даже per‑объектныйurl_callbackигнорируется (без секрета endpoint подписывать нечем, доставка не создаётся). - URL публично доступен по HTTPS? Приватные/локальные адреса запрещены SSRF‑проверкой.
- Отправьте пробное событие и посмотрите
status_code. → Отладка вебхуков - Проверьте журнал доставок — статус
pending/deadиlast_errorподскажут причину. →/v1/webhooks/deliveries
Вебхук приходит, но подпись не сходится
Вебхук приходит, но подпись не сходится
- Берёте ли вы сырое тело (до JSON‑парсинга)? Пересериализация меняет байты.
- Правильный ли алгоритм:
hex(HMAC-SHA256(secret, "{timestamp}." + сырое_тело))? - Тот ли секрет — из
/v1/webhooks, а не ключ API? - Пробные тела (
is_test: true) не подписаны — их проверять подписью не нужно.
Один и тот же вебхук приходит несколько раз
Один и тот же вебхук приходит несколько раз
uuid + status и
обрабатывайте повтор как no‑op. → Настройка вебхуковОбработал вебхук, но Oblodai шлёт его снова
Обработал вебхук, но Oblodai шлёт его снова
2xx (или запрос упал по таймауту). Диспетчер считает это провалом и повторяет.
Отвечайте 2xx только после успешной обработки; если обработка не удалась — тогда да, пусть
повторит.Выплаты и баланс
409 payout.insufficient_funds, хотя на балансе деньги есть
409 payout.insufficient_funds, хотя на балансе деньги есть
/v1/balance. Дождитесь
подтверждений. Отдельный код для этого случая — 409 payout.funds_maturing.409 payout.funds_maturing
409 payout.funds_maturing
400 payout.destination_internal
400 payout.destination_internal
400 payout.order_id_required
400 payout.order_id_required
order_id обязателен — это ваш бизнес‑ключ дедупликации. Всегда задавайте уникальный.
Он дополняет (а не заменяет) HTTP‑заголовок Idempotency-Key. →
Устойчивый клиентЧасть массовой выплаты не прошла
Часть массовой выплаты не прошла
items[].status + items[].error, в легаси
/v1/payout/mass — success: false + message. → Массовые операцииКак выплатить сразу тысячам получателей и не поймать 429?
Как выплатить сразу тысячам получателей и не поймать 429?
POST /v1/payout/batch: до 5000 выплат
одним подписанным запросом, обработка асинхронная, результат — через /v1/batch/info. Цикл из
отдельных вызовов гарантированно упрётся в лимит частоты. → Массовые операцииОбщее
Что делать при 500 или 503?
Что делать при 500 или 503?
Idempotency-Key и тем же order_id. →
ИдемпотентностьЧто такое Idempotency-Key и обязателен ли он?
Что такое Idempotency-Key и обязателен ли он?
Idempotent-Replayed: true вместо создания дубля.Формально не обязателен, но настоятельно рекомендуется. Второй, независимый механизм защиты — ваш
order_id (для выплат он обязателен). Опасен только случай, когда нет ни того, ни другого: тогда
повтор создаст дубль. → Устойчивый клиентПришёл 409 — операция точно провалилась?
Пришёл 409 — операция точно провалилась?
409 финальны:payout.funds_maturing— средства дозревают, повторите позже, выплата пройдёт;idempotency.in_progress— ваш прежний запрос ещё выполняется, подождите и повторите;payout.frozen— временная защита, повторите позже;payout.insufficient_funds— вот это по‑настоящему «денег нет», повтор не поможет.
Получаю ошибки вида «rate limit» / 429
Получаю ошибки вида «rate limit» / 429
Как протестировать, если нет песочницы?
Как протестировать, если нет песочницы?
Как сменить (ротировать) ключ?
Как сменить (ротировать) ключ?
Не нашёл ответа
Не нашёл ответа
public_id,
uuid платежа/выплаты и строки лога с префиксом oblodai: (в SDK включаются переменной
OBLODAI_LOG, в модулях CMS — галочкой Debug log); secret не прикладывайте.