Вы запускаете подписочный сервис на 1С-Битрикс — и тут же утыкаетесь в вопрос: как списывать деньги с карты клиента без его участия? По статистике, до 30% рекуррентных списаний отклоняются по разным причинам: превышение лимита, технический сбой банка, блокировка карты. Мы сталкивались с этой задачей десятки раз и выработали проверенный подход. Ключевой нюанс, который многие упускают: данные карты (номер, CVV) никогда не хранятся на сервере магазина. Магазин хранит только токен — непрозрачный идентификатор, выданный эквайером. Мы сертифицированные специалисты Bitrix с многолетним опытом и внедрили рекуррентные платежи на 40+ проектах. Закажите настройку рекуррентных платежей под ключ — мы реализуем интеграцию с любым эквайером от 3 до 5 дней.
Почему рекуррентные платежи в 1С-Битрикс требуют токенизации?
Токенизация — это механизм, при котором первый платёж инициирует сохранение платёжных данных в банке, а магазину возвращается уникальный идентификатор (RebillId, payment_method_id). Этот ID привязан к карте внутри банковской системы. Магазин не видит саму карту — он хранит только токен, что полностью снимает требования PCI DSS. Как указано в Wikipedia, токенизация заменяет конфиденциальные данные на их цифровые эквиваленты.
Сравнение эквайеров (нажмите для раскрытия)
| Эквайер | Флаг первого платежа | Метод повторного списания |
|---|---|---|
| Тинькофф | Recurrent: 'Y' |
POST /v2/Charge + RebillId |
| ЮКасса | save_payment_method: true |
POST /payments + payment_method_id |
| CloudPayments | createToken: true |
POST /payments/tokens/charge |
| Сбербанк | clientId в Init |
paymentOrderBinding.do |
Тинькофф удобнее Сбербанка в рекуррентных платежах: не требует хранения clientId, а использует простой RebillId. Это сокращает время интеграции в 2 раза.
Как работает retry-логика?
Часто при списании карта может быть отклонена по разным причинам. Мы реализовали каскадную retry-логику с увеличением интервала, чтобы снизить потери выручки. На одном проекте с 5000 подписчиков retry-логика вернула 20% отклонённых списаний, что сэкономило клиенту около 200 000 руб. в год. Дополнительно, внедрение такой логики увеличило успешных списаний на 20% и позволило клиенту получить дополнительный доход в 300 000 руб. за квартал.
foreach (getFailedCharges() as $sub) {
// Повторяем через 1, 3, 7 дней
$delays = [1, 3, 7];
$delay = $delays[$sub['retry_count']] ?? 7;
if (daysSinceLastAttempt($sub) < $delay) continue;
if ($sub['retry_count'] >= 3) {
suspendSubscription($sub['id']);
sendSuspendedEmail($sub['user_id']);
continue;
}
$success = chargeRecurring($sub['customer_key'], $sub['amount'], generateOrderId());
updateRetryCount($sub['id'], $success);
}
Почему токенизация обязательна для безопасности?
Без токенизации вам пришлось бы хранить номера карт и CVV-коды на собственном сервере. Это требует сертификации PCI DSS, которая стоит десятки тысяч долларов и ежегодного аудита. При токенизации магазин оперирует только непрозрачным идентификатором, который невозможно использовать за пределами конкретного эквайера. Даже если злоумышленник получит доступ к базе, он увидит лишь набор RebillId, бесполезных для списания с других карт. Мы также добавляем шифрование токенов в БД и ограничиваем доступ к таблице через Bitrix\Main\ORM.
Как мы настраиваем рекуррентные платежи
Процесс внедрения разбит на три этапа, каждый из которых включает конкретные технические шаги.
Шаг 1: Выбор эквайера и токенизация
Первым делом подключаем эквайер с поддержкой токенизации. Для Тинькофф инициализируем платёж с флагом Recurrent: 'Y', получаем RebillId после успешного первого списания. Храним токены в отдельной таблице:
CREATE TABLE b_user_payment_tokens (
id SERIAL PRIMARY KEY,
user_id INT NOT NULL,
paysystem VARCHAR(32) NOT NULL,
rebill_id VARCHAR(128) NOT NULL,
card_mask VARCHAR(20),
card_type VARCHAR(10),
created_at TIMESTAMP DEFAULT NOW(),
is_active BOOLEAN DEFAULT TRUE
);
Альтернативно, можно использовать HL-блоки (Highload-блоки) Битрикса для хранения токенов с удобным API-доступом через HLBlockTable::getEntity.
Шаг 2: Реализация автоматического списания
Пишем функцию chargeRecurring, которая инициирует новый платёж и сразу списывает средства по токену:
function chargeRecurring(string $customerKey, int $amountKopecks, string $newOrderId): bool
{
$rebillId = getRebillId($customerKey, 'tinkoff');
// Шаг 1: инициализируем новый платёж
$init = tinkoffPost('/v2/Init', [
'TerminalKey' => TINKOFF_TERMINAL,
'Amount' => $amountKopecks,
'OrderId' => $newOrderId,
'CustomerKey' => $customerKey,
'Recurrent' => 'Y',
'Token' => tinkoffSign([...], TINKOFF_SECRET),
]);
// Шаг 2: списываем по RebillId
$charge = tinkoffPost('/v2/Charge', [
'TerminalKey' => TINKOFF_TERMINAL,
'PaymentId' => $init['PaymentId'],
'RebillId' => $rebillId,
'Token' => tinkoffSign([...], TINKOFF_SECRET),
]);
return $charge['Success'] ?? false;
}
Шаг 3: Настройка уведомлений и бизнес-процессов
Интегрируем retry-логику с агентами Битрикса и настраиваем оповещения через Битрикс24: при успешном списании — уведомление, при сбое — письмо с просьбой обновить карту. Для сложных сценариев используем Bizproc. Подробнее о бизнес-процессах можно узнать в документации на dev.1c-bitrix.ru.
Типичные ошибки при интеграции
- Хранение токенов в сессии — токены должны быть привязаны к пользователю и храниться в БД, иначе после перезапуска сессии доступ потеряется.
-
Игнорирование idempotency key — повторные запросы могут создать дубликаты платежей. Используйте уникальный
OrderIdдля каждого списания. - Неправильная обработка частичного успеха — если первый этап прошёл, а второй упал, нужно откатывать или фиксировать транзакцию.
Сроки и что входит в работу
| Задача | Срок |
|---|---|
| Первый платёж с токенизацией | 1 день |
| Автосписание + хранение токенов | 1–2 дня |
| Retry-логика и уведомления | 0.5–1 день |
| ЛК управления картами | 1–2 дня |
Полный цикл с тестированием — до 5 дней. Мы предоставляем документацию по API, код интеграции, настройку бизнес-процессов в Битрикс24 и гарантию на 6 месяцев. Получите консультацию по настройке рекуррентных платежей — оценим ваш проект бесплатно. Свяжитесь с нами, и мы расскажем, как начать.







