#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/…