Перейти к основному содержимому

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.