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

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

Репозиторий: yandex-quickpay-sdk-ios

Требования

Параметр Минимальная версия
iOS 14.0
Swift 6.0

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

Примечание

SDK разработан под Swift 6. При Swift 5.9 или 5.10 с SWIFT_STRICT_CONCURRENCY = minimal SDK будет работать, однако рекомендуется перейти на Swift 6 для полной совместимости.

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

1. Подключите SDK

В Xcode: FileAdd 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).

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

Следующая