Настройка оплаты по QR-коду в 1С-Битрикс
Когда покупатель оформляет заказ в интернет-магазине, он хочет заплатить в два клика — без ввода данных карты?
QR-код на странице оплаты решает эту задачу: сканирование, подтверждение в приложении банка, готово. Но под капотом — связка API эквайера, генерация QR, polling статуса и грамотный UX. Мы специализируемся на таких интеграциях под ключ для 1С-Битрикс и Битрикс24. Наш опыт — более 10 лет, поэтому мы сразу видим узкие места. Например, на одном из проектов с товарным запасом 150 000 SKU мы внедрили QR СБП через Тинькофф. Проблема была в том, что при пике в 100 одновременных заказов polling не успевал обрабатывать статусы, и часть платежей зависала. Мы оптимизировали: добавили очереди через агенты Битрикс и увеличили интервал polling до 5 секунд с экспоненциальным бэкоффом. В результате 99.9% платежей завершались корректно.
Типы QR-кодов для оплаты
QR СБП — через Систему быстрых платежей Банка России. Работает с любым банком-участником СБП. Согласно Положению Банка России № 580-П, переводы зачисляются за секунды. Комиссия составляет 0.4–0.7% от суммы — в 3–5 раз ниже, чем при карточном эквайринге. При среднемесячном обороте 1 млн руб экономия на комиссиях достигает 40 тыс руб.
QR банка — proprietary-формат конкретного банка (SberPay QR, Тинькофф QR). Работает только с приложением этого банка. Подходит для монобрендовой аудитории.
QR как картинка ссылки — обычная ссылка на страницу оплаты, закодированная в QR. Открывает мобильный браузер, покупатель выбирает способ оплаты на сайте. Проще в реализации, но добавляет лишний шаг.
QR СБП — оптимальный выбор для интернет-магазина
QR СБП выигрывает по ключевым параметрам: комиссия в 2–3 раза ниже карточной, деньги поступают мгновенно, отмена возврата — тоже. Для клиента — привычный сценарий: сканировать QR в любом банковском приложении. По статистике, 70% пользователей предпочитают СБП при наличии выбора. Экономия на комиссиях может достигать 80% по сравнению с картами. Например, при обороте 500 тыс руб в месяц экономия составит около 20 тыс руб, а при 2 млн — уже 80 тыс руб.
Как мы настраиваем оплату по QR-коду в 1С-Битрикс
Процесс настройки включает несколько шагов:
- Выбор эквайера и регистрация терминала (Тинькофф, ЮКасса или др.).
- Генерация QR-кода для каждого заказа через API эквайера.
- Организация polling статуса с клиентской и серверной стороны.
- Интеграция в стандартные компоненты 1С-Битрикс.
- Тестирование всех сценариев (успех, отмена, таймаут).
Как подключить QR СБП через Тинькофф
Сначала создаём платёж в эквайере через Init, получаем PaymentId. Затем запрашиваем QR-код через GetQr. Код PHP:
// Создаём платёж с типом QR
$params = [
'TerminalKey' => TINKOFF_TERMINAL,
'Amount' => (int)($order->getPrice() * 100),
'OrderId' => $order->getAccountNumber(),
'Description' => 'Заказ #' . $order->getAccountNumber(),
'NotificationURL' => 'https://shop.ru/bitrix/tools/sale_ps_result.php',
'PayType' => 'O',
];
$params['Token'] = tinkoffSign($params, TINKOFF_SECRET);
$initResult = tinkoffPost('/v2/Init', $params);
$paymentId = $initResult['PaymentId'];
// Запрашиваем QR для СБП
$qrParams = [
'TerminalKey' => TINKOFF_TERMINAL,
'PaymentId' => $paymentId,
'DataType' => 'IMAGE', // или 'PAYLOAD' для получения строки ссылки
];
$qrParams['Token'] = tinkoffSign($qrParams, TINKOFF_SECRET);
$qrResult = tinkoffPost('/v2/GetQr', $qrParams);
// $qrResult['Data'] — base64-encoded PNG с QR-кодом (при DataType=IMAGE)
// или строка-ссылка СБП (при DataType=PAYLOAD)
Важно обрабатывать ошибки: если платеж не создан, возвращать пользователю понятное сообщение. Мы всегда добавляем fallback на случай недоступности API эквайера.
Как реализовать QR СБП через ЮКасса
ЮКасса формирует QR СБП автоматически при создании платежа с методом sbp:
$payment = $client->createPayment([
'amount' => ['value' => '1500.00', 'currency' => 'RUB'],
'payment_method_data' => ['type' => 'sbp'],
'confirmation' => ['type' => 'qr'],
'description' => 'Заказ #' . $orderId,
], uniqid('', true));
$qrUrl = $payment->getConfirmation()->getConfirmationData();
// qrUrl — строка вида https://qr.nspk.ru/... — кодируем в QR на клиенте
Для отрисовки QR из URL на клиенте используем JS-библиотеку qrcodejs или qr-code-styling. Это быстрее и не нагружает сервер.
Отображение QR на странице и polling статуса
// Показываем QR и полим статус платежа
async function showQRPayment(orderId) {
const resp = await fetch('/api/get-payment-qr.php', {
method: 'POST',
body: JSON.stringify({ orderId }),
});
const data = await resp.json();
document.getElementById('qr-image').src = 'data:image/png;base64,' + data.qrBase64;
document.getElementById('qr-block').style.display = 'block';
// Polling: проверяем статус каждые 3 секунды
const pollInterval = setInterval(async () => {
const status = await checkPaymentStatus(orderId);
if (status === 'paid') {
clearInterval(pollInterval);
window.location.href = '/payment/success/';
}
if (status === 'expired') {
clearInterval(pollInterval);
showExpiredMessage();
}
}, 3000);
// Останавливаем polling через 15 минут
setTimeout(() => clearInterval(pollInterval), 15 * 60 * 1000);
}
Серверный скрипт проверки статуса:
// local/api/check-payment-status.php
$orderId = (int)($_POST['orderId'] ?? 0);
$paymentId = getExternalPaymentId($orderId); // сохранённый PaymentId Тинькофф
$params = [
'TerminalKey' => TINKOFF_TERMINAL,
'PaymentId' => $paymentId,
];
$params['Token'] = tinkoffSign($params, TINKOFF_SECRET);
$status = tinkoffPost('/v2/GetState', $params);
$map = [
'CONFIRMED' => 'paid',
'CANCELED' => 'cancelled',
'DEADLINE_EXPIRED' => 'expired',
];
echo json_encode([
'status' => $map[$status['Status']] ?? 'pending',
]);
Polling должен быть устойчивым: при ошибке сети делаем повторную попытку с экспоненциальной задержкой, не блокируем интерфейс.
Типичные ошибки при настройке QR-оплаты
Одна из распространенных проблем — таймаут при генерации QR через API эквайера. Если эквайер не отвечает в течение 10 секунд, необходимо предусмотреть fallback: показать пользователю альтернативный способ оплаты или повторить запрос с интервалом 1-2 секунды. Мы устанавливаем таймаут не менее 30 секунд для API Тинькофф и проверяем статус платежа в фоне через агенты.
Еще одна частая проблема — отсутствие обработки дублирующих уведомлений. Когда эквайер присылает несколько callback-запросов, нужно проверять статус платежа в БД перед обновлением. Иначе заказ может быть оплачен дважды. Это легко решается транзакционной блокировкой в MySQL.
Что входит в настройку QR-оплаты под ключ
| Компонент | Описание |
|---|---|
| Выбор и подключение эквайера | Тинькофф, ЮКасса или другой банк с СБП |
| Генерация QR-кода на странице заказа | base64-изображение или URL + отрисовка на клиенте |
| Polling статуса оплаты | Серверный скрипт + клиентский интервал с обработкой таймаутов |
| Интеграция с 1С-Битрикс | Платёжная система, обработчики оповещений, логирование |
| Документация и тестирование | Инструкция для администратора, тесты всех сценариев |
| Поддержка после запуска | Гарантия 1 месяц, консультации по доработкам |
Ориентировочные сроки
| Этап | Время |
|---|---|
| QR СБП через Тинькофф/ЮКасса | 1–2 дня |
| Polling статуса + UX обновления | 0.5–1 день |
| Интеграция в страницу оформления заказа | 0.5–1 день |
| Итого (с тестированием) | от 2 до 4 дней |
Свяжитесь с нами — оценим ваш проект и предложим оптимальное решение. Опыт интеграций — более 10 лет, гарантируем стабильную работу платежей. Получите оценку вашего проекта — оставьте заявку. Дополнительные материалы: Система быстрых платежей, QR-код.







