Авторизация в 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()
Следующая