QR‑код от Яндекс Пэй для Android
Yandex Pay Quick Payment SDK позволяет добавить в Android-приложение виджет быстрой оплаты через Яндекс Пэй. Пользователь один раз авторизуется, после чего может оплачивать покупки в офлайн-точках: приложение генерирует QR-код, который кассир сканирует на терминале.
Требования
| Параметр | Минимальная версия |
|---|---|
| Android API | 24 (Android 7.0) |
| Kotlin | 1.8.0 |
| Java | 8 |
Перед началом интеграции получите:
- Merchant ID — идентификатор вашего магазина. Выдаётся менеджером Яндекс Пэй при подключении.
- OAuth Client ID — инструкция по получению.
- Укажите Client ID в сборочном скрипте — инструкция.
Быстрый старт
Минимальный рабочий пример — от нуля до отображения 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.
Документация
Была ли статья полезна?
Предыдущая
Следующая