Я пытаюсь использовать сохраненный клиентом способ оплаты в полосе для совершения платежей, но у меня возникают две проблемы.
1). Я не могу декодировать ответ JSON, который мой серверный вызов отправляет приложению, и получить Payment Method Id
. Я получаю полный ответ JSON, но когда я пытаюсь распечатать ID
, он возвращает ноль.
2). Если у пользователей сохранено несколько способов оплаты, как я узнаю, какие из них они собираются использовать при декодировании ответа JSON, чтобы получить Payment Method Id
?
Предполагаемый результат будет для пользователя, чтобы он мог использовать сохраненные способы оплаты, которые они ранее сохранили с использованием STPPaymentOptionsViewController
для осуществления платежей, но две проблемы, указанные выше, сохраняются.
Сторона сервера:
exports.listUserSavedCards = functions.https.onRequest(async (req, res) => {
var customerId = req.body.customer_id
const paymentMethods = await stripe.paymentMethods.list({
customer: customerId,
type: 'card',
}).then(function(paymentMethods) {
// asynchronously called
return res.send(paymentMethods);
});
})
Сторона приложения:
func listUserSavedCards(customerId: String) {
let URLString = "https://us-central1-example.cloudfunctions.net/" + "listUserSavedCards" as String
var requestData : [String : String]? = [String : String]()
requestData?.updateValue(customerId, forKey: "customer_id");
submitDataToURL(URLString, withMethod: "POST", requestData: requestData!) { (jsonResponse, err) in
if err != nil {
print(err)
return
}
else {
let response = jsonResponse["id"]
}
}
}
JSON Ответ:
["url": /v1/payment_methods, "object": list, "has_more": 0, "data": <__NSSingleObjectArrayI
0x600002c46800>(
{
"billing_details" = {
address = {
city = "<null>";
country = "<null>";
line1 = "<null>";
line2 = "<null>";
"postal_code" = 4553;
state = "<null>";
};
email = "<null>";
name = "<null>";
phone = "<null>";
};
card = {
brand = mastercard;
checks = {
"address_line1_check" = "<null>";
"address_postal_code_check" = pass;
"cvc_check" = pass;
};
country = US;
"exp_month" = 2;
"exp_year" = 2021;
fingerprint = OqzEjapFroTZ3Lqn;
funding = credit;
"generated_from" = "<null>";
last4 = 4444;
"three_d_secure_usage" = {
supported = 1;
};
wallet = "<null>";
};
created = 1588901399;
customer = "cus_HDdTb2Me8W6MUM";
id = "pm_1GgL2JB7pjuLNBFRl48k0nyg";
livemode = 0;
metadata = {
};
object = "payment_method";
type = card;
}
)
]
Отправить данные на URL:
do {
guard let url = URL(string: urlString) else {return};
let defaultSession = URLSession(configuration: .default)
var urlRequest = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 540)
urlRequest.httpMethod = method;
urlRequest.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Content-Type") // the request is JSON
urlRequest.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept") // the expected response is also JSON
let httpBodyData : Data?
try httpBodyData = JSONSerialization.data(withJSONObject: data, options: [.fragmentsAllowed]);
urlRequest.httpBody = httpBodyData;
let dataTask = defaultSession.dataTask(with: urlRequest, completionHandler: { (responseData, urlResponse, error) in
if error == nil {
do {
let response = try JSONSerialization.jsonObject(with: responseData!, options: [.fragmentsAllowed]) as! [String : Any];
completion(response, nil);
}
catch {
print("Exception")
let response : [String : Any] = [String : Any]()
completion(response, error);
}
}
else {
let response : [String : Any] = [String : Any]()
completion(response, error);
}
});
dataTask.resume();
}
catch {
print("Excetion in submitDataToURL")
}
}