Исходя из поста Фрэнкса здесь , я решил подождать изменения в базе данных Firebase.Ниже приведен рабочий процесс и код (в файле index.js нет изменений):
1. Пользователь отправляет информацию о платеже в базу данных Firebase в реальном времени (например, сумму валюты и токен карты) по пути / users / {userId} / charge
2. Firebase запускает функцию, которая отправляет запрос на оплату (stripe.charge.create) в Stripe.
3. После получения ответа запишите его обратно в базу данных Firebase.если ответ не удался, напишите сообщение об ошибке в базу данных (см. функции userFacingMessage в index.js)
4. На стороне клиента (Swift) дождитесь изменения в базе данных Firebase, чтобы проверить, был ли ответ успешным или нетс помощью Observe (.childChanged) (см. код Swift)
5. Если ответ успешен, отобразить успешное сообщение для пользователя.Если есть какие-либо ошибки, такие как (платеж не прошел из-за истечения срока действия кредитной карты), отобразите сообщение об ошибке пользователю (также отобразите сообщение «Пожалуйста, попробуйте еще раз»)
ChargeViewController.swift
func didTapPurchase(for amountCharge: String, for cardId: String) {
print("coming from purchas button", amountCharge, cardId)
guard let uid = Auth.auth().currentUser?.uid else {return}
guard let cardId = defaultCardId else {return}
let amount = amountCharge
let currency = "usd"
let value = ["source": cardId, "amount": amount, "currency": currency] as [String: Any]
let ref = Database.database().reference().child("users").child(uid).child("charges")
ref.childByAutoId().updateChildValues(value) { (err, ref) in
if let err = err {
print("failed to inserted charge into db", err)
}
print("successfully inserted charge into db")
//Here, Wait for the response that has been changed
waitForResponseBackFromStripe(uid: uid)
}
}
func waitForResponseBackFromStripe(uid: String) {
let ref = Database.database().reference().child("users").child(uid).child("charges")
ref.observe(.childChanged, with: { (snapshot) in
guard let dictionary = snapshot.value as? [String: Any] else {return}
if let errorMessage = dictionary["error"] {
print("there's an error happening so display error message")
let alertController = UIAlertController(title: "Sorry:(\n \(errorMessage)", message: "Please try again", preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: nil))
//alertController.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: nil))
self.present(alertController, animated: true, completion: nil)
return
} else {
let alertController = UIAlertController(title: "Success!", message: "The charge was Successful", preferredStyle: .alert)
alertController.addAction(UIAlertAction(title: "Ok", style: .cancel, handler: nil))
self.present(alertController, animated: true, completion: nil)
}
}) { (err) in
print("failed to fetch charge data", err.localizedDescription)
return
}
}
Если я сделал что-то логически неправильное, пожалуйста, дайте мне знать, но это пока работает для меня
Надеюсь, это поможет кому-то, кто интегрирует платежи Firebase и Stripe