Базовый адрес: https://obmxpay.com/api/v1. Формат — JSON, кодировка UTF-8, суммы в рублях с копейками.
Каждый запрос подписывается секретным ключом из кабинета (раздел «API и вебхуки»). Заголовки:
X-API-Key: pk_… публичный ключ X-Timestamp: 1767200000 текущее время unix, расхождение до 5 минут X-Signature: hex(HMAC_SHA256(secret, timestamp + "." + METHOD + "." + path_with_query + "." + body))
Для GET тело пустое. path_with_query — путь запроса вместе со строкой параметров, например /api/v1/payments?status=paid.
POST /api/v1/payments
{
"amount": 1500.00,
"currency": "RUB",
"method": "card_tbank", // код метода из GET /api/v1/methods
"order_id": "ORDER-1001", // ваш номер, уникальный
"customer_id": "user_42", // id клиента у вас (для лимитов)
"customer_email": "[email protected]", // необязательно
"customer_ip": "203.0.113.5", // необязательно
"description": "Пополнение", // необязательно
"return_url": "https://…", // необязательно, иначе из настроек
"webhook_url": "https://…" // необязательно, иначе из настроек
}
Ответ 201: объект payment с полями id, status, pay_url (страница оплаты для клиента) и requisites (реквизиты, если выводите их у себя). Ошибка — 422 с полем message.
GET /api/v1/payments/{id} статус платежа
GET /api/v1/payments?order_id=… поиск по вашему номеру (status=, limit= до 100)
GET /api/v1/methods доступные методы, лимиты и комиссии
GET /api/v1/balance баланс: total, reserve, available
created — ждём оплату · paid — оплачен · expired — время вышло · failed — провайдер отказал · canceled — отменён.
При смене статуса шлём POST на ваш Webhook URL:
X-OBMXPAY-Timestamp: 1767200000
X-OBMXPAY-Signature: hex(HMAC_SHA256(secret, timestamp + "." + body))
{"event":"payment.paid","payment":{ …тот же объект payment… }}
Проверьте подпись и ответьте кодом 2xx. При ошибке повторим через 1, 5, 15, 60, 180 и 720 минут. Зачисляйте деньги клиенту только по payment.paid с верной подписью.
$body = json_encode(['amount' => 1500, 'currency' => 'RUB', 'method' => 'card_tbank', 'order_id' => 'ORDER-1001']);
$ts = time();
$sig = hash_hmac('sha256', $ts . '.POST./api/v1/payments.' . $body, $secret);
$ch = curl_init('https://obmxpay.com/api/v1/payments');
curl_setopt_array($ch, [CURLOPT_POST => 1, CURLOPT_POSTFIELDS => $body, CURLOPT_RETURNTRANSFER => 1, CURLOPT_HTTPHEADER => [
'Content-Type: application/json', 'X-API-Key: ' . $public, 'X-Timestamp: ' . $ts, 'X-Signature: ' . $sig]]);
$payment = json_decode(curl_exec($ch), true)['payment'];
header('Location: ' . $payment['pay_url']);
$raw = file_get_contents('php://input');
$ts = $_SERVER['HTTP_X_OBMXPAY_TIMESTAMP'] ?? '';
$ok = hash_equals(hash_hmac('sha256', $ts . '.' . $raw, $secret), $_SERVER['HTTP_X_OBMXPAY_SIGNATURE'] ?? '');
if (!$ok || abs(time() - (int)$ts) > 600) { http_response_code(401); exit; }
$event = json_decode($raw, true);