Авторизация в Yandex Pay Kit – руководство для Android
Гайд по подключению авторизации с помощью Yandex Pay Kit для платформы Android.
Примечание
Миграция с com.yandex.android:authsdk (LoginSDK) — см. Миграция с LoginSDK.
Инициализация
Шаг 1. Получите идентификаторы
| Идентификатор | Что означает | Как получить |
|---|---|---|
Merchant ID |
UUID вашего магазина. | Настройки → Merchant ID |
YANDEX_CLIENT_ID |
OAuth Client ID для Yandex ID. | См. Создание OAuth Client ID |
YANDEX_PAY_CLIENT_ID |
OAuth Client ID платёжного контура. | Выдается менеджером по интеграции со стороны Яндекс Пэй |
Шаг 2. Подключите зависимость
// build.gradle.kts
dependencies {
// Другие зависимости
implementation("com.yandex.pay:auth:<LATEST_VERSION>")
// Другие модули Yandex Pay Kit, например:
// implementation("com.yandex.pay:assistant:<LATEST_VERSION>")
}
Шаг 3. Пропишите manifestPlaceholders
android {
defaultConfig {
manifestPlaceholders["YANDEX_CLIENT_ID"] = "<YOUR_CLIENT_ID>"
manifestPlaceholders["YANDEX_PAY_CLIENT_ID"] = "<YOUR_PAY_CLIENT_ID>"
}
}
Шаг 4. Вызовите YPay.init в Application
class MyApp : Application() {
override fun onCreate() {
super.onCreate()
YPay.init(
context = this,
flows = listOf(
authFlow(merchantId = "<YOUR_MERCHANT_ID>"),
// другие флоу, например assistantFlow(...)
),
) {
environment = YPayEnvironment.PRODUCTION // или SANDBOX
theme = YPayTheme.SYSTEM
locale = YPayLocale.SYSTEM
}
}
}
Повторные вызовы YPay.init игнорируются.
Запуск авторизации
Авторизация запускается из Activity или Fragment через ActivityResultLauncher. Результат приходит не в лямбду контракта, а через Flow authResultEvents.
Совет
Необходимо подписаться на события авторизации YPay.auth.authResultEvents до запуска самого флоу авторизации через authLauncher.launch.
Минимальный пример
class MyActivity : AppCompatActivity() {
private lateinit var authLauncher: ActivityResultLauncher<Unit>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
// 1. Регистрируем контракт. Лямбда обязательна по API, но результат туда не приходит.
authLauncher = registerForActivityResult(YPay.auth.getAuthContract()) { } // ← Unit
// 2. Подписываемся на результат авторизации.
lifecycleScope.launch {
repeatOnLifecycle(Lifecycle.State.STARTED) {
YPay.auth.authResultEvents.collect(::handleAuthResult) // ← результат тут
}
}
findViewById<Button>(R.id.login_button).setOnClickListener {
authLauncher.launch()
}
}
private fun handleAuthResult(result: YPayAuthResult) {
when (result) {
is YPayAuthResult.Success -> onSuccess(result.token)
is YPayAuthResult.Failure -> onFailure(result.message)
YPayAuthResult.Cancel -> onCancel()
}
}
}
Результаты
| Результат | Когда |
|---|---|
Success(token) |
Токен получен. token — OAuth token для авторизации пользователя в вашем приложении. |
Failure(message) |
Ошибка на любом этапе. message — строка для логов, не показывайте ее пользователю. |
Cancel |
Пользователь закрыл шторку или OAuth-флоу. |
Важно
Не пытайтесь читать результат из лямбды registerForActivityResult — там всегда Unit. Подписывайтесь только на authResultEvents.
Compose
@Composable
fun LoginButton(onResult: (YPayAuthResult) -> Unit) {
val launcher = rememberLauncherForActivityResult(YPay.auth.getAuthContract()) { }
LaunchedEffect() {
YPay.auth.authResultEvents.collect(onResult)
}
Button(onClick = { launcher.launch() }) { Text("Войти") }
}
В реальных условиях на authResultEvents лучше подписываться во ViewModel (stateIn), чтобы не получать повторные события при пересоздании экрана.
Состояние авторизации в виджете
SDK должен знать, авторизован ли пользователь в вашем приложении — это нужно для персонализации виджетов (например, YPayBenefitsWidget) и формирования текста на шторке авторизации.
setPartnerAuthState
Сообщает SDK актуальное состояние merchant-авторизации:
// После любой авторизации в вашем приложении, даже при авторизации без использования Yandex Pay Kit
YPay.auth.setPartnerAuthState(isUserAuthorized = true)
// При логауте
YPay.auth.setPartnerAuthState(isUserAuthorized = false)
Важно
Обновляйте isUserAuthorized при любой смене состояния авторизации — независимо от способа входа (даже без использования Yandex Pay Kit).
logout
Разлогинивает пользователя в компонентах Yandex Pay Kit:
YPay.auth.logout()
Шпаргалка
| Сценарий | Что вызывать |
|---|---|
Пользователь вошел через YPay.auth |
setPartnerAuthState(true) |
| Пользователь вошел другим способом | setPartnerAuthState(true) |
| Пользователь вышел из аккаунта | setPartnerAuthState(false) + logout() |