Создание платежа
В ответе — requisite (СБП, карта и др.) или checkoutUrl для квази-еком или m2tjs. Статус — GET или webhook.
https://api.protopays.io/api/v1/paymentsПараметры тела (JSON)
Мерчант — из заголовков, не из тела. Подпись — от байт JSON ниже.
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
| orderId | string | да | Ваш id заказа. Повтор с тем же method → тот же платёж. |
| amount | number | string | да | Сумма, минимум 1. |
| currency | string | да | RUB, AZN, KZT, TRY, UZS, MNT и др. — по кассе. |
| callbackUri | string (URL) | да | HTTPS URL для webhook. |
| method | string | да | Способ оплаты: sbp | sim | card |
| payer | object | нет | Опционально: userId игрока, userIp, fullName, type, payments. Для квази-еком userId нужен, чтобы на этой кассе карта подставлялась в следующий платёж того же игрока. |
Для MNT: method c2c (карта) или iban. Пример: {"currency":"MNT","method":"c2c"}. Выплаты в MNT трейдеру включает администратор.
Заголовки
Content-Type, X-Merchant-Key-Id, Signature — см. аутентификацию.
Примеры запроса
curl
curl -X POST 'https://api.protopays.io/api/v1/payments' \
-H 'Content-Type: application/json' \
-H 'X-Merchant-Key-Id: <KEY_ID>' \
-H 'Signature: <SIGNATURE>' \
-d '{
"orderId": "order-001",
"amount": "1000",
"currency": "RUB",
"callbackUri": "https://example.com/hooks/protopays",
"method": "sbp",
"payer": {
"userId": "u-4095",
"userIp": "188.11.55.10",
"fullName": "Kim Min-jun",
"type": "trusted",
"payments": {
"successful": 5,
"expired": 1
}
}
}'PHP (cURL + hash_hmac)
Base URL, <SECRET>, <KEY_ID> из кабинета. Один и тот же $body — в HMAC и в тело.
<?php
$base = rtrim("https://api.protopays.io", '/');
$keyId = '<KEY_ID>';
$secret = '<SECRET>';
$payload = [
'orderId' => 'order-001',
'amount' => '1000',
'currency' => 'RUB',
'callbackUri' => 'https://example.com/hooks/protopays',
'method' => 'sbp',
'payer' => [
'userId' => 'u-4095',
'userIp' => '188.11.55.10',
'fullName' => 'Kim Min-jun',
'type' => 'trusted',
'payments' => [
'successful' => 5,
'expired' => 1,
],
],
];
$body = json_encode($payload, JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE);
$signature = hash_hmac('sha256', $body, $secret);
$ch = curl_init("{$base}/api/v1/payments");
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Content-Type: application/json',
'X-Merchant-Key-Id: ' . $keyId,
'Signature: ' . $signature,
],
CURLOPT_POSTFIELDS => $body,
]);
echo curl_exec($ch);Ответ
message + data: id, orderId, status, amount, currency, method, requisite, paymentPageUrl (или checkoutUrl для квази), expiresAt, extra.
В extra: fiatPerUsdt — курс (фиат за 1 USDT), marginPercent — комиссия в %, rate — сумма в USDT после комиссии.
{
"message": "Payment created",
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"orderId": "order-001",
"status": "pending",
"amount": "1000.00",
"currency": "RUB",
"method": "sbp",
"requisite": {
"value": "+79991234567",
"holder": "И. Иванов",
"bank": "Пример банк"
},
"paymentPageUrl": "https://pay.protopays.io/r/rpt_<token>",
"expiresAt": "2026-04-20T15:30:00+00:00",
"extra": {
"rate": "90.00000000",
"fiatPerUsdt": "100.00000000",
"marginPercent": "10.00",
"cryptoCurrency": "USDT"
}
}
}Ссылка на оплату
В ответе всегда есть ссылка на оплату — тип зависит от method:
quasi_ecom→checkoutUrl(карта, затем код из SMS; путь/pay/…). Реквизитов в ответе нет. Карту можно отправить заранее через checkout API — в ответе будетotpUrlна ввод кода; карта у себя.- Остальные методы (
sbp,c2c,ibanи др.) →paymentPageUrl(страница с реквизитами, путь/r/…) плюсrequisiteв JSON.
Токен уже в ссылке — открывайте URL как есть. Это не data.id. Подробнее про квази — здесь.
{
"message": "Payment created",
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"orderId": "az-order-001",
"status": "pending",
"amount": "50.00",
"currency": "AZN",
"method": "quasi_ecom",
"checkoutUrl": "https://pay.protopays.io/pay/ckt_<token>",
"quasiEcom": { "phase": "awaiting_payer_details" },
"expiresAt": "2026-06-27T16:15:00+00:00"
}
}