Добрый день!
Пытаюсь разобраться с подключением stripe (не через PaymentContext и базовые UI) необходимо с использованием 3D Secure 2 auth
Документация не богатая или это я мало что понимаю
при нажатии на копку я реализовал следующее:
let MyAPIClientRequest = IntentRequest()
MyAPIClientRequest.createSetupIntent { [weak self] result in
guard result.responseMessage == nil else { return }
guard let secretKey = result.responseObject else { return }
print("secretKey = \(secretKey.client_secret!)")
STPPaymentConfiguration.shared().publishableKey = "pk_test_EP2c8iEr8B2AQANHAhY0rQwL005VKHgH5I"
let cardParams = STPPaymentMethodCardParams()
cardParams.number = "4000000000003220"
cardParams.expMonth = 11
cardParams.expYear = 20
cardParams.cvc = "123"
let paymentMethodParams = STPPaymentMethodParams(
card: cardParams,
billingDetails: nil,
metadata: nil
)
let setupIntentParams = STPSetupIntentConfirmParams(clientSecret: secretKey.client_secret!)
setupIntentParams.paymentMethodParams = paymentMethodParams
let paymentManager = STPPaymentHandler.shared()
paymentManager.confirmSetupIntent(withParams: setupIntentParams, authenticationContext: self!, completion: { (status, setupIntent, error) in
switch (status) {
case .succeeded:
print("succeeded")
// Setup succeeded
case .canceled:
// Handle cancel
print("cancel")
case .failed:
// Handle error
print("ERROR = \(String(describing: error))")
@unknown default:
print("")
}
})
}
класс IntentRequest - запрос на получения client_secret
class IntentRequest: ServerRequest<Intent> {
func createSetupIntent(_ closure: @escaping (ServerRequest<Intent>) -> Void) {
let token = PaymantFlow.secretKey
let payment_method = "pm_card_visa"
let parameters = [
"payment_method": payment_method
]
Alamofire.request(baseUrlIntentString, method: .post, parameters: parameters, headers: headersWithStripeToken(token)).responseJSON { (response) in
switch response.result {
case .success(let responseObject):
print("responseObject = \(responseObject)")
if let responseArray = responseObject as? [String : AnyObject] {
self.responseObject = self.parseResponse(responseArray)
}
else {
if let responseDictionary = responseObject as? [String : AnyObject] {
self.responseMessage = self.parseError(responseDictionary) ?? NSLocalizedString("Some error occured.", comment: "")
} else {
self.responseMessage = NSLocalizedString("Some error occured.", comment: "")
}
}
case .failure(let error):
self.error = error as NSError?
}
closure(self)
}
}
//MARK: - Private -
func parseResponse(_ response: [String : AnyObject]) -> Intent? {
return Intent(withDictionary: response)
}
}
Класс Intent - для получения client_secret, чтобы передать его классу STPSetupIntentConfirmParams
class Intent: NSObject {
var client_secret: String?
//MARK: Parsing
init(withDictionary dictionary: Dictionary<String, AnyObject>) {
if let client_secret = dictionary["client_secret"] as? String {
self.client_secret = client_secret
}
super.init()
}
override init() {
super.init()
}
}
Ошибка в блоке paymentManager.confirmSetupIntent( case .failed: …)
ERROR = Optional(Error Domain=com.stripe.lib Code=50 "No such setupintent: seti_1FOOCSE1ZKr3K8CHdpgz6gtL" UserInfo={com.stripe.lib:ErrorMessageKey=No such setupintent: seti_1FOOCSE1ZKr3K8CHdpgz6gtL, com.stripe.lib:StripeErrorCodeKey=resource_missing, com.stripe.lib:StripeErrorTypeKey=invalid_request_error, com.stripe.lib:ErrorParameterKey=intent, NSLocalizedDescription=No such setupintent: seti_1FOOCSE1ZKr3K8CHdpgz6gtL})