Настройка списания кэшбэка при оплате 1С-Битрикс

Наша компания занимается разработкой, поддержкой и обслуживанием решений на Битрикс и Битрикс24 любой сложности. От простых одностраничных сайтов до сложных интернет магазинов, CRM систем с интеграцией 1С и телефонии. Опыт разработчиков подтвержден сертификатами от вендора.
Предлагаемые услуги
Показано 1 из 1 услугВсе 1626 услуг
Настройка списания кэшбэка при оплате 1С-Битрикс
Простая
~1 рабочий день
Часто задаваемые вопросы
Наши компетенции:
Этапы разработки
Последние работы
  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1173
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    811
  • image_bitrix-bitrix-24-1c_development_of_an_online_appointment_booking_widget_for_a_medical_center_594_0.webp
    Разработка на базе Битрикс, Битрикс24, 1С для компании Development of an Online Appointment Booking Widget for a Medical Center
    564
  • image_bitrix-bitrix-24-1c_mirsanbel_458_0.webp
    Разработка на базе 1С Предприятие для компании МИРСАНБЕЛ
    745
  • image_crm_dolbimby_434_0.webp
    Разработка сайта на CRM Битрикс24 для компании DOLBIMBY
    655
  • image_crm_technotorgcomplex_453_0.webp
    Разработка на базе Битрикс24 для компании ТЕХНОТОРГКОМПЛЕКС
    976

Настройка списания кэшбэка при оплате 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 недели если кэшбэк-система разрабатывается с нуля.