Oblodai Rust SDK
Официальный Rust SDK для платёжного шлюза Oblodai: приём платежей, выплаты, статические кошельки, вебхуки. Автоподпись запросов, разбор ответов в типизированные структуры, обработка ошибок и автоматические повторы.
Базовый URL. По умолчанию —
https://api.oblodai.com. При необходимости переопределите черезConfig::base_url(...)и свои ключи.
Установка
[]
= "1"
= "1"
Требуется Rust 1.75+.
Учётные данные
Храните ключи в переменных окружения (см. .env.example):
# необязательно: export OBLODAI_BASE_URL=https://api.oblodai.com
// читает OBLODAI_PUBLIC_ID / OBLODAI_SECRET / OBLODAI_BASE_URL
let client = from_env?;
Быстрый старт
use ;
use json;
Проверка вебхуков
Подпись вебхука отличается от подписи запроса — SDK делает и то, и другое. Для входящих вебхуков
берите сырое тело и заголовки X-Webhook-Timestamp / X-Webhook-Signature.
use ;
use Value;
Чтобы отключить replay-защиту: VerifyOptions { max_age_seconds: 0, now: None }.
Обработка ошибок
Все ошибки — enum [Error]. Ошибки API несут машиночитаемый код.
use Error;
match client.payouts.create
err.is_retriable() подскажет, временная ли ошибка; err.code() вернёт код для Error::Api.
Варианты ошибок
| Вариант | Когда |
|---|---|
Error::Api { code, status, .. } |
API вернул конверт error. |
Error::Connection(_) |
Сеть недоступна или таймаут. |
Error::Signature(_) |
Не прошла проверка подписи вебхука. |
Error::Serialization(_) |
Ошибка (де)сериализации. |
Error::Config(_) |
Некорректная конфигурация. |
Повторы (retry)
Временные ошибки (5xx, 429, сетевые сбои) повторяются автоматически с экспоненциальным backoff
и джиттером. Ошибки запроса (4xx), а также payout.funds_maturing (средства ещё дозревают —
немедленный повтор не поможет) считаются терминальными и не повторяются. Заголовок Retry-After
от сервера соблюдается как есть (не обрезается до max_delay, лишь до абсолютного потолка в 300 с).
use ;
use Duration;
let config = new.retry;
// .retry(None) — отключить повторы
Важно про таймаут. Таймаут не означает, что операция не прошла. Повтор безопасен благодаря идемпотентности по
order_id: если операция уже создана — вернётся она же, дубля не будет. Дляpayments().create(...)иaccount().transfer_to_personal(...)SDK автоматически подставляет стабильныйorder_id(idem-<hex>), если вы его не задали, — один и тот же ключ переиспользуется на всех повторах одного вызова. Задайте свойorder_idявно, чтобы дедуплицировать между вызовами.
Свой HTTP-транспорт
По умолчанию используется встроенный клиент на reqwest (фича reqwest-client, включена). Чтобы
подставить свой транспорт (или для тестов без сети), отключите фичу и реализуйте трейт
[HttpTransport]:
[]
= { = "1", = false }
use ;
use Arc;
;
let client = with_transport.unwrap;
Обзор методов
// Платежи
client.payments.create
client.payments.info
client.payments.history
client.payments.services
client.payments.qr
client.payments.resend
client.payments.refund
client.payments.set_accepted / list_accepted
client.payments.set_accuracy / get_accuracy
client.payments.set_autorefund / get_autorefund
// Выплаты
client.payouts.create
client.payouts.create_mass
client.payouts.info
client.payouts.history
client.payouts.services
client.payouts.calculate
client.payouts.approve
client.payouts.refund
client.payouts.get_fee_config / set_fee_config
client.payouts.get_refund_fee_config / set_refund_fee_config
// Кошельки
client.wallets.create
client.wallets.block
client.wallets.blocked_address_refund
client.wallets.qr
// Аккаунт
client.account.balance
client.account.referral
client.account.transfer_to_personal
client.account.vrcs
// Вебхуки
client.webhooks.register
client.webhooks.deliveries
client.webhooks.test_payment
// Настройки
client.settings.list_auto_withdraw / set_auto_withdraw / delete_auto_withdraw
client.settings.list_allowlist / add_allowlist / remove_allowlist / enable_allowlist
// Курсы (публично, без ключа)
client.rates.list
Замечания
- Суммы — строки в единицах валюты (
"25.00"), не числа. Так сохраняется точность. order_id/reference— ваш ключ идемпотентности. Задавайте всегда для платежей и выплат. Если дляpayments().createилиaccount().transfer_to_personalвы его опустите, SDK подставит автоматическийidem-<hex>, чтобы повтор после таймаута не создал дубль.- Секрет — только на сервере. SDK серверный; не встраивайте ключ в клиентские приложения.
- Тела запросов принимаются как
serde_json::Value— стройте макросомjson!.
Лицензия
MIT