Миграция на Yandex Pay Kit
Это руководство поможет перейти с монолитного com.yandex.pay:pay (2.x) на новый модульный Yandex Pay Kit.
Yandex Pay Kit разбит на независимые модули — подключайте только те, которые нужны вашему приложению. Конфигурация (окружение, тема, локаль) задается один раз через единую точку входа YPay.init { … }, а сценарии подключаются через массив flow-модулей.
Что изменилось
|
Параметр |
Android SDK 2.x |
Yandex Pay Kit для Android |
|---|---|---|
|
Артефакт |
|
|
|
Точка входа |
|
|
|
Инициализация |
— |
|
|
Manifest-placeholders |
|
|
|
Окружение |
|
|
|
Локаль |
|
|
|
Тема экранов |
|
|
|
Конфиг сессии |
|
|
|
Получение сессии |
|
|
|
Платежные данные |
|
|
|
Контракт лаунчера |
|
|
|
Цветовая схема кнопки |
|
|
|
Тип кнопки |
|
|
Шаг 1. Обновление зависимостей
Монолитный артефакт com.yandex.pay:pay заменен на набор независимых flow-модулей. Подключите только те, которые нужны.
Было:
dependencies {
implementation "com.yandex.pay:pay:2.9.0"
}
Стало:
dependencies {
implementation "com.yandex.pay:pay-with-redirect:3.<MINOR>.<PATCH>"
// другие модули при необходимости
}
Актуальную версию можно посмотреть на Maven Central. Полный список доступных модулей — в документации Yandex Pay Kit.
Manifest-placeholders
В версии 3.0 добавлен обязательный placeholder — YANDEX_PAY_CLIENT_ID. Для миграции достаточно указать в нем то же значение, что и в YANDEX_CLIENT_ID:
android {
defaultConfig {
manifestPlaceholders = [
YANDEX_CLIENT_ID: "12345678901234567890", // как и раньше
YANDEX_PAY_CLIENT_ID: "12345678901234567890", // новый, можно тот же Client ID
]
}
}
Подробнее — в документации модуля Авторизация.
Примечание
Инициализация Firebase / AppMetrica осталась без изменений — см. документацию Легаси Яндекс Пэй Шаг 2. Настройка проекта.
Шаг 2. Обновление импортов
В Yandex Pay Kit все типы распределены из единого пакета com.yandex.pay в специализированные пакеты.
Было:
import com.yandex.pay.YPa
import com.yandex.pay.YPayConfig
import com.yandex.pay.YPayApiEnvironment
import com.yandex.pay.Locale
import com.yandex.pay.MerchantData
import com.yandex.pay.MerchantId
import com.yandex.pay.MerchantName
import com.yandex.pay.MerchantUrl
import com.yandex.pay.PaymentData
import com.yandex.pay.PaymentSession
import com.yandex.pay.PaymentSessionKey
import com.yandex.pay.PaymentMethodType
import com.yandex.pay.SessionListenerArgs
import com.yandex.pay.YPayButton
import com.yandex.pay.YPayButtonColorScheme
import com.yandex.pay.YPayContract
import com.yandex.pay.YPayContractParams
import com.yandex.pay.YPayLauncher
import com.yandex.pay.YPayResult
Стало:
import com.yandex.pay.facade.api.YPay
import com.yandex.pay.configuration.YPayEnvironment
import com.yandex.pay.configuration.YPayLocale
import com.yandex.pay.configuration.YPayTheme
import com.yandex.pay.merchant.MerchantId
import com.yandex.pay.payment.PaymentData
import com.yandex.pay.payment.YPayResult
import com.yandex.pay.session.PaymentMethodType
import com.yandex.pay.withredirect.api.facade.payWithRedirectFlow
import com.yandex.pay.withredirect.api.facade.payWithRedirect
import com.yandex.pay.withredirect.api.session.PaymentSession
import com.yandex.pay.withredirect.api.session.PaymentSessionKey
import com.yandex.pay.withredirect.api.session.SessionListenerArgs
import com.yandex.pay.withredirect.api.button.YPayButton
import com.yandex.pay.withredirect.api.launcher.YPayContractParams
import com.yandex.pay.withredirect.api.launcher.YPayLauncher
Шаг 3. Инициализация SDK
В Yandex Pay Kit перед первым обращением необходимо однократно проинициализировать SDK через DSL YPay.init. Окружение, тема и локаль теперь задаются глобально, а каждый flow-модуль подключается отдельно.
Было:
YPay.theme = YPayThemeColorScheme.SYSTEM
YPay.locale = Locale.SYSTEM
Стало:
class MyApplication : Application() {
override fun onCreate() {
super.onCreate()
FirebaseApp.initializeApp(this)
YPay.init(
context = this,
flows = listOf(
payWithRedirectFlow(merchantId = "MERCHANT_ID"), // ← merchantId переехал сюда
),
) {
environment = YPayEnvironment.PRODUCTION // ← было YPayApiEnvironment.PROD
theme = YPayTheme.SYSTEM // ← было YPayThemeColorScheme.SYSTEM
locale = YPayLocale.SYSTEM // ← было Locale.SYSTEM
}
}
}
Важно
YPay.init нужно вызывать строго до первого обращения к YPay.payWithRedirect (обычно — в Application.onCreate). Повторный вызов init игнорируется. Если flow-модуль payWithRedirectFlow не передан в flows, вызов YPay.payWithRedirect завершится исключением.
Смена merchantId
В предыдущей версии SDK merchantId передавался в каждый getYandexPaymentSession через YPayConfig. В Yandex Pay Kit он зафиксирован при init — чтобы поменять его без полного clear(), используйте reinit:
YPay.payWithRedirect.reinit(merchantId = "NEW_MERCHANT_ID")
Обновление темы и локали
В Yandex Pay Kit тема и локаль меняются через DSL, а не через mutable-поля:
Было:
YPay.theme = YPayThemeColorScheme.DARK
YPay.locale = Locale.RU
Стало:
YPay.updateConfiguration {
theme = YPayTheme.DARK
locale = YPayLocale.RU
}
Шаг 4. Получение платежной сессии
YPay.getYandexPaymentSession больше не принимает параметры Context и YPayConfig — конфигурация задается при вызове init. Работа с сессией теперь выполняется через отдельный flow-фасад payWithRedirect.
Было:
private val yaPayConfig = YPayConfig(
merchantData = MerchantData(
id = MerchantId("MERCHANT_ID"),
name = MerchantName("MERCHANT_NAME"),
url = MerchantUrl("https://merchant.com/"),
),
environment = YPayApiEnvironment.PROD,
)
private val paymentSession: PaymentSession = YPay.getYandexPaymentSession(
context = this,
config = yaPayConfig,
sessionKey = PaymentSessionKey(generateSessionKey()),
)
Стало:
private val paymentSession: PaymentSession = YPay.payWithRedirect.getYandexPaymentSession(
sessionKey = PaymentSessionKey(value = generateSessionKey()), // необязательный, по умолчанию — UUID
)
Примечание
MerchantName и MerchantUrl больше не передаются на стороне Android SDK. Достаточно merchantId в payWithRedirectFlow(...).
Удалить сессию по-прежнему можно явно:
YPay.payWithRedirect.removePaymentSession(sessionKey)
Шаг 5. Размещение кнопки оплаты
XML-разметка кнопки не изменилась — атрибуты ypay_color_scheme, ypay_corner_radius, ypay_has_outline_border остались с теми же значениями:
<com.yandex.pay.withredirect.api.button.YPayButton
android:id="@+id/y_pay_button"
android:layout_width="300dp"
android:layout_height="54dp"
app:ypay_color_scheme="by_theme"
app:ypay_corner_radius="4dp"
/>
Важно
Полное имя класса в layout изменилось: com.yandex.pay.YPayButton → com.yandex.pay.withredirect.api.button.YPayButton.
Программное изменение цветовой схемы
Кнопка больше не использует отдельный YPayButtonColorScheme — ее цветовая схема теперь определяется единым enum YPayTheme, который используется и для тем экранов.
Было:
yPayButton.colorScheme = YPayButtonColorScheme.BY_THEME
Стало:
yPayButton.colorScheme = YPayTheme.SYSTEM // BY_THEME → SYSTEM, LIGHT/DARK — без изменений
Тип кнопки
Тип кнопки CHECKOUT удален, доступен только PAY. Если вы использовали YPayButtonType.CHECKOUT, замените его на YPayButtonType.PAY.
Связь кнопки с сессией
Сигнатура bindTo и SessionListenerArgs сохранилась — поменялись только пакеты импортов:
// было
import com.yandex.pay.SessionListenerArgs
import com.yandex.pay.PaymentMethodType
// стало
import com.yandex.pay.withredirect.api.session.SessionListenerArgs
import com.yandex.pay.session.PaymentMethodType
paymentSession.bindTo(
sessionListener = yPayButton,
args = SessionListenerArgs(
selectedPaymentMethods = listOf(PaymentMethodType.CARD, PaymentMethodType.SPLIT),
),
)
Шаг 6. Лаунчер контракта
Сигнатура YPayLauncher сохранилась — поменялись только пакеты импортов:
// было
import com.yandex.pay.YPayLauncher
import com.yandex.pay.YPayResult
// стало
import com.yandex.pay.withredirect.api.launcher.YPayLauncher
import com.yandex.pay.payment.YPayResult
private val yandexPayLauncher = YPayLauncher(this) { result: YPayResult ->
when (result) {
is YPayResult.Success -> handleSuccess(orderId = result.orderId)
is YPayResult.Failure -> handleFailure(errorMsg = result.errorMsg)
YPayResult.Cancelled -> handleCancelled()
}
}
Замена YPayContract на YPayLauncher
Если вы использовали YPayContract, перейдите на YPayLauncher.
Было:
val launcher = registerForActivityResult(YPayContract(this)) { result ->
// обработка
}
// запуск
launcher.launch(
YPayContractParams(
paymentSession = paymentSession,
paymentData = paymentData,
),
)
Стало (запуск без кнопки):
val launcher = YPayLauncher(this) { result: YPayResult ->
// обработка
}
launcher.launch(
YPayContractParams(
paymentSession = paymentSession,
paymentData = paymentData,
),
)
Стало (запуск через YPayButton):
yPayButton.setOnClickListener(
yPayLauncher = launcher,
listener = { buttonLauncher ->
buttonLauncher.launch(
YPayContractParams(
paymentSession = paymentSession,
paymentData = paymentData,
),
)
},
)
Шаг 7. Запуск оплаты
PaymentData больше не является sealed-интерфейсом с единственным наследником PaymentUrlFlowData. Теперь это обычный data class. Удалите вложенный конструктор.
Было:
val paymentData = PaymentData.PaymentUrlFlowData(
paymentUrl = "payment-url",
)
val params = YPayContractParams(
paymentSession = paymentSession,
paymentData = paymentData,
)
Стало:
val paymentData = PaymentData(
paymentUrl = "payment-url",
metadata = null,
)
val params = YPayContractParams(
paymentSession = paymentSession,
paymentData = paymentData,
)
Запуск оплаты через кнопку и напрямую без кнопки не изменился:
// через кнопку
yPayButton.setOnClickListener(yandexPayLauncher) { launcher ->
launcher.launch(YPayContractParams(paymentSession = paymentSession, paymentData = paymentData))
}
// напрямую
yandexPayLauncher.launch(YPayContractParams(paymentSession = paymentSession, paymentData = paymentData))