Stripe SCA необходимо обработать следующее действие

Раньше я использую строку в этом приложении, но все, что сделано внутренним разработчиком, но теперь полоса меняет свою реализацию и поддерживает изменение европейских платежей (поддержка 3D Secure Authentication) с помощью SCA, поэтому теперь мне нужно добавить библиотеку в свой локальный код, но я застрял на этом месте.

Я получил идентификатор клиента с сервера, но обработка следующего действия даст мне примерно такую ​​ошибку.

Error Domain=STPPaymentHandlerErrorDomain Code=1 "Произошла непредвиденная ошибка - попробуйте еще раз через несколько секунд" UserInfo={com.stripe.lib:ErrorMessageKey= PaymentIntent требует, чтобы перед использованием STPPaymentHandler был подключен PaymentMethod или Source., NSLocalizedDescription= Произошла непредвиденная ошибка - повторите попытку через несколько секунд}

Я не нашел здесь соответствующих документов

Вот мой код

//Api called on server for client id
    MyAPIClient.sharedClient.createAndConfirmPaymentIntent(paymentResult,
                                                                   amount: self.paymentContext.paymentAmount,
                                                                   returnURL: "payments-example://stripe-redirect",
                                                                   shippingAddress: self.paymentContext.shippingAddress,
                                                                   shippingMethod: self.paymentContext.selectedShippingMethod) { (clientSecret, error) in
                guard let clientSecret = clientSecret else {
                    completion(.error, error ?? NSError(domain: StripeDomain, code: 123, userInfo: [NSLocalizedDescriptionKey: "Unable to parse clientSecret from response"]))
                    return
                }
                STPPaymentHandler.shared().handleNextAction(forPayment: clientSecret, authenticationContext: paymentContext, returnURL: "payments-example://stripe-redirect") { (status, handledPaymentIntent, actionError) in
                    switch (status) {
                    case .succeeded:
                        guard let handledPaymentIntent = handledPaymentIntent else {
                            completion(.error, actionError ?? NSError(domain: StripeDomain, code: 123, userInfo: [NSLocalizedDescriptionKey: "Unknown failure"]))
                            return
                        }
                        if (handledPaymentIntent.status == .requiresConfirmation) {
                            // Confirm again on the backend
                            MyAPIClient.sharedClient.confirmPaymentIntent(handledPaymentIntent) { clientSecret, error in
                                guard let clientSecret = clientSecret else {
                                    completion(.error, error ?? NSError(domain: StripeDomain, code: 123, userInfo: [NSLocalizedDescriptionKey: "Unable to parse clientSecret from response"]))
                                    return
                                }

                                // Retrieve the Payment Intent and check the status for success
                                STPAPIClient.shared().retrievePaymentIntent(withClientSecret: clientSecret) { (paymentIntent, retrieveError) in
                                    guard let paymentIntent = paymentIntent else {
                                        completion(.error, retrieveError ?? NSError(domain: StripeDomain, code: 123, userInfo: [NSLocalizedDescriptionKey: "Unable to parse payment intent from response"]))
                                        return
                                    }

                                    if paymentIntent.status == .succeeded {
                                        completion(.success, nil)
                                    }
                                    else {
                                        completion(.error, NSError(domain: StripeDomain, code: 123, userInfo: [NSLocalizedDescriptionKey: "Authentication failed."]))
                                    }
                                }
                            }
                        } else {
                            // Success
                            completion(.success, nil)
                        }
                    case .failed:
                        completion(.error, actionError)
                    case .canceled:
                        completion(.userCancellation, nil)
                    }
                }

1 ответ

Решение

Мое решение было позвонить paymentManager.confirmPayment(withParams: params, authenticationContext: self) вместо того handleNextAction

Другие вопросы по тегам