Swift - полоса с огненной базой не может разобрать ответ эфемерного ключа по протоколу STPCustomerEphemeralKeyProvider - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь использовать 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"
);
...