oblodai/sdk. Без внешних зависимостей (работает на cURL),
поддерживает подстановку своего HTTP-транспорта.
Требования: PHP 8.0+, расширения json и curl.
Установка
Новое в v1.1.0 (текущая версия в Packagist): группы
batches() / links() / splits() /
payoutLinks(), методы createBatch / refundBatch / sendEmail / resolve — и ломающее
изменение идемпотентности: вместо авто-order_id теперь заголовок Idempotency-Key
(см. «Ошибки и повторы»).Аутентификация (ключи из окружения)
Ключи берутся в кабинете my.oblodai.com — см. Регистрация и ключи. Задайте переменные окружения (не пишите секрет в коде):Быстрый старт: принять платёж
Совет: не хотите указывать валюту/сеть за покупателя? Не передавайте
to_currency и network —
получится «валюто-агностичная» ссылка, где покупатель сам выберет монету на странице оплаты.Ресурсы и методы
Доступ через$client->имя():
Каждый метод возвращает уже развёрнутый
result (массив). Точные поля запроса/ответа — в
Справочнике.
Всё, что помечено «с v1.1.0», доступно начиная с версии 1.1.0 — если у вас стоит v1.0.x,
обновите пакет (
composer update oblodai/sdk). Свой ключ идемпотентности в методах создания —
'idempotency_key' в массиве параметров (уйдёт в заголовок).- Задавайте
expires_in_hoursявно: без него чек живёт всего 1 час. claim_url/claim_tokenвозвращаются только изcreate, один раз — сохраните сразу.- Дедупликация — поле
reference(заголовокIdempotency-Keyна этих эндпоинтах не действует).
Валюта цены и валюта расчёта
В примере выше'currency' => 'USD' — валюта цены, а 'to_currency' => 'USDT' — валюта
расчёта. Это разные вещи:
currency(цена) — одна из 23 фиатных валют: USD, EUR, GBP, RUB, UAH, PLN, CZK, TRY, CNY, INR, BRL, CAD, AUD, CHF, AED, ZAR, MXN, IDR, THB, VND, NGN, JPY, KRW — или любая монета (USDT, BTC, TRX, …).to_currency(расчёт) — только крипта. Фиата здесь не бывает: баланс, выплаты и возвраты всегда в монете, шлюз не хранит фиат.- У JPY и KRW ноль знаков после запятой (
'amount' => '10000', не'10000.00'); у остальных — 2. - KZT, KGS, UZS пока не поддерживаются →
payment.unknown_currency. - Фиатная цена + только
networkбезto_currency→400 payment.to_currency_required. Либо задайтеto_currency, либо не задавайте ни то, ни другое (тогда монету выберет покупатель).
$client->rates()->currencies(), поле pricing_currencies.
Проверьте, что заработало
- Запустите код создания платежа из «Быстрого старта». В ответе должен прийти
url— это ссылка на hosted-страницу оплаты. Откройте её в браузере: если страница открылась, приём платежей настроен. - Чтобы реально поймать вебхук об оплате на локальной машине, нужен публичный HTTPS-адрес —
поднимите туннель (ngrok / cloudflared) и укажите его URL в
url_callback. Подробнее — в Тестировании и Настройке вебхуков.
Вебхуки
Шаг 1. Регистрация (один раз)
Важно: этот webhook-секрет — не ваш API-
secret. Без регистрации Oblodai не будет слать
уведомления.Шаг 2. Приём (обязательно СЫРОЕ тело)
payment_status: check, confirm_check, paid, paid_over, wrong_amount,
wrong_amount_waiting, cancel, select. Оплаченными считайте только paid и paid_over.
Ошибки и повторы
Retry-After. Отключить повторы: new Client($id, $secret, ['retry' => false]).
Повтор безопасен, но механизм зависит от версии:
В обеих версиях таймаут/обрыв сети не создаст дубль счёта или перевода. Для выплат
order_id
обязателен всегда — его задаёте вы (иначе payout.order_id_required).
Свой HTTP-транспорт (необязательно)
По умолчанию — cURL. Хотите Guzzle / PSR-18 / мок для тестов — реализуйте интерфейсOblodai\Http\Transport:
Логи и отладка
Включите логи одной переменной окружения — увидите каждый запрос/ответ/ретрай:oblodai: (метод, путь, статус, номер попытки, задержка ретрая).
Секреты, подпись и тела запросов в лог не попадают. Вместо переменной можно задать свой логгер —
опция logger в конфиге:
Проверяете подпись вебхука статичным (старым) вектором? По умолчанию действует окно свежести
5 минут — старый
timestamp отклонит replay-защита (валидная подпись → всё равно ошибка). Для
офлайн-проверки задайте окно 0: Webhooks::constructEvent($secret, $raw, $ts, $sig, maxAgeSeconds: 0).Если не получилось
Полная диагностика — Что делать, если не работает.