Быстрый старт
Подключите приём платежей к сайту или приложению: ваш сервер создаёт платёж, покупатель платит картой или по СБП на защищённой странице, результат приходит вебхуком.
REST + JSON. Базовый адрес: https://platezhka.online/api/v1. Все суммы — целые числа в копейках. Даты — ISO 8601 (МСК). Кодировка UTF-8.
Один и тот же API работает для тестового магазина (номер …DEMO, ключ sk_test_…, тестовый стенд ПЦ) и боевого (sk_live_…). Объекты магазинов не пересекаются; в каждом объекте есть поле shop_id.
Четыре шага до первой оплаты
- Зарегистрируйте кабинет. Вместе с боевым магазином создаётся тестовый, у него уже выпущен ключ sk_test_… (Интеграция → Подключение).
- Создайте платёж запросом POST /payments с номером заказа в order_id и передайте его id виджету на странице оформления (или отправьте покупателя на payment_url). Виджет показывает QR СБП, карту покупатель вводит на форме ПЦ внутри виджета.
- Получите результат вебхуком payment.succeeded или запросом GET /payments/{id}. Не полагайтесь на возврат покупателя на return_url.
- Переключитесь на боевой магазин после активации: замените ключ и адрес вебхука (см. Тестирование).
Создание платежа
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
}
]
}'
<?php
$ch = curl_init('https://platezhka.online/api/v1/payments');
curl_setopt_array($ch, [
CURLOPT_POST => true,
CURLOPT_RETURNTRANSFER => true,
CURLOPT_HTTPHEADER => [
'Authorization: Bearer sk_test_XXXX',
'Idempotency-Key: order-1001',
'Content-Type: application/json',
],
CURLOPT_POSTFIELDS => json_encode([
'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,
],
],
]),
]);
$payment = json_decode(curl_exec($ch), true);
// Сохраните $payment['id'] в заказе: его получит виджет на странице оформления
// (или отправьте покупателя на $payment['payment_url'])
import requests
response = requests.post(
"https://platezhka.online/api/v1/payments",
headers={"Authorization": "Bearer sk_test_XXXX", "Idempotency-Key": "order-1001"},
json={
"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,
},
],
},
)
payment = response.json()
# Сохраните payment["id"] в заказе: его получит виджет на странице оформления (или отправьте на payment["payment_url"])
const response = await fetch("https://platezhka.online/api/v1/payments", {
method: "POST",
headers: {
Authorization: "Bearer sk_test_XXXX",
"Idempotency-Key": "order-1001",
"Content-Type": "application/json",
},
body: JSON.stringify({
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,
},
],
}),
})
const payment = await response.json()
// Сохраните payment.id в заказе: его получит виджет на странице оформления (или отправьте на payment.payment_url)
Ответ 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"
}
Обработчик вебхука
Укажите адрес в кабинете (Интеграция → Подключение), проверьте подпись секретным ключом и отметьте заказ оплаченным. Подробнее — Вебхуки.
<?php
$secret = 'sk_test_...';
$body = file_get_contents('php://input');
parse_str(str_replace(',', '&', $_SERVER['HTTP_X_SIGNATURE'] ?? ''), $sig);
$expected = hash_hmac('sha256', ($sig['t'] ?? '') . '.' . $body, $secret);
if (abs(time() - (int) ($sig['t'] ?? 0)) > 300 || !hash_equals($expected, $sig['v1'] ?? '')) {
http_response_code(400);
exit;
}
$event = json_decode($body, true);
if ($event['type'] === 'payment.succeeded') {
$payment = $event['data'];
// Найдите заказ по $payment['order_id'], сверьте $payment['amount'] и отметьте его оплаченным.
// Событие может прийти повторно: обработка должна быть идемпотентной по $event['id'].
}
http_response_code(200);
import hashlib, hmac, time
from flask import Flask, request
app = Flask(__name__)
SECRET = "sk_test_..."
@app.post("/webhooks/platezhka")
def webhook():
parts = dict(kv.split("=", 1) for kv in request.headers.get("X-Signature", "").split(",") if "=" in kv)
signed = f"{parts.get('t', '')}.".encode() + request.get_data()
expected = hmac.new(SECRET.encode(), signed, hashlib.sha256).hexdigest()
fresh = abs(time.time() - int(parts.get("t", 0))) < 300
if not fresh or not hmac.compare_digest(expected, parts.get("v1", "")):
return "", 400
event = request.get_json()
if event["type"] == "payment.succeeded":
payment = event["data"]
# Найдите заказ по payment["order_id"], сверьте payment["amount"] и отметьте его оплаченным.
# Событие может прийти повторно: обработка должна быть идемпотентной по event["id"].
return "", 200
import crypto from "node:crypto"
import express from "express"
const app = express()
const SECRET = "sk_test_..."
app.post("/webhooks/platezhka", express.raw({ type: "application/json" }), (req, res) => {
const parts = Object.fromEntries((req.get("X-Signature") || "").split(",").map((kv) => kv.split("=")))
const expected = crypto.createHmac("sha256", SECRET).update(`${parts.t}.`).update(req.body).digest("hex")
const fresh = Math.abs(Date.now() / 1000 - Number(parts.t)) < 300
const given = Buffer.from(parts.v1 || "")
if (!fresh || given.length !== expected.length || !crypto.timingSafeEqual(given, Buffer.from(expected))) {
return res.sendStatus(400)
}
const event = JSON.parse(req.body)
if (event.type === "payment.succeeded") {
const payment = event.data
// Найдите заказ по payment.order_id, сверьте payment.amount и отметьте его оплаченным.
// Событие может прийти повторно: обработка должна быть идемпотентной по event.id.
}
res.sendStatus(200)
})
Что дальше
Сценарии подключения для интернет-магазина и сервиса с записью, справочник объектов, спецификация OpenAPI 3.
Без программирования
Счета и ссылки на оплату создаются в кабинете и работают без сайта: Ссылки на оплату.