Рекуррентные платежи Yandex Pay

Yandex Pay позволяет продавцам проводить рекуррентные платежи.

Для этого Yandex Pay отдает соответствующий платежный токен, который позволяет провести несколько платежей на заданную сумму.

Рекуррентные платежи могут быть обязательными или опциональными. На форме Yandex Pay у пользователя спрашивается согласие с регулярными списаниями на заданную сумму.

Запрос обязательного рекуррентного платежа

В этом случае на форме пользователь увидит соответствующее сообщение и обязательное согласие о необходимости регулярных платежей у продавца.

paymentData.recurringOptions = {
    type: YaPay.RecurringType.Recurring,
    optional: false,
};

Запрос опционального рекуррентного платежа

В этом случае на форме пользователь укажет предпочитаемый вариант платежа.

В ответе вместе с токеном вы получите указатель на согласие пользователя с рекуррентными платежами.
Тип полученного платежного токена будет соответствующий — рекуррентный или обычный.

paymentData.recurringOptions = {
    type: YaPay.RecurringType.Recurring,
    optional: true,
};

function onPaymentProcess(event) {
    // Указатель на согласие пользователя с рекуррентными платежами
    // и соответственно тип платежного токена — рекуррентный или обычный
    alert(`Recurring payment approve — ${event.recurringInfo.recurring}`);
}

Пример

let activeSession;

function onYaPayLoad(type, optional) {
    const YaPay = window.YaPay;

    if (activeSession) {
        activeSession.destroy();
        activeSession = null;
    }

    // Данные платежа
    const paymentData = {
        env: YaPay.PaymentEnv.Sandbox,
        version: 2,
        countryCode: YaPay.CountryCode.Ru,
        currencyCode: YaPay.CurrencyCode.Rub,
        merchant: {
            id: '<YOUR_MERCHANT_ID>',
            name: 'test-merchant-name',
            url: 'https://test-merchant-url.ru',
        },
        order: {
            id: 'order-id',
            total: { amount: '43980.00' },
            items: [
                { label: 'Яндекс.Станция Макс, черный', amount: '26990.00' },
                { label: 'Яндекс.Станция 2, антрацит', amount: '16990.00' },
            ],
        },
        paymentMethods: [
            {
                type: YaPay.PaymentMethodType.Card,
                gateway: 'test-gateway',
                gatewayMerchantId: 'test-gateway-merchant-id',
                allowedAuthMethods: [YaPay.AllowedAuthMethod.PanOnly],
                allowedCardNetworks: [
                    YaPay.AllowedCardNetwork.Visa,
                    YaPay.AllowedCardNetwork.Mastercard,
                    YaPay.AllowedCardNetwork.Mir,
                    YaPay.AllowedCardNetwork.Maestro,
                    YaPay.AllowedCardNetwork.VisaElectron,
                ],
            },
        ],
    };

    // Укавываем рекуррентный платеж
    if (type === 'RECURRING') {
        paymentData.recurringOptions = {
            type: YaPay.RecurringType.Recurring,
            optional: optional,
        };
    }

    // Обработчик на получение платежного токена
    function onPaymentProcess(event) {
        // Указатель на согласие пользователя с рекуррентными платежами
        // и соответственно тип платежного токена — рекуррентный или обычный
        console.log(`Recurring payment approve — ${event.recurringInfo.recurring}`);
    }

    // Обработчик на ошибки при оплате
    function onPaymentError(event) {
        console.log(`Payment error — ${event.reason}`);
    }

    // Обработчик на отмену оплаты
    function onPaymentAbort(event) {}

    // Создаем платежную сессию
    YaPay.createSession(paymentData, {
        onProcess: onPaymentProcess,
        onAbort: onPaymentAbort,
        onError: onPaymentError,
    })
        .then(function (paymentSession) {
            activeSession = paymentSession;

            paymentSession.mountButton(document.querySelector('#button_container'), {
                type: YaPay.ButtonType.Pay,
                theme: YaPay.ButtonTheme.Black,
                width: YaPay.ButtonWidth.Auto,
            });
        })
        .catch(function (err) {
            // Не получилось создать платежную сессию.
        });
}