[英]Stripe Basic PaymentIntent On Confirm Payment Error
[英]Confirm Stripe payment in SwiftUI (iOS 16)
我正在使用 Stripe API 接受 SwiftUI 中的卡支付。
我设法使用包装在UIViewRepresentable
中的STPPaymentCardTextField
成功付款,并使用提供的工作表修饰符.paymentConfirmationSheet(....)
确认它。
当我在 iOS 16 中采用新的NavigationStack
时出现了问题。如果.paymentConfirmationSheet(....)
出现在新的NavigationStack
中,它似乎无法正常工作。
有没有其他方式可以确认SwiftUI刷卡付款? 我怎样才能解决这个问题?
如果我切换回NavigationView
它会按预期工作,但我想使用NavigationStack
的新功能。
我的演示结帐视图及其视图模型
struct TestCheckout: View {
@ObservedObject var model = TestCheckoutViewModel()
var body: some View {
VStack {
CardField(paymentMethodParams: $model.paymentMethodParams)
Button("Pay") {
model.pay()
}
.buttonStyle(LargeButtonStyle())
.paymentConfirmationSheet(isConfirmingPayment: $model.confirmPayment,
paymentIntentParams: model.paymentIntentParams,
onCompletion: model.onPaymentComplete)
}
}
}
class TestCheckoutViewModel: ObservableObject {
@Published var paymentMethodParams: STPPaymentMethodParams?
@Published var confirmPayment = false
@Published var paymentIntentParams = STPPaymentIntentParams(clientSecret: "")
func pay() {
Task {
do {
// Create dummy payment intent
let paymentIntent = try await StripeManager.shared.getPaymentIntent(orderId: "", amount: 1000)
// Collect card details
let paymentIntentParams = STPPaymentIntentParams(clientSecret: paymentIntent.secret)
paymentIntentParams.paymentMethodParams = paymentMethodParams
// Submit the payment
DispatchQueue.main.async {
self.paymentIntentParams = paymentIntentParams
self.confirmPayment = true
}
} catch {
print(error)
}
}
}
func onPaymentComplete(status: STPPaymentHandlerActionStatus, paymentIntent: STPPaymentIntent?, error: Error?) {
print("Payment completed: \(error)")
}
}
现在这不起作用
struct TestView: View {
var body: some View {
NavigationStack {
NavigationLink("Checkout", value: "checkout")
.navigationDestination(for: String.self) { string in
if string == "checkout" {
TestCheckout()
}
}
}
}
}
但这确实
struct TestView: View {
var body: some View {
TestCheckout()
}
}
我得到的错误是:
Error Domain=com.stripe.lib Code=50 "There was an unexpected error -- try again in a few seconds" UserInfo={NSLocalizedDescription=There was an unexpected error -- try again in a few seconds, com.stripe.lib:StripeErrorTypeKey=invalid_request_error, com.stripe.lib:StripeErrorCodeKey=payment_intent_unexpected_state, com.stripe.lib:ErrorMessageKey=Nemůžete potvrdit tento Platební záměr, protože v něm chybí platební metoda. Můžete buď aktualizovat Platební záměr s platební metodou a pak jej znovu potvrdit, nebo jej znovu potvrďte přímo s platební metodou.}
最后我发现了问题。
问题是@ObservedObject var model = TestCheckoutViewModel()
。 由于某种原因,它不再与@ObservedObject
一起使用,它必须是@StateObject
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.