QR‑код от Яндекс Пэй для iOS
Yandex Pay Quick Payment SDK позволяет добавить в iOS-приложение виджет быстрой оплаты через Яндекс Пэй. Пользователь один раз авторизуется, после чего может оплачивать покупки в офлайн-точках: приложение генерирует QR-код, который кассир сканирует на терминале.
Репозиторий: yandex-quickpay-sdk-ios
Требования
| Параметр | Минимальная версия |
|---|---|
| iOS | 14.0 |
| Swift | 6.0 |
Перед началом интеграции получите:
- Merchant ID — идентификатор вашего магазина. Выдаётся менеджером Яндекс Пэй при подключении.
- OAuth Client ID — инструкция по получению.
- Настройте Info.plist и Entitlements по инструкции для iOS.
Примечание
SDK разработан под Swift 6. При Swift 5.9 или 5.10 с SWIFT_STRICT_CONCURRENCY = minimal SDK будет работать, однако рекомендуется перейти на Swift 6 для полной совместимости.
Быстрый старт
1. Подключите SDK
В Xcode: File → Add Package Dependencies, вставьте URL:
https://github.com/yandexmobile/yandex-quickpay-sdk-ios
2. Настройте Info.plist
<key>YandexClientID</key>
<string>YOUR_CLIENT_ID</string>
3. Инициализируйте SDK и покажите QR
import YandexQuickPaySDK
@main
class AppDelegate: UIResponder, UIApplicationDelegate {
lazy var quickPayListener = MyQuickPayListener()
func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool {
let config = QuickPayConfig(
merchantId: "YOUR_MERCHANT_ID",
environment: .sandbox,
theme: .system
)
YandexQuickPay.initialize(
configuration: config,
presenterViewController: nil,
quickPaymentStateListener: quickPayListener
)
return true
}
func application(_ app: UIApplication, open url: URL, options: [UIApplication.OpenURLOptionsKey: Any] = [:]) -> Bool {
return YandexQuickPay.instance.handleOpenURL(url)
}
func application(_ application: UIApplication, continue userActivity: NSUserActivity, restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
return YandexQuickPay.instance.handleUserActivity(userActivity)
}
}
class MyQuickPayListener: QuickPaymentStateListener {
func onPaymentEnabledStateChanged(isEnabled: Bool) {}
func onSessionExpired() {}
func onPaymentResult(quickpayResult: QuickPayResult) {}
}
class QrViewController: UIViewController {
private let imageView = UIImageView()
override func viewDidLoad() {
super.viewDidLoad()
view.addSubview(imageView)
Task { await loadQr() }
}
private func loadQr() async {
do {
let isEnabled = try await YandexQuickPay.instance.isQuickPaymentEnabled()
guard isEnabled else { showEnableButton(); return }
let sessionId = try await YandexQuickPay.instance.getPaymentSessionId()
imageView.image = generateQrImage(from: sessionId)
} catch {
showError(error)
}
}
}
Важно
QuickPaymentStateListener хранится как weak. Держите сильную ссылку на листенер в AppDelegate или ViewController, иначе колбэки перестанут приходить.
Важно
handleOpenURL(_ url: URL) и handleUserActivity(_:) необходимы для OAuth-авторизации в процессе enableQuickPayment(). Без них авторизация через Яндекс ID не завершится.
Примечание
SDK возвращает sessionId в виде строки. Генерация QR-кода — на стороне приложения. Пример с Core Image:
import CoreImage.CIFilterBuiltins
func generateQrImage(from string: String, size: CGFloat = 256) -> UIImage? {
let filter = CIFilter.qrCodeGenerator()
filter.message = Data(string.utf8)
filter.correctionLevel = "M"
guard let output = filter.outputImage else { return nil }
let scale = size / output.extent.width
let scaled = output.transformed(by: CGAffineTransform(scaleX: scale, y: scale))
return UIImage(ciImage: scaled)
}
Жизненный цикл платёжной сессии
Сессия действительна до момента, определяемого сервером (expires_at). При истечении вызывается onSessionExpired() — запросите новую сессию через getPaymentSessionId() и обновите QR.
Когда обновлять QR: при первом отображении экрана, onSessionExpired(), onPaymentResult(), onPaymentEnabledStateChanged(isEnabled: true).