ASWebAuthenticationSession
Для использования на iOS одним из рекомендуемых подходов является использование ASWebAuthenticationSession.
После создания транзакции и получения ссылки на транзакцию рекомендуется следующая реализация:
- В вашем обычном потоке (который включает Верификацию без предъявления карты) вы откроете ASWebAuthenticationSession со ссылкой, сгенерированной через API.
- Вы можете настроить это открытие так, как удобнее для вашего приложения.
- Вы будете отслеживать изменение URL (на
redirectUrl), а затем закроете страницу.
Чтобы поток работ ал, необходимо выполнить следующие шаги:
Шаг 1: Создание контроллера аутентификации платежа
Первый шаг — создать контроллер аутентификации платежа. Для этого создайте класс с именем IDPayAuthenticationController (или любым другим предпочитаемым вами именем).
Затем импортируйте фреймворк AuthenticationServices в начале класса.
Объявите класс как NSObject и реализуйте протокол ASWebAuthenticationPresentationContextProviding.
В результате должно получиться следующее:
import AuthenticationServices
class IDPayAuthenticationController: NSObject, ASWebAuthenticationPresentationContextProviding {
func presentationAnchor(for session: ASWebAuthenticationSession) -> ASPresentationAnchor {
if let windowScene = UIApplication.shared.connectedScenes.first as? UIWindowScene {
if let mainWindow = windowScene.windows.first {
return mainWindow
}
}
return ASPresentationAnchor()
}
}
Шаг 2: Реализация аутентификации
Откройте файл, в котором будет выполняться аутентификация, и добавьте необходимые импорты (в нашем примере мы делаем это в ContentView.swift).
import SwiftUI
import AuthenticationServices
Чтобы контролировать состояние аутентификации, мы создадим свойство @State.
@State private var isAuthenticated = false
Создайте экземпляр класса IDPayAuthenticationController вне тела структуры ContentView.
let idPayController = IDPayAuthenticationController()
Чтобы проверить платёж, создайте функцию под названием authenticatePayment.
func authenticatePayment() {
guard let url = URL(string: "URL_AUTHENTICATION") else { return }
var session: ASWebAuthenticationSession?
session = ASWebAuthenticationSession(url: url, callbackURLScheme: "BUNDLE") { callbackURL, error in
guard callbackURL != nil else {
if let error = error {
return print("Error during authentication: \(error.localizedDescription)")
}
return
}
// Processes the callback URL to check whether authentication succeeded
session?.cancel()
isAuthenticated = true
}
session?.presentationContextProvider = idPayController
session?.prefersEphemeralWebBrowserSession = true
session?.start()
}
Не забудьте изменить URL URL_AUTHENTICATION на URL аутентификации, полученный в вашей транзакции, а также callbackURLScheme BUNDLE на редирект, предоставленный при создании вашей транзакции (рекомендуем использовать Bundle Identifier вашего приложения).
Важно установить prefersEphemeralWebBrowserSession в значение true, чтобы обеспечить уникальную аутентификацию для каждой транзакции.
Для корректной работы требуются некоторые разрешения, такие как:
- Камера
- Геолокация
Чтобы узнать больше, рекомендуем ознакомиться с официальной документацией ASWebAuthenticationSession.