Проблемы с STPAuthenticationContext в uiviewпредставляемом

#ios #swiftui #stripe-payments #uiviewrepresentable

Вопрос:

Я пытаюсь реализовать Stripe на SwiftUI. После регистрации пользователя я хотел бы, чтобы он добавил способ оплаты в свою учетную запись без фактического платежа. Я успешно создал поле STPPaymentCardTextField, используя UIViewRepresentable. Однако у меня возникли проблемы с контекстом проверки подлинности. Я не слишком уверен, как это сделать, так как примеры в документации Stripe предназначены только для UIKit. Вот что у меня есть до сих пор:

 struct StripePaymentCardTextField: UIViewRepresentable {

@Binding var cardParams: STPPaymentMethodCardParams
@Binding var isValid: Bool

func makeUIView(context: Context) -> STPPaymentCardTextField {
    let input = STPPaymentCardTextField()
    input.borderWidth = 0
    input.backgroundColor = UIColor(ColorManager.brandGray)
    input.cornerRadius = 10
    input.becomeFirstResponder()
    input.delegate = context.coordinator
    
    return input
}

func makeCoordinator() -> StripePaymentCardTextField.Coordinator { Coordinator(self) }

func updateUIView(_ view: STPPaymentCardTextField, context: Context) { }

class Coordinator: NSObject, STPPaymentCardTextFieldDelegate, STPAuthenticationContext {
    
    func authenticationPresentingViewController() -> UIViewController {
        return self
    }
    
    var parent: StripePaymentCardTextField
    
    init(_ textField: StripePaymentCardTextField) {
        parent = textField
    }
    
    func paymentCardTextFieldDidChange(_ textField: STPPaymentCardTextField) {
        parent.cardParams = textField.cardParams
        parent.isValid = textField.isValid
    }
    
    func createPaymentMethod(setupIntentClientSecret: String) {
        let paymentMethodParams = STPPaymentMethodParams(card: parent.cardParams, billingDetails: nil, metadata: nil)
        let setupIntentParams = STPSetupIntentConfirmParams(clientSecret: setupIntentClientSecret)
        
        setupIntentParams.paymentMethodParams = paymentMethodParams
        
        let paymentHandler = STPPaymentHandler.shared()
        paymentHandler.confirmSetupIntent(setupIntentParams, with: self) { (status, setupIntent, error) in
            switch (status) {
            case .failed:
                // Setup failed
                break
            case .canceled:
                // Setup canceled
                break
            case .succeeded:
                // Setup succeeded
                break
            @unknown default:
                fatalError()
                break
            }
        }
    }
}
 

}

В следующих строках кода я получаю сообщение об ошибке «Не удается преобразовать возвращаемое выражение типа ‘StripePaymentCardTextField.Координатор» для возврата типа «UIViewController»»

 func authenticationPresentingViewController() -> UIViewController {
    return self
}
 

Любая помощь была бы очень признательна! 🙂

Комментарии:

1. В Stripe есть страница с подробной документацией, на которой показано, как собирать данные карты без предварительного платежа: stripe.com/docs/payments/save-and-reuse?platform=ios

2. @koopajah-это именно то, за чем я следил. Я работаю со swiftui и столкнулся с проблемой. Пожалуйста, прочтите вопрос еще раз.

3. Извините, что я неправильно прочитал ваш код, и я вижу, что вы уже следуете этому документу. Основной пример, который я знаю для SwiftUI, — это прием платежа: github.com/stripe-samples/accept-a-payment/tree/main/… но, может быть, вы найдете в этом то, что вам нужно?

4. Я думаю, что вы хотите отойти от UIViewRepresentable конкретики и вместо этого перейти к этому потоку: github.com/stripe-samples/accept-a-payment/blob/main/…