QR‑код от Яндекс Пэй для Android

Maven Central

Yandex Pay Quick Payment SDK позволяет добавить в Android-приложение виджет быстрой оплаты через Яндекс Пэй. Пользователь один раз авторизуется, после чего может оплачивать покупки в офлайн-точках: приложение генерирует QR-код, который кассир сканирует на терминале.

Требования

Параметр Минимальная версия
Android API 24 (Android 7.0)
Kotlin 1.8.0
Java 8

Перед началом интеграции получите:

Быстрый старт

Минимальный рабочий пример — от нуля до отображения QR-кода.

1. Добавьте зависимости

// build.gradle.kts
dependencies {
    implementation("com.yandex.pay:quickpay:LATEST_VERSION")
}

Актуальная версия: com.yandex.pay:quickpay.

2. Инициализируйте SDK в Application

class MyApp : Application() {

    val quickPayListener = object : QuickPaymentStateListener {
        override fun onPaymentEnabledStateChanged(isEnabled: IsPaymentEnabled) {}
        override fun onSessionExpired() {}
        override fun onPaymentResult(result: QuickPayResult) {}
    }

    override fun onCreate() {
        super.onCreate()

        val config = QuickPayConfig(
            merchantId = "YOUR_MERCHANT_ID",
            environment = QuickPayEnvironment.SANDBOX, // для тестирования
        )
        YandexQuickPay.initialize(
            config = config,
            context = this,
            quickPaymentStateListener = quickPayListener,
        )
    }
}

3. Инициализируйте UI и покажите QR

class QrActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_qr)

        lifecycleScope.launch {
            YandexQuickPay.initUi(this@QrActivity, supportFragmentManager)

            if (YandexQuickPay.isQuickPaymentEnabled().value) {
                showQr()
            } else {
                showEnableButton()
            }
        }
    }

    private suspend fun showQr() {
        runCatching { YandexQuickPay.getPaymentSessionId() }
            .onSuccess { sessionId ->
                val qrBitmap = generateQrBitmap(sessionId)
                findViewById<ImageView>(R.id.qrImageView).setImageBitmap(qrBitmap)
            }
            .onFailure { error ->
                Log.e("QuickPay", "Ошибка получения сессии", error)
            }
    }

    private fun showEnableButton() {
        // Показать кнопку включения быстрой оплаты
    }
}

Примечание

SDK предоставляет sessionId в виде строки. Генерация QR-кода — на стороне приложения. Пример с библиотекой ZXing Android Embedded:

implementation("com.journeyapps:zxing-android-embedded:4.3.0")
fun generateQrBitmap(sessionId: String, sizePx: Int = 512): Bitmap {
    val hints = mapOf(EncodeHintType.ERROR_CORRECTION to ErrorCorrectionLevel.M)
    val bitMatrix = MultiFormatWriter().encode(
        sessionId,
        BarcodeFormat.QR_CODE,
        sizePx,
        sizePx,
        hints
    )
    return BarcodeEncoder().createBitmap(bitMatrix)
}

Жизненный цикл платёжной сессии

isQuickPaymentEnabled()
        │
        ├── false ──► Показать кнопку "Включить быструю оплату"
        │
        └── true ──► getPaymentSessionId()
                            │
                            └── sessionId ──► Сгенерировать QR
                                                    │
                            ┌───────────────────────┘
                            │
                     Ожидание событий
                            │
              ┌─────────────┼──────────────┐
              │             │              │
     onSessionExpired  onPaymentResult  onPaymentEnabledStateChanged
              │             │              │ (isEnabled = true)
              └─────────────┴──────────────┘
                            │
                   getPaymentSessionId()  ──► Новый QR

Сессия действительна до момента, определяемого сервером (поле expires_at в ответе). При истечении вызывается onSessionExpired() — в этот момент нужно запросить новую сессию и перегенерировать QR.

Документация

Предыдущая
Следующая