github.com/oblodai/oblodai-go. Ноль внешних зависимостей
(только стандартная библиотека).
Требования: Go 1.22.2+ (именно эта версия указана в go.mod — на 1.22.0/1.22.1 сборка не пройдёт).
Установка
Новое в v1.1.0 (текущая версия в Go modules): группы
Batches / Links / Splits /
PayoutLinks, методы *Batch / SendEmail / Resolve — и ломающее изменение
идемпотентности: вместо авто-order_id теперь заголовок Idempotency-Key (см. «Ошибки и повторы»).Аутентификация (ключи из окружения)
Ключи берутся в кабинете my.oblodai.com — см. Регистрация и ключи.Быстрый старт: принять платёж
oblodai.Params — это map[string]any. Метод возвращает типизированный объект (*oblodai.Payment).
Ресурсы и методы
Все методы принимают
context.Context первым аргументом. Точные поля — в Справочнике.
Всё, что помечено «с v1.1.0», доступно начиная с версии 1.1.0 — если у вас стоит v1.0.x,
обновите модуль (
go get -u github.com/oblodai/oblodai-go). Свой ключ идемпотентности в методах
создания — params["idempotency_key"] (уйдёт в заголовок).- Задавайте
ExpiresInHoursявно: без него чек живёт всего 1 час. ClaimURL/ClaimTokenвозвращаются только из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(ctx), поле pricing_currencies.
Проверьте, что заработало
- Запустите код создания платежа из «Быстрого старта». В ответе должен прийти
URL— это ссылка на hosted-страницу оплаты. Откройте её в браузере: если страница открылась, приём платежей настроен. - Чтобы реально поймать вебхук об оплате на локальной машине, нужен публичный HTTPS-адрес —
поднимите туннель (ngrok / cloudflared) и укажите его URL в
url_callback. Подробнее — в Тестировании и Настройке вебхуков.
Вебхуки
Шаг 1. Регистрация (один раз)
Шаг 2. Приём (обязательно СЫРОЕ тело)
VerifyWebhook возвращает *oblodai.SignatureError при неудаче; проверяет подпись и окно replay.
Тестовые вебхуки (is_test) не подписаны — их можно просто подтверждать 200.
Ошибки и повторы
Retry-After (до 4 попыток) —
повторы включены по умолчанию, настраивать ничего не нужно. Пустое поле Retry (nil) означает
«дефолтные повторы», как и в остальных четырёх SDK. Если повторы нужно отключить, сделайте это явно:
В обеих версиях таймаут/обрыв сети не создаст дубль счёта или перевода. Для выплат
order_id
обязателен всегда — его задаёте вы (иначе payout.order_id_required).
Логи и отладка
Включите логи одной переменной окружения — увидите каждый запрос/ответ/ретрай:oblodai: (метод, путь, статус, номер попытки, задержка ретрая).
Секреты, подпись и тела запросов в лог не попадают. Вместо переменной можно задать свой логгер: Config{ Logger: slog-логгер } — учтите, что slog.Default() работает на уровне INFO и debug-строки запросов не покажет; задайте debug-хендлер или OBLODAI_LOG=debug.
Проверяете подпись вебхука статичным (старым) вектором? По умолчанию действует окно свежести
5 минут — старый
timestamp отклонит replay-защита (валидная подпись → всё равно ошибка). Для
офлайн-проверки задайте окно 0: oblodai.VerifyWebhook(secret, raw, headers, &oblodai.VerifyOptions{MaxAgeSeconds: 0}).Если не получилось
Полная диагностика — Что делать, если не работает.