FPS (Faster Payments System) Integration for 1C-Bitrix
FPS is an interbank instant payment system of the Central Bank of Russia. For an online store, this means payment via the buyer's mobile bank using a QR code or link. No fee for the buyer; the merchant rate is a fixed percentage (typically 0.4–0.7%, lower than standard acquiring). Since 2023, major banks are required to support FPS — audience coverage is close to 100% among Russian bank users.
Technical Integration Options for FPS
Via acquiring bank — if the store already has an acquiring contract with an FPS-participating bank, it is sufficient to enable FPS in the bank's personal account. The payment method appears in the payment form automatically or via API with the payment_method: sbp parameter.
Via a payment aggregator — YooKassa, Tinkoff, and Sber provide FPS as an additional method in their API.
Direct integration via NSPK — for banks and large payment platforms. Requires a licence and a partnership agreement with NSPK.
Integration via YooKassa
// Creating a payment via FPS
$payment = $yookassaClient->createPayment([
'amount' => ['value' => $amount, 'currency' => 'RUB'],
'payment_method_data' => ['type' => 'sbp'],
'capture' => true,
'description' => 'Order #' . $orderId,
'confirmation' => [
'type' => 'redirect',
'return_url' => $returnUrl,
],
], uniqid('', true));
// Redirect the buyer to the YooKassa page with bank selection
$confirmationUrl = $payment->getConfirmation()->getConfirmationUrl();
header('Location: ' . $confirmationUrl);
Or with a QR code instead of a redirect:
$payment = $yookassaClient->createPayment([
'amount' => ['value' => $amount, 'currency' => 'RUB'],
'payment_method_data' => ['type' => 'sbp'],
'capture' => true,
'confirmation' => ['type' => 'qr'], // QR instead of redirect
], uniqid('', true));
$qrData = $payment->getConfirmation()->getConfirmationData();
// $qrData — payload string for generating a QR image
Integration via Tinkoff
// Tinkoff: creating a payment with FPS
$response = $tinkoffClient->init([
'Amount' => (int)($amount * 100), // kopecks
'OrderId' => 'BX_' . $orderId,
'Description' => 'Order #' . $orderId,
'PayType' => 'O', // O = single-stage
'DATA' => ['PaymentMethod' => 'SBP'],
'NotificationURL' => $notifyUrl,
'SuccessURL' => $successUrl,
'FailURL' => $failUrl,
]);
// Get the FPS QR link
$qrResponse = $tinkoffClient->getSbpQr(['PaymentId' => $response['PaymentId']]);
$sbpPayload = $qrResponse['QRURL']; // string for QR code
Displaying FPS in the Payment Form
In the payment page template — the "Pay via FPS" button opens a dialog with a QR code or link:
// Detect mobile device
const isMobile = /iPhone|iPad|iPod|Android/i.test(navigator.userAgent);
if (isMobile) {
// On mobile — deep link into the bank app
window.location.href = sbpPayload; // string of the form https://qr.nspk.ru/...
} else {
// On desktop — show QR for scanning with a phone
document.getElementById('sbp-qr').src = '/bitrix/tools/generate_qr.php?data='
+ encodeURIComponent(sbpPayload);
document.getElementById('sbp-qr-container').style.display = 'block';
// Poll status while the buyer pays
startStatusPolling(orderId);
}
Handling FPS Notifications
An FPS payment is confirmed via the same webhook mechanism as a card payment. There is no Bitrix handler-level difference — the aggregator normalises the notification:
// In the callback handler — the succeeded status is handled the same way
// regardless of the payment method (card, FPS, YooMoney)
if ($payment->getStatus() === 'succeeded') {
$bitrixPayment->setPaid('Y');
$bitrixPayment->save();
}
Payment Method Display Specifics
Recommended payment method order for online stores (2024–2025):
1. FPS (0% for buyer, fast)
2. VISA / Mastercard / Mir card
3. SberPay / Tinkoff Pay
4. Mir Pay
5. Cash / other
FPS is placed first — its conversion rate is higher due to the simplicity of confirmation via Face ID in the banking app.
Timeline
| Task | Duration |
|---|---|
| Connecting FPS via existing acquiring service | 0.5 day |
| QR code on payment page + polling | 1 day |
| Deep link for mobile devices | 0.5 day |







