Я пытаюсь использовать Stripe с firebase и swift для хранения кредитной карты пользователя. В настоящее время я создаю пользователя в полосе, когда он создается в Firebase, но по какой-то причине я получаю эту ошибку Could not parse the ephemeral key response following protocol STPCustomerEphemeralKeyProvider
при попытке представить презентацию PaymentOptionsViewController
:
var backendBaseURL: String? = "https://us-central1-example.cloudfunctions.net/"
var paymentContext: STPPaymentContext?
MyAPIClient.sharedClient.baseURLString = self.backendBaseURL
let customerContext = STPCustomerContext(keyProvider: MyAPIClient.sharedClient)
let paymentContext = STPPaymentContext(customerContext: customerContext)
paymentContext.hostViewController = self
paymentContext.presentPaymentOptionsViewController()
Клиент API:
enum APIError: Error {
case unknown
var localizedDescription: String {
switch self {
case .unknown:
return "Unknown error"
}
}
}
static let sharedClient = MyAPIClient()
var baseURLString: String? = nil
var baseURL: URL {
if let urlString = self.baseURLString, let url = URL(string: urlString) {
return url
} else {
fatalError()
}
}
func createCustomerKey(withAPIVersion apiVersion: String, completion: @escaping STPJSONResponseCompletionBlock) {
let url = self.baseURL.appendingPathComponent("ephemeral_keys")
var urlComponents = URLComponents(url: url, resolvingAgainstBaseURL: false)!
urlComponents.queryItems = [URLQueryItem(name: "api_version", value: apiVersion)]
var request = URLRequest(url: urlComponents.url!)
request.httpMethod = "POST"
let task = URLSession.shared.dataTask(with: request, completionHandler: { (data, response, error) in
guard let response = response as? HTTPURLResponse,
response.statusCode == 200,
let data = data,
let json = ((try? JSONSerialization.jsonObject(with: data, options: []) as? [String : Any]) as [String : Any]??) else {
completion(nil, error)
return
}
completion(json, nil)
})
task.resume()
}
Функции:
exports.createStripeCustomer = functions.auth.user().onCreate(async (user) => {
const customer = await stripe.customers.create({email: user.email});
return admin.firestore().collection('stripe_customers').doc(user.uid).set({customer_id: customer.id});
});
Когда я распечатываю ответ в createCustomKey:
Optional(<NSHTTPURLResponse: 0x28166dc20> { URL: https://accounts.google.com/ServiceLogin?service=ah&passive=true&continue=https://appengine.google.com/_ah/conflogin%3Fcontinue%3Dhttps://us-central1-example-1f886.cloudfunctions.net/ephemeral_keys%253Fapi_version%253D2019-05-16 } { Status Code: 200, Headers {
"Cache-Control" = (
"no-cache, no-store, max-age=0, must-revalidate"
);
"Content-Type" = (
"text/html; charset=UTF-8"
);
Date = (
"Tue, 14 Apr 2020 10:34:35 GMT"
);
Expires = (
"Mon, 01 Jan 1990 00:00:00 GMT"
);
Pragma = (
"no-cache"
);
Server = (
GSE
);
"Set-Cookie" = (
"GAPS=1:Rv3nwKVACX7K4OSq4wyvhkby6K_ScA:X1_DgRVnY6h7uHUG;Path=/;Expires=Thu, 14-Apr-2022 10:34:35 GMT;Secure;HttpOnly;Priority=HIGH"
);
"Strict-Transport-Security" = (
"max-age=31536000; includeSubDomains"
);
"alt-svc" = (
"quic=\":443\"; ma=2592000; v=\"46,43\",h3-Q050=\":443\"; ma=2592000,h3-Q049=\":443\"; ma=2592000,h3-Q048=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,h3-T050=\":443\"; ma=2592000"
);
"content-security-policy" = (
"script-src 'report-sample' 'nonce-mIemXblM4LXLK6sOz7HVkg' 'unsafe-inline' 'unsafe-eval';object-src 'none';base-uri 'self';report-uri /cspreport"
);
"x-auto-login" = (
"realm=com.google&args=service%3Dah%26continue%3Dhttps%253A%252F%252Fappengine.google.com%252F_ah%252Fconflogin%253Fcontinue%253Dhttps%253A%252F%252Fus-central1-example-1f886.cloudfunctions.net%252Fephemeral_keys%25253Fapi_version%25253D2019-05-16"
);
"x-content-type-options" = (
nosniff
);
"x-frame-options" = (
DENY
);
"x-xss-protection" = (
"1; mode=block"
);