Статусы платежа
pending ──▶ authorized ──▶ succeeded ──▶ partially_refunded ──▶ refunded │ (холд, capture_mode=manual) │ (capture) ├──▶ succeeded (карта auto / СБП) └──▶ canceled (cancel холда) ├──▶ canceled (отказ банка, reason_code + message в поле decline; │ отмена магазином до оплаты, cancel_reason = merchant_canceled) ├──▶ expired (истёк expires_at, по умолчанию — «Срок оплаты» из настроек магазина) └──▶ on_hold (заказ заблокирован правилами ПЦ — ждём решения Оператора)
Терминальные статусы: succeeded, canceled, expired, refunded, partially_refunded. Итог платежа узнавайте по вебхуку или запросом GET /payments/{id}, а не по возврату плательщика на return_url.
Платежи
POST /payments — создать платёж
| Параметр | Тип | Описание |
|---|---|---|
| amount | integer, обязателен | Сумма в копейках |
| order_id | string | Номер заказа в вашей системе, до 128 символов. Возвращается в платеже и вебхуках, по нему ищут в кабинете и в GET /payments |
| description | string | Назначение, до 1000 символов; показывается плательщику и в ПЦ |
| capture | string | auto — автосписание (по умолчанию из настроек магазина), manual — холд с последующим capture: auto manual |
| method | string | Что виджет показывает первым: sbp — QR (по умолчанию), card — форму карты: card sbp |
| confirmation | object | {type: hosted} — виджет (по умолчанию); {type: redirect} с method card — payment_url ведёт прямо на форму ПЦ |
| return_url | url | Куда вернуть плательщика. После оплаты возвращаем автоматически через 5 секунд и добавляем payment_id=<id> |
| customer | object | Покупатель: id — идентификатор в вашей системе (до 128 символов), email и phone — контакт для чека |
| items | array | Позиции чека (text, price, quantity, tax, paymentSubjectType, paymentMethodType). Сумма позиций должна равняться amount. Без позиций чек формируется одной строкой из description |
| metadata | object | Произвольные данные, возвращаются как есть |
| expires_at | datetime | Срок оплаты (по умолчанию — из настроек магазина) |
| save_payment_method | boolean | Автосписания: сохранить способ оплаты покупателя (только СБП). Требует включённых автосписаний |
| payment_method_id | string | Автосписания: списать по сохранённому способу без участия покупателя; ответ сразу содержит результат |
curl -X POST https://platezhka.online/api/v1/payments \\
-H "Authorization: Bearer sk_test_XXXX" -H "Idempotency-Key: order-1001" -H "Content-Type: application/json" \\
-d '{"amount": 100000, "order_id": "1001", "description": "Заказ 1001", "return_url": "https://shop.example/orders/1001",
"customer": {"id": "user-42", "email": "buyer@example.com"}, "items": [{"text": "Товар", "price": 100000, "quantity": 1}]}'
Ответ 201 — объект платежа (все поля). Передайте id виджету на странице оформления заказа или перенаправьте покупателя на payment_url:
{
"id": "pay_3kZ1x9QmT0aBcDeFgHiJkL",
"object": "payment",
"shop_id": "723612",
"mode": "live",
"test": false,
"status": "pending",
"amount": 100000,
"currency": "RUB",
"captured_amount": 0,
"refunded_amount": 0,
"order_id": "1001",
"description": "Заказ 1001",
"capture_mode": "auto",
"method": null,
"confirmation": {
"type": "hosted"
},
"payment_url": "https://platezhka.online/pay/pay_3kZ1x9QmT0aBcDeFgHiJkL",
"return_url": "https://shop.example/orders/1001",
"customer": {
"id": "user-42",
"email": "buyer@example.com"
},
"items": [
{
"itemId": 1,
"text": "Товар",
"price": 100000,
"quantity": 1
}
],
"metadata": {},
"source": "api",
"receipt_status": null,
"paygine_order_id": 3504676,
"expires_at": "2026-09-22T13:00:00+03:00",
"created_at": "2026-09-22T12:00:00+03:00"
}
Номер заказа и покупатель
order_id — номер заказа в вашей системе. Он возвращается в платеже и во всех вебхуках платежа, по нему работает поиск в кабинете и фильтр GET /payments?order_id=. Уникальность не требуется: на один заказ можно создать несколько платежей (например, после истечения срока первого). От повторного создания при обрыве связи защищает заголовок Idempotency-Key. Для произвольных данных остаётся metadata.
customer.id — идентификатор покупателя у вас; фильтр GET /payments?customer_id=.
Виджет, ссылка на оплату и возврат в магазин
- Основной способ — виджет на вашей странице: QR СБП первым экраном, карта — на форме ПЦ внутри виджета. Виджету нужен только id платежа.
- payment_url — тот же виджет на нашей странице: для писем, мессенджеров и сайтов без JavaScript. method задаёт, что показать первым: sbp — QR (по умолчанию), card — сразу форму карты.
- confirmation: {"type": "redirect"} с method: "card": payment_url ведёт прямо на форму ввода карты ПЦ, минуя виджет.
- Email и телефон для чека берём из customer; в виджете их не спрашиваем.
- После оплаты покупатель автоматически возвращается на return_url через 10 секунд (в виджете — если не передан redirect: false); к адресу добавляется payment_id=<id>. По этому параметру запросите GET /payments/{id}: сам возврат не подтверждает оплату.
GET /payments/{id} — получить платёж
GET /payments — список
| Параметр | Тип | Описание |
|---|---|---|
| status | string | Статус платежа: pending authorized succeeded canceled expired refunded partially_refunded on_hold |
| order_id | string | Номер заказа магазина, точное совпадение |
| customer_id | string | Идентификатор покупателя магазина |
| method | string | Способ оплаты: card sbp |
| created_from | datetime | Созданы не раньше, ISO 8601 |
| created_to | datetime | Созданы не позже, ISO 8601 |
| limit | integer | Размер страницы, до 100 (по умолчанию 20) |
| starting_after | string | id последнего полученного объекта |
Курсорная пагинация: starting_after — id последнего полученного платежа. Ответ: {object: "list", data: [...], has_more: true}.
POST /payments/{id}/capture — списать холд
Только для status = authorized. Тело {"amount": 80000} — необязательно, для частичного списания (не больше суммы холда). Внимание: при частичном списании чек на изменённую сумму требует согласования с Оператором ПЦ; платёж помечается предупреждением.
POST /payments/{id}/cancel — отменить платёж
Для authorized — отмена холда, всегда на полную сумму: деньги разблокируются на карте.
Для pending — закрытие неоплаченного платежа, например при отмене заказа: страница оплаты перестаёт работать, платёж переходит в canceled с cancel_reason = merchant_canceled, приходит событие payment.canceled. Если покупатель в этот момент уже вводил карту и успел оплатить, платёж перейдёт в succeeded (или authorized) с соответствующим событием — верните деньги запросом POST /refunds или отмените холд.