Кнопки оплаты Яндекс Пэй

Компонент com.yandex.pay.withredirect.api.button.YPayButton входит в модуль pay-with-redirect модульного мобильного SDK. Подключение, YPay.init и PaymentSession описаны в разделе Подключение оплаты по платежной ссылке; обзор Android SDK — Яндекс Пэй для Android; Client ID и Firebase — Настройка окружения. Тот же виджет используется в сценарии Пэй Виджет рядом с in-app оплатой.

Что такое кнопка оплаты

Кнопка оплаты Яндекс Пэй позволяет пользователю начать оплату заказа в приложении в один тап.

Вид кнопки зависит от доступных для использования методов оплаты, которые указаны в классе SessionListenerArgs в поле selectedPaymentMethods при привязке к платёжной сессии:

  • доступна полная оплата и Сплит:

  • доступен только Сплит:

Примечание

Переданные методы оплаты должны быть доступны и на бэкенде вашего магазина.

Для кнопки можно настроить внешний вид (тема, скругление, обводка) и обработку нажатия через лаунчер.

Параметры кнопки

Тема и обводка задаются в XML атрибутами или в коде свойствами класса YPayButton. В коде для темы используется YPayTheme (SYSTEM, LIGHT, DARK) из пакета com.yandex.pay.configuration — она же задаётся глобально в YPay.init; свойство colorScheme у кнопки позволяет переопределить тему только для этого виджета.

Ширина кнопки задаётся обычным android:layout_width контейнера: внутренний контент адаптивно подстраивается под доступную ширину (нет отдельного API «размера в pt», как в ранних версиях монолитного SDK).

Параметр Значение (Kotlin / XML) Внешний вид
Тема
colorScheme / app:ypay_color_scheme YPayTheme.SYSTEM / by_theme Тёмная тема ОС


Светлая тема ОС

colorScheme / app:ypay_color_scheme YPayTheme.LIGHT / light
colorScheme / app:ypay_color_scheme YPayTheme.DARK / dark
Обводка hasOutlineBorder / app:ypay_has_outline_border false
true (по умолчанию)
Скругление cornerRadius / app:ypay_corner_radius 0dp
16dp
100dp

Тип кнопки для сценария оплаты: app:ypay_button_type="pay" (значение по умолчанию; в коде — YPayButtonType.PAY).

Работа с кнопкой

Примечание

Сначала выполните шаги из раздела Подключение оплаты по платежной ссылке: YPay.init с payWithRedirectFlow, получите PaymentSession, создайте YPayLauncher.

Разместите кнопку в вёрстке и задайте атрибуты префикса app:

<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <com.yandex.pay.withredirect.api.button.YPayButton
        android:id="@+id/ypay_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:ypay_button_type="pay"
        app:ypay_color_scheme="by_theme"
        app:ypay_corner_radius="8dp"
        app:ypay_has_outline_border="true" />
</androidx.constraintlayout.widget.ConstraintLayout>

XML-атрибуты

Атрибут Значения По умолчанию Описание
ypay_button_type pay pay Тип кнопки (сценарий оплаты)
ypay_color_scheme by_theme, light, dark by_theme Соответствует YPayTheme.SYSTEM, LIGHT, DARK
ypay_corner_radius dimension значение ресурса по умолчанию SDK Радиус скругления
ypay_has_outline_border boolean true Показывать обводку

В коде привяжите сессию и зарегистрируйте запуск оплаты. bindTo вызывается на кнопке (не на сессии). До bindTo вызов setOnClickListener не сработает.

import com.yandex.pay.payment.PaymentData
import com.yandex.pay.session.PaymentMethodType
import com.yandex.pay.withredirect.api.launcher.YPayContractParams
import com.yandex.pay.withredirect.api.session.SessionListenerArgs

ypayButton.bindTo(
    paymentSession = paymentSession,
    args = SessionListenerArgs(
        selectedPaymentMethods = listOf(PaymentMethodType.CARD, PaymentMethodType.SPLIT),
    ),
)

ypayButton.setOnClickListener(yPayLauncher) { buttonLauncher ->
    buttonLauncher.launch(
        YPayContractParams(
            paymentSession = paymentSession,
            paymentData = PaymentData(paymentUrl = getPaymentUrl()),
        ),
    )
}

После bindTo зарегистрируйте setOnClickListener(yPayLauncher, …) — полный пример запуска см. в разделе «Запуск через кнопку».

По умолчанию SessionListenerArgs использует только оплату картой: listOf(PaymentMethodType.CARD).

Важно

Нельзя вызывать View.setOnClickListener у YPayButton — будет исключение. Используйте только setOnClickListener(YPayActionLauncher, YPayButton.OnClickListener?), как в разделе «Запуск через кнопку».

Динамически сменить тему:

import com.yandex.pay.configuration.YPayTheme

ypayButton.colorScheme = YPayTheme.DARK

Полный сценарий (результат оплаты, ошибки, запуск без кнопки) — в разделе Подключение оплаты по платежной ссылке.