protopays · API

Статус платежа

Опрос состояния платежа по UUID из ответа создания. Для финального результата предпочтительнее webhook.

GET https://api.protopays.io/api/v1/payments/{uuid}

Запрос

Те же заголовки HMAC, что при создании. В path — uuid из поля data.id. Чужой платёж или другая шлюза — 404, payment_not_found.

ПолеТипОбяз.Описание
X-Merchant-Key-IdstringдаПубличный key_id строки API-ключа.
Signaturestring (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.idstring (UUID)даПубличный идентификатор платежа.
data.statusstringдаТекущий статус (нижний регистр в API, UPPERCASE в webhook).
data.amountstringдаСумма в фиате (для RUB — строка с двумя знаками после запятой).
data.currencystringдаISO-код валюты (например RUB).
data.methodstringнетКанал оплаты из снимка (например sbp, card).
data.requisiteobjectнетРеквизит для оплаты: value, holder, bank — при наличии.
data.expiresAtstring (ISO8601)нетСрок резерва реквизита.
data.codestringнетПри 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 — открыта апелляция