我正在SwiftUI中使用Stripe API接受卡支付。
我设法使用UIViewRepresentable
Package 的STPPaymentCardTextField
成功付款,并使用提供的工作表修改器.paymentConfirmationSheet(....)
确认。
当我在iOS 16中采用新的NavigationStack
时,问题出现了。如果.paymentConfirmationSheet(....)
出现在新的NavigationStack
中,它似乎无法正常工作。
是否有其他方法可以在SwiftUI中确认卡支付?如何解决此问题?
如果我切换回NavigationView
,它会按预期工作,但我想使用NavigationStack
的新功能。
我的演示 checkout 视图及其视图模型
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.}
1条答案
按热度按时间0s0u357o1#
最后我发现了问题所在。
问题出在
@ObservedObject var model = TestCheckoutViewModel()
上,由于某种原因,它不再与@ObservedObject
一起工作,它必须是@StateObject
。