Разработка функционала кредитования на 1С-Битрикс
Встроенное кредитование в интернет-магазине — это возможность покупателю оформить рассрочку или кредит прямо на сайте, без визита в банк. С технической точки зрения это интеграция с банковским API, дополнительные шаги в процессе оформления заказа и специфическая логика в модуле sale. Встроенного модуля кредитования в 1С-Битрикс нет — реализация строится поверх существующей платёжной инфраструктуры.
Партнёры и их API
Основные кредитные партнёры для российского рынка:
| Банк / сервис | Тип API | Виджет | Рекуррент |
|---|---|---|---|
| Тинькофф Кредит | REST + SDK | Есть | Нет |
| Сбербанк Онлайн | REST + iframe | Есть | Нет |
| ПосБанк / Восточный | REST | Нет | Нет |
| МТС Банк | REST + JS SDK | Есть | Нет |
Каждый банк имеет sandbox-окружение и требует отдельного договора эквайринга. Технически интеграции похожи: отправить корзину → получить application_id → встроить виджет → дождаться webhook.
Архитектура на стороне Битрикс
Кнопка «Купить в кредит» на карточке товара. Добавляется через переопределение шаблона компонента catalog.element в /local/templates/. Не трогаем ядро — только шаблон и JS-обработчик.
Класс-обёртка над API банка:
namespace Local\Credit;
class TinkoffCreditClient
{
private string $shopId;
private string $secretKey;
private string $baseUrl = 'https://api.tinkoff.ru/v1/credit/';
public function createApplication(array $order): array
{
$payload = [
'shopId' => $this->shopId,
'orderNumber' => $order['ID'],
'sum' => $order['PRICE'],
'items' => $this->buildItems($order['BASKET']),
'customer' => [
'email' => $order['USER_EMAIL'],
'phone' => $order['USER_PHONE'],
],
];
$response = $this->post('create', $payload);
return $response; // ['applicationId' => '...', 'redirectUrl' => '...']
}
private function buildItems(array $basket): array
{
return array_map(fn($item) => [
'name' => $item['NAME'],
'quantity' => (int)$item['QUANTITY'],
'price' => (float)$item['PRICE'],
'sku' => $item['PRODUCT_ID'],
], $basket);
}
}
Создание заказа и привязка кредитной заявки
Стандартный флоу: покупатель выбирает кредит → мы создаём «резервный» заказ в статусе CREDIT_PENDING, получаем applicationId от банка, сохраняем его в свойство заказа.
// Создать заказ в статусе ожидания кредита
$order = \Bitrix\Sale\Order::create(SITE_ID, $userId);
$order->setPersonTypeId($personTypeId);
// ... заполнить корзину, адрес ...
// Добавить кастомное свойство заказа
$propCollection = $order->getPropertyCollection();
$propCreditId = $propCollection->getItemByOrderPropertyCode('CREDIT_APPLICATION_ID');
$propCreditId->setValue($applicationId);
$order->setField('STATUS_ID', 'CR'); // Кастомный статус «На рассмотрении кредита»
$order->save();
Свойство CREDIT_APPLICATION_ID создаётся заранее в Магазин → Настройки → Свойства заказа (тип — строка, код — CREDIT_APPLICATION_ID). В таблице b_sale_order_props_value появится запись, связанная с заказом.
Webhook: обработка решения банка
Банк присылает POST на эндпоинт /local/ajax/credit_webhook.php (или маршрут Laravel, если используется). Обязательно проверять подпись запроса:
// /local/ajax/credit_webhook.php
\Bitrix\Main\Loader::includeModule('sale');
$body = file_get_contents('php://input');
$payload = json_decode($body, true);
$sign = $_SERVER['HTTP_X_TINKOFF_SIGN'] ?? '';
// Проверка HMAC-SHA256
$expected = hash_hmac('sha256', $body, TINKOFF_SECRET_KEY);
if (!hash_equals($expected, $sign)) {
http_response_code(403);
exit;
}
$applicationId = $payload['applicationId'];
$status = $payload['status']; // APPROVED, REJECTED, SIGNED, CANCELLED
// Найти заказ по applicationId
$orderProps = \Bitrix\Sale\Internals\OrderPropsValueTable::getList([
'filter' => ['CODE' => 'CREDIT_APPLICATION_ID', 'VALUE' => $applicationId],
'select' => ['ORDER_ID'],
])->fetch();
if ($orderProps) {
$order = \Bitrix\Sale\Order::load($orderProps['ORDER_ID']);
match ($status) {
'APPROVED', 'SIGNED' => $order->setField('STATUS_ID', 'N'), // Новый
'REJECTED' => $order->setField('STATUS_ID', 'CN'), // Отменён
default => null,
};
$order->save();
}
http_response_code(200);
echo json_encode(['ok' => true]);
Отображение условий кредита: требования ЦБ
По закону «О потребительском кредите» (353-ФЗ) на странице товара обязательно выводить:
- Полную стоимость кредита (ПСК) в рублях и % годовых.
- Сумму переплаты.
- Количество и размер платежей.
Банк возвращает эти данные в ответе на создание заявки или в отдельном API-методе /v1/credit/terms. Выводить их нужно до того, как пользователь нажал «Оформить кредит».
$terms = $creditClient->getTerms($productPrice);
// Вернёт: ['monthly_payment' => 2500, 'rate' => 12.9, 'psk' => 15.4, 'total' => 30000]
Шаблон блока:
Кредит на 12 месяцев:
├── Ежемесячный платёж: 2 500 ₽
├── Ставка: 12,9% годовых
├── Переплата: 4 500 ₽
└── ПСК: 15,4% годовых
Личный кабинет: статус кредита
Страница /personal/credit/ — список оформленных кредитных заявок с текущим статусом. Данные берём из свойств заказов, фильтруя по CODE = 'CREDIT_APPLICATION_ID' и USER_ID. При необходимости — кнопка «Проверить статус» с запросом к API банка.
Отдельные нюансы
Отмена заказа. Если клиент отменяет заказ до подписания кредитного договора — нужно вызвать API банка для отмены заявки (/v1/credit/cancel). Иначе заявка «висит» на стороне банка.
Возврат по кредитному заказу. Банк имеет отдельный API для возвратов. Возврат денег идёт напрямую на кредитный счёт клиента, магазин получает уменьшение задолженности перед банком — это нужно обсуждать с менеджером банка при подключении.
Несколько банков. Реализуется через паттерн Strategy: интерфейс CreditProviderInterface с методами createApplication(), getTerms(), cancel(), refund(). Каждый банк — отдельный класс-реализация. В настройках компонента — выбор провайдера.
Сроки разработки
| Вариант | Состав | Срок |
|---|---|---|
| Один банк, базовый флоу | Кнопка + виджет + webhook, статус заказа | 4–7 дней |
| Полный флоу с возвратами | Webhook, отмены, возвраты, ЛК клиента | 8–12 дней |
| Несколько банков | Архитектура Strategy, конфигурирование | 12–18 дней |







