Статус платежа
Опрос состояния платежа по UUID из ответа создания. Для финального результата предпочтительнее webhook.
GET https://api.protopays.io/api/v1/payments/{uuid}
Запрос
Те же заголовки HMAC, что при создании. В path — uuid из поля data.id. Чужой платёж или другая шлюза — 404, payment_not_found.
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
| X-Merchant-Key-Id | string | да | Публичный key_id строки API-ключа. |
| Signature | string (hex) | да | HMAC-SHA256 от пустой строки (тело GET отсутствует), ключ — сырой секрет ключа; результат в нижнем hex. |
Общая схема HMAC: см. аутентификация. Для POST подпись считается от JSON-тела; здесь — от пустой строки (как у баланса).
Примеры
curl
curl -sS -X GET 'https://api.protopays.io/api/v1/payments/550e8400-e29b-41d4-a716-446655440000' \ -H 'Accept: application/json' \ -H 'X-Merchant-Key-Id: <KEY_ID>' \ -H 'Signature: <SIGNATURE>'
Замените <SIGNATURE>: посчитайте HMAC-SHA256 от пустого тела тем же секретом, что для POST (например в PHP: hash_hmac("sha256", "", $secret)).
PHP
<?php
$base = rtrim('<BASE_URL>', '/');
$keyId = '<KEY_ID>';
$secret = '<SECRET>'; // сырой секрет из кабинета — только для HMAC
$uuid = '550e8400-e29b-41d4-a716-446655440000';
$canonicalBody = ''; // GET без тела
$signature = hash_hmac('sha256', $canonicalBody, $secret);
$ch = curl_init("{$base}/api/v1/payments/{$uuid}");
curl_setopt_array($ch, [
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Accept: application/json',
'X-Merchant-Key-Id: ' . $keyId,
'Signature: ' . $signature,
],
]);
echo curl_exec($ch);Ответ
200 OK. Форма data совпадает с полем data в ответе создания платежа.
| Поле | Тип | Обяз. | Описание |
|---|---|---|---|
| data.id | string (UUID) | да | Публичный идентификатор платежа. |
| data.status | string | да | Текущий статус (нижний регистр в API, UPPERCASE в webhook). |
| data.amount | string | да | Сумма в фиате (для RUB — строка с двумя знаками после запятой). |
| data.currency | string | да | ISO-код валюты (например RUB). |
| data.method | string | нет | Канал оплаты из снимка (например sbp, card). |
| data.requisite | object | нет | Реквизит для оплаты: value, holder, bank — при наличии. |
| data.expiresAt | string (ISO8601) | нет | Срок резерва реквизита. |
| data.code | string | нет | При status=requisite_unavailable — collect_requisites_not_available. |
{
"data": {
"id": "550e8400-e29b-41d4-a716-446655440000",
"orderId": "order-001",
"status": "pending",
"amount": "1000.00",
"currency": "RUB",
"method": "sbp",
"requisite": {
"value": "+79991234567",
"holder": "И. Иванов",
"bank": "Пример банк"
},
"expiresAt": "2026-04-20T15:30:00+00:00"
}
}Жизненный цикл
Опрос статусов здесь; итог — в webhook (там значения в верхнем регистре).
pending— ожидает оплаты / обработкиcompleted— успешно завершёнfailed/cancelled— отказ или отменаrequisite_unavailable— реквизит не выдан при созданииappeal— открыта апелляция