Налаштування оплати за QR-кодом на 1С-Бітрікс
Оплата за QR-кодом — покупець сканує код на екрані або роздрукованому документі і підтверджує платіж у мобільному додатку банку або через СБП. Популярна в B2B (оплата рахунків), у пунктах видачі та як альтернативний метод для тих, хто не має при собі картки. Технічно QR-оплата на сайті Бітрікс реалізується через СБП (ЦБ РФ) або через власні QR-сервіси банків.
Два типи QR-кодів
Статичний QR — один код для одного магазину/рахунку, суму покупець вводить вручну при оплаті. Простий у реалізації, але незручний: потрібно вручну контролювати, хто і скільки заплатив.
Динамічний QR — кожен платіж генерує унікальний QR з конкретною сумою та ідентифікатором замовлення. Оплата автоматично зіставляється із замовленням. Це правильний варіант для e-commerce.
Динамічний QR через СБП
СБП ЦБ РФ підтримує динамічні QR-коди через банки-учасники. У більшості випадків реалізується через еквайринг:
// Створення QR через ЮКасса (метод sberqr або sbp)
$payment = $yookassaClient->createPayment([
'amount' => ['value' => $orderAmount, 'currency' => 'RUB'],
'payment_method_data' => ['type' => 'sberbank'], // або 'sbp'
'capture' => true,
'confirmation' => ['type' => 'qr'], // тип підтвердження — QR
'description' => 'Замовлення №' . $orderId,
], uniqid('', true));
// Отримуємо QR-зображення
$qrCodeUrl = $payment->getConfirmation()->getConfirmationData();
// $qrCodeUrl — URL зображення QR-коду або рядок payload для генерації
// Або через Тінькофф
$qrData = $tinkoffClient->getQr(['PaymentId' => $tinkoffPaymentId]);
$qrString = $qrData['Data']; // рядок для генерації QR
Генерація QR-зображення на сервері
Якщо еквайринг повертає рядок payload (а не готове зображення):
// Встановити: composer require endroid/qr-code
use Endroid\QrCode\Builder\Builder;
use Endroid\QrCode\Encoding\Encoding;
use Endroid\QrCode\Writer\PngWriter;
$result = Builder::create()
->writer(new PngWriter())
->data($qrString)
->encoding(new Encoding('UTF-8'))
->size(300)
->margin(10)
->build();
// Повертаємо як data URI або зберігаємо у файл
$qrDataUri = $result->getDataUri();
Відображення QR на сторінці замовлення
У шаблоні компонента sale.order.payment.result або на кастомній сторінці оплати:
<div class="qr-payment-block">
<p>Відскануйте QR-код у додатку вашого банку для оплати</p>
<img src="<?= $arResult['QR_IMAGE_URL'] ?>"
alt="QR-код для оплати"
width="250" height="250">
<p>Сума до оплати: <strong><?= $arResult['AMOUNT'] ?> грн.</strong></p>
<p>Код замовлення: <?= $arResult['ORDER_NUMBER'] ?></p>
<!-- Автоматична перевірка статусу кожні 5 секунд -->
<div id="qr-status">Очікуємо оплату...</div>
</div>
<script>
const checkInterval = setInterval(async () => {
const res = await fetch('/bitrix/tools/check_payment_status.php?order=<?= $orderId ?>');
const data = await res.json();
if (data.paid) {
clearInterval(checkInterval);
window.location.href = '/checkout/success/?order=<?= $orderId ?>';
}
}, 5000);
// Зупинити перевірку через 15 хвилин
setTimeout(() => clearInterval(checkInterval), 15 * 60 * 1000);
</script>
Polling статусу платежу
// /bitrix/tools/check_payment_status.php
$orderId = (int)($_GET['order'] ?? 0);
$order = \Bitrix\Sale\Order::load($orderId);
header('Content-Type: application/json');
if (!$order) {
echo json_encode(['paid' => false, 'error' => 'Order not found']);
exit;
}
// Перевіряємо через API еквайрингу (не лише через Бітрікс)
$externalId = getExternalPaymentId($orderId);
$status = $yookassaClient->getPaymentInfo($externalId)->getStatus();
if ($status === 'succeeded' && !$order->isPaid()) {
// Синхронізуємо статус
$payment = $order->getPaymentCollection()->current();
$payment->setPaid('Y');
$payment->save();
}
echo json_encode(['paid' => $order->isPaid()]);
Терміни
| Завдання | Термін |
|---|---|
| Генерація динамічного QR через еквайринг | 1 день |
| Polling статусу + JS-автооновлення сторінки | 0.5 дня |
| Тестування сценаріїв (успіх, таймаут, скасування) | 0.5 дня |







