Рекуррентные платежи
Поддержка платежей
В настоящее время рекуррентные платежи Рекуррентные платежи – это возможность выполнять регулярные списания денег с банковской карты покупателя или электронного кошелька без повторного ввода реквизитов карты и без участия плательщика для инициации очередного платежа. в продукте не используются. Данный функционал реализован в рамках модуля sale для дальнейшего использования в модуле crm: CRM-форма рекуррентно обновляется, создаёт заказ, оплату, берёт токен из предыдущей оплаты, заполняет токеном новую оплату и вызывает api модуля sale для выполнения платежа.
Чтобы ваш обработчик поддерживал рекуррентные платежи, необходимо реализовать интерфейс \Bitrix\Sale\PaySystem\IRecurring.
После выполнения успешной оплаты необходимо сохранить токен в поле оплаты PS_RECURRING_TOKEN.
При следующей оплате нужно скопировать этот токен в новую оплату и вызывать метод по выполнению рекуррентного платежа, используя полученный токен в запросе на новый платёж.
На текущий момент рекуррентные платежи поддерживаются только ЮKassa.
Внимание! Рекуррентные платежи не поддерживаются ЮKassa при OAuth-авторизации.
Использование рекуррентных платежей доступно в облачной версии продукта или в коробочных версиях Битрикс24 (если установлен модуль crm), и такие платежи будут доступны только в CRM-формах.
Рекуррентный платёж поддерживается при следующих видах оплаты: банковская карта, ЮМоney и через виджет.
При настройке обработчика ЮKassa в форме настроек платежной системы (Магазин > Настройки > Платежные системы) появится чекбокс для установки "Автоплатежей". При включении этой настройки будет выполнен запрос на сохранение способа оплаты

Если ЮKassa подтвердит сохранение способа оплаты, то токен сохранится в поле PS_RECURRING_TOKEN.
Чтобы выполнить автоплатёж без подтверждения со стороны пользователя, необходимо скопировать значение токена в новую оплату заказа (поле PS_RECURRING_TOKEN).
Примечание: В дальнейшем данный функционал будет выполняться в модуле crm при использовании рекуррентных CRM-форм.
Пример
$order = \Bitrix\Sale\Order::load($id);
/** @var \Bitrix\Sale\Payment $payment */
$payment = null;
/** @var \Bitrix\Sale\PaymentCollection $paymentCollection */
$paymentCollection = $order->getPaymentCollection();
if ($paymentCollection)
{
/** @var \Bitrix\Sale\Payment $value */
foreach ($paymentCollection as $value)
{
if (!$value->isInner())
{
$payment = $value;
}
}
}
if ($payment)
{
$service = \Bitrix\Sale\PaySystem\Manager::getObjectById($payment->getPaymentSystemId());
$result = $service->repeatRecurringPayment($payment);
if ($result->isSuccess())
{
// всё хорошо, оплата выполнена, данные можно получить из $result->getData()
}
else
{
// возникли ошибки. Список ошибок можно получить из $result->getErrorMessages()
}
}