Классический эквайринг — это 1,5–2,5% с каждой транзакции. При обороте в миллион рублей в месяц вы отдаёте банку 15 000–25 000 рублей просто за то, что клиент заплатил картой.
СБП (Система быстрых платежей) по закону обходится дешевле: максимальная комиссия для большинства категорий бизнеса — 0,4–0,7%. Разница ощутимая.
Но самое интересное другое: СБП через QR-код или платёжную ссылку — это полноценная замена эквайрингу на сайте. Без терминала, без дорогостоящей интеграции с платёжной системой, и в большинстве случаев дешевле.
Разберём, как это работает и как подключить.
Как СБП работает для бизнеса
Для физических лиц СБП — это перевод по номеру телефона. Для бизнеса всё интереснее.
Три сценария приёма оплаты через СБП:
-
QR-код на кассе — покупатель сканирует, подтверждает в приложении банка, деньги приходят мгновенно. Для офлайна.
-
QR-код на сайте — генерируется динамический QR под конкретный заказ. Клиент сканирует смартфоном, оплачивает.
-
Платёжная ссылка — вместо QR генерируется ссылка. На мобильном устройстве открывает приложение банка напрямую. Идеальный UX для мобильного трафика.
Для сайта нужен второй или третий вариант — или оба одновременно (QR для десктопа, ссылка для мобильных).
Через кого подключать
Напрямую подключиться к СБП как юрлицо можно, но это долго: нужно договариваться с банком-участником, проходить интеграцию. Для большинства малого и среднего бизнеса проще через платёжный агрегатор.
ЮКасса (бывший Яндекс.Касса)
- Комиссия СБП: 0,4% для большинства категорий
- Подключение: онлайн за 1–3 дня
- SDK: Python, PHP, Node.js, Java
- Документация: хорошая, с примерами
- Плюс: встроенная поддержка 54-ФЗ (чеки)
Т-Банк (Тинькофф) Эквайринг
- Комиссия СБП: 0,4%
- Подключение: 1–2 дня если уже клиент банка
- SDK: Python, PHP, Node.js
- Документация: средняя
- Плюс: если уже работаете с Тинькофф — минимум бюрократии
CloudPayments
- Комиссия СБП: 0,5%
- Подключение: 2–5 дней
- Плюс: хорошее API, много интеграций
Рекомендуем ЮКассу — у неё лучшая документация и минимальные комиссии.
Интеграция через ЮКассу: пошагово
Установка:
pip install yookassa
Конфигурация:
from yookassa import Configuration, Payment
import uuid
Configuration.account_id = "ВАШ_SHOP_ID"
Configuration.secret_key = "ВАШ_СЕКРЕТНЫЙ_КЛЮЧ"
Создание платежа с СБП
from yookassa import Payment
from yookassa.domain.models import Currency
import uuid
from decimal import Decimal
def create_sbp_payment(
amount: Decimal,
order_id: str,
description: str,
return_url: str
) -> dict:
"""
Создаём платёж через СБП.
Возвращает confirmation_url для редиректа пользователя.
"""
payment = Payment.create({
"amount": {
"value": str(amount),
"currency": Currency.RUB
},
"payment_method_data": {
"type": "sbp"
},
"confirmation": {
"type": "redirect",
"return_url": return_url
},
"capture": True, # Автоматическое подтверждение
"description": description,
"metadata": {
"order_id": order_id
},
"receipt": {
"customer": {
"phone": "+79001234567" # Телефон покупателя для чека
},
"items": [
{
"description": description,
"quantity": "1.00",
"amount": {
"value": str(amount),
"currency": Currency.RUB
},
"vat_code": 1, # НДС не облагается
"payment_mode": "full_payment",
"payment_subject": "service"
}
]
}
}, uuid.uuid4())
return {
"payment_id": payment.id,
"status": payment.status,
"confirmation_url": payment.confirmation.confirmation_url
}
Обработка webhook-уведомлений
ЮКасса отправляет уведомление, когда платёж успешно проведён. Нужен эндпоинт для его обработки:
from fastapi import FastAPI, Request, HTTPException
from yookassa import Payment
import hmac
import hashlib
import json
app = FastAPI()
YOOKASSA_SECRET = "ВАШ_СЕКРЕТНЫЙ_КЛЮЧ"
@app.post("/webhook/yookassa")
async def yookassa_webhook(request: Request):
body = await request.body()
# Верификация подписи
signature = request.headers.get("X-Request-Id", "")
# ЮКасса не использует HMAC, но проверяйте IP-адрес отправителя
# Список доверенных IP: 185.71.76.0/27, 185.71.77.0/27, 77.75.153.0/25
data = json.loads(body)
event = data.get("event")
payment_object = data.get("object", {})
if event == "payment.succeeded":
payment_id = payment_object["id"]
order_id = payment_object.get("metadata", {}).get("order_id")
amount = payment_object["amount"]["value"]
# Помечаем заказ как оплаченный в вашей БД
await mark_order_paid(order_id, payment_id, amount)
elif event == "payment.canceled":
order_id = payment_object.get("metadata", {}).get("order_id")
await mark_order_canceled(order_id)
return {"status": "ok"}
async def mark_order_paid(order_id: str, payment_id: str, amount: str):
# Ваша логика обновления заказа в БД
pass
async def mark_order_canceled(order_id: str):
# Ваша логика отмены заказа
pass
Проверка статуса платежа
Для случаев, когда webhook не дошёл (у пользователя плохой интернет, закрыл вкладку):
def check_payment_status(payment_id: str) -> str:
"""Возвращает: pending, succeeded, canceled"""
payment = Payment.find_one(payment_id)
return payment.status
Фронтенд: QR и мобильная ссылка
// PaymentPage.tsx
import { useState } from 'react';
interface SBPPayment {
payment_id: string;
confirmation_url: string;
}
function PaymentPage({ orderId, amount }: { orderId: string; amount: number }) {
const [payment, setPayment] = useState<SBPPayment | null>(null);
const [loading, setLoading] = useState(false);
const initPayment = async () => {
setLoading(true);
const res = await fetch('/api/payment/create', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ orderId, amount }),
});
const data = await res.json();
setPayment(data);
setLoading(false);
};
const isMobile = /iPhone|Android/i.test(navigator.userAgent);
if (payment) {
return (
<div className="payment-block">
{isMobile ? (
// На мобильном — прямая ссылка, открывает приложение банка
<a href={payment.confirmation_url} className="btn-sbp">
Оплатить через СБП
</a>
) : (
// На десктопе — QR-код для сканирования телефоном
<div>
<p>Отсканируйте QR-код в приложении вашего банка</p>
<img
src={`https://api.qrserver.com/v1/create-qr-code/?data=${encodeURIComponent(payment.confirmation_url)}&size=250x250`}
alt="QR-код для оплаты СБП"
/>
</div>
)}
</div>
);
}
return (
<button onClick={initPayment} disabled={loading}>
{loading ? 'Создаём платёж...' : `Оплатить ${amount} ₽ через СБП`}
</button>
);
}
Подводные камни
Чеки по 54-ФЗ. СБП — это полноценный способ оплаты, и если вы работаете с физлицами, чек обязателен. ЮКасса умеет это из коробки, если передать данные о товарах при создании платежа (пример выше).
Возвраты. СБП поддерживает возвраты через API — деньги возвращаются на счёт покупателя в течение 5 дней. ЮКасса предоставляет метод Payment.cancel() для отмены и Refund.create() для возврата по уже прошедшему платежу.
Лимиты. По умолчанию СБП позволяет переводить до 100 000 рублей за одну операцию. Для крупных платежей нужно уточнять у банка-партнёра.
Тестирование. ЮКасса предоставляет тестовую среду с sandbox-режимом. Обязательно протестируйте полный цикл: создание → оплата → webhook → статус.
Сравнение: СБП vs карты
| Параметр |
СБП |
Карты (эквайринг) |
| Комиссия |
0,4–0,7% |
1,5–2,5% |
| Скорость зачисления |
Мгновенно |
1–3 рабочих дня |
| Терминал |
Не нужен |
Нужен для офлайна |
| Конверсия (десктоп) |
Чуть ниже |
Выше |
| Конверсия (мобайл) |
Сравнимо |
Сравнимо |
| Чарджбэк |
Нет |
Есть (риск) |
Вывод: для мобильного трафика и небольших сумм СБП выгоднее. Для крупных покупок с десктопа — стоит предложить оба варианта.
Итог
СБП — это реальная альтернатива эквайрингу, особенно для мобильного e-commerce. Экономия на комиссии может быть значительной при хорошем обороте.
Технически интеграция несложная: агрегатор (ЮКасса), создание платежа, webhook для подтверждения. На готовом Next.js или FastAPI проекте это занимает 1–2 дня.
Если хотите подключить СБП на вашем сайте — обсудим детали. Расскажем, что подойдёт в вашем случае и сколько это стоит.
Читайте также