Базовые понятия и авторизация
API использует REST поверх HTTPS. Все запросы выполняются по базовому URL https://api.api-platezhi.ru/v1/ с аутентификацией через заголовок Authorization: Bearer . Разделяйте ключи для песочницы и продакшна, храните секреты в Vault/Secrets Manager. Для idempotent POST используйте заголовок Idempotency-Key.
Ресурс Payments: создание, статусы, захват и отмена
Endpoint: POST /payments
Поля: amount, currency, order_id, description, capture (true/false), customer, receipt (для 54‑ФЗ), return_url, metadata.
Статусы: pending, waiting_for_capture, succeeded, canceled, failed.
Действия:
- GET /payments/{id} — получить платеж
- POST /payments/{id}/capture — списать (полностью/частично)
- POST /payments/{id}/cancel — отмена/освобождение холда
Пример (cURL):
curl -X POST https://api.api-platezhi.ru/v1/payments \
-H "Authorization: Bearer sk_test_xxx" \
-H "Idempotency-Key: order_1001_try_1" \
-H "Content-Type: application/json" \
-d '{
"amount": {"value": "1490.00", "currency": "RUB"},
"order_id": "ORD-1001",
"capture": false,
"description": "Оплата заказа #1001",
"return_url": "https://shop.example.ru/return"
}'
Ресурс Refunds: частичные и полные возвраты
Endpoint: POST /refunds
Поля: payment_id, amount, reason, receipt.
Статусы: pending, succeeded, failed.
Сценарии: частичный возврат нескольких позиций, возврат доставки, возврат после отмены.
Ресурс Tokens: сохраненные карты и биллинг
Endpoint: POST /tokens — обмен карточных данных/PaymentMethod на токен (через защищенный флоу). Токен хранится у нас, вы оперируете token_id. Для рекуррентных списаний используйте merchant‑initiated flow с 3‑DS при первой оплате.
Вебхуки: формат, подпись, ретраи
Конфигурируются в кабинете. Заголовки: X-Event-Type, X-Request-Id, X-Signature (HMAC SHA‑256). Тело содержит объект data с сущностью события. Мы выполняем ретраи по экспоненциальной схеме до 24 часов. Ответ 2xx подтверждает прием. Подпись вычисляется по сырым байтам тела и секрету endpoint.
Пример payload:
{
"id": "evt_123",
"type": "payment.succeeded",
"created_at": "2025-01-01T10:00:00Z",
"data": {"object": {"id": "pay_abc", "status": "succeeded", "amount": {"value": "1490.00", "currency": "RUB"}}}
}
Идемпотентность и порядок событий
Каждый POST сопровождайте уникальным Idempotency-Key. События могут приходить не по порядку — храните последнее известное состояние и применяйте версионирование ресурса (version/updated_at). Повторная обработка должна быть безопасной.
Ошибки и коды ответов
- 200/201 — успех
- 400 — некорректные данные (validation_error)
- 401/403 — проблемы авторизации/прав
- 404 — ресурс не найден
- 409 — конфликт идемпотентности
- 422 — бизнес‑ошибка (например, capture больше суммы)
- 429 — превышен лимит
- 500/502/504 — временные проблемы
Структура ошибки:
{
"error": {"code": "validation_error", "message": "amount.value is required", "details": [{"field": "amount.value", "reason": "required"}]}
}
Лимиты, пагинация и фильтры
Пагинация: cursor‑based — параметры limit и starting_after. Фильтры: status, created_at_from/to, amount_from/to, metadata.*. Рекомендуем забирать изменения инкрементально и хранить курсор.
Примеры на cURL/Node.js/PHP/Python
Node.js (axios):
await axios.post('https://api.api-platezhi.ru/v1/payments', {
amount: { value: '990.00', currency: 'RUB' },
order_id: 'ORD-2002',
capture: true,
return_url: 'https://shop.example.ru/return'
}, { headers: { Authorization: `Bearer ${process.env.API_KEY}`, 'Idempotency-Key': 'ORD-2002-try-1' }});
PHP (Guzzle):
$client->post('/v1/payments', [ 'headers' => [ 'Authorization' => 'Bearer '.getenv('API_KEY'), 'Idempotency-Key' => 'ORD-2002-try-1' ], 'json' => [ 'amount' => [ 'value' => '990.00', 'currency' => 'RUB' ], 'order_id' => 'ORD-2002', 'capture' => true, 'return_url' => 'https://shop.example.ru/return' ]]);
Версионирование API и совместимость
Версия указывается в URL и заголовке X-Api-Version. Минорные изменения обратносуместимы, мажорные — с миграционным периодом и dual‑run. Подпишитесь на рассылку изменений и тестируйте в песочнице перед апдейтом в проде.