Налаштування списання кешбеку при оплаті 1С-Бітрікс
При оформленні замовлення покупець бачить доступний баланс кешбеку і хоче використати його частково або повністю. Стандартний модуль sale не має вбудованого механізму «оплата бонусами» — потрібно розширювати платіжну систему або кошик. Якщо зробити це неправильно, кешбек списується двічі або замовлення переходить у статус оплачено з неправильною сумою.
Де зберігається кешбек
Якщо кешбек-система реалізована на базі модуля loyalty або кастомного рішення, баланси зберігаються у власній таблиці, наприклад local_cashback_balances. Ключові поля: USER_ID, AMOUNT, LAST_UPDATED. Операції фіксуються в local_cashback_transactions — це історія нарахувань і списань.
Якщо використовується стандартний «Купон» або «Знижка», кешбек виражається через механізм знижок модуля catalog. Але це хибна модель для реального кешбеку — знижки не прив'язані до конкретного користувача через баланс.
Механізм списання
Коректна модель: кешбек — це форма оплати, а не знижка. У таблиці b_sale_payment буде два платежі на замовлення: один через платіжну систему (сума, що залишається), другий — «оплата бонусами» (сума кешбеку).
Реєструємо кастомний обробник платіжної системи в /local/php_interface/include/sale_payment/cashback/handler.php:
class CashbackPaySystemHandler extends \Bitrix\Sale\PaySystem\ServiceHandler
{
public function initiatePay(
\Bitrix\Sale\Payment $payment,
\Yii\HttpRequest $request = null
): \Bitrix\Sale\PaySystem\ServiceResult
{
$result = new \Bitrix\Sale\PaySystem\ServiceResult();
$userId = $payment->getOrder()->getUserId();
$amount = $payment->getSum();
// Перевіряємо баланс
$balance = CashbackBalanceTable::getBalance($userId);
if ($balance < $amount) {
$result->addError(new \Bitrix\Main\Error('Недостатньо кешбеку'));
return $result;
}
// Резервуємо
CashbackBalanceTable::reserve($userId, $amount, $payment->getId());
$payment->setPaid('Y');
$payment->save();
return $result;
}
}
Резервування, а не негайне списання — тому що замовлення може бути скасоване. Фактичне списання відбувається при зміні статусу замовлення на «Виконано».
Обробник події скасування
AddEventHandler('sale', 'OnSaleOrderCanceled', function(\Bitrix\Sale\Order $order) {
foreach ($order->getPaymentCollection() as $payment) {
if ($payment->getPaySystem()->getField('CODE') === 'cashback') {
CashbackBalanceTable::releaseReserve(
$order->getUserId(),
$payment->getSum(),
$payment->getId()
);
}
}
});
Обмеження суми списання
Бізнес-правила: списувати не більше 30% суми замовлення, мінімальна оплата реальними грошима — 100 одиниць. Обмеження впроваджуються в компоненті чекауту (sale.order.ajax або кастомний) на рівні валідації форми (JS) і серверної перевірки.
$maxCashbackAllowed = min(
$order->getPrice() * 0.30, // 30% суми замовлення
CashbackBalanceTable::getBalance($userId), // фактичний баланс
$order->getPrice() - 100 // мінімальна оплата грошима
);
Значення передається в JS через data-max-cashback на полі вводу.
Склад робіт
- Розробка або адаптація таблиць балансу та транзакцій кешбеку
- Кастомний обробник платіжної системи
cashback - Логіка резервування/списання/повернення при скасуванні
- Обмеження суми списання в чекауті
- Відображення балансу та поля вводу у формі замовлення
Терміни: 1–2 тижні за наявності готової кешбек-системи. 3–4 тижні якщо кешбек-система розробляється з нуля.







