Я успешно реализовал функцию Stripe Google Cloud addPaymentSource
найдено здесь , которая добавляет источник платежа пользователю, когда token
записывается в базу данных.
Все возвращенные ошибки (например, недействительная карта) записываются обратно в базу данных.
Затем я приостанавливаю приложение на 3 секунды, чтобы в любое время записать возвращенные ошибки.который я затем прочитал базу данных.Если ошибка была написана, я отображаю сообщение обратно пользователю.
Иногда возникают ошибки, которые записываются обратно, но мое приложение не может их обнаружить, я подумал, что для написания * 1011 может потребоваться больше времени.* назад в базу данных.
Есть ли более эффективный способ обработки ошибок в этом случае?
postStripeToken
функция Swift:
func postStripeToken(token: STPToken) {
DataService.run.updateStripeTokenForUser(uid: (Auth.auth().currentUser?.uid)!, token: token.tokenId) { (success) in
if success {
DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(3000)) {
DataService.run.checkForCardErrorMessage(handler: { (error, errorMsg) in
if error {
Utilities.run.dismissSVHUD(delay: 0.0)
print("errorMsg: \(errorMsg)")
self.errorMsgLbl.isHidden = false
self.errorMsgLbl.text = errorMsg
self.hideAndDeleteCardErrorMsg()
} else {
Utilities.run.dismissSVHUD(delay: 1.0)
}// end else
})//end checkForCardErrorMessage
}//end asyncAfter
}// end if-success
}// end updateStripeTokenForUser
}//end func
checkForCardErrorMessage
функция Swift:
func checkForCardErrorMessage(handler: @escaping (Bool, String) -> ()){
guard let uid = Auth.auth().currentUser?.uid else { return }
let ref = REF_STRIPE_CUSTOMERS.child(uid).child("sources").child("sources").queryOrderedByKey().queryEqual(toValue: "error")
ref.observeSingleEvent(of: .value) { (snapshot) in
if snapshot.exists(){
guard let snap = snapshot.value as? [String: Any] else { return }
let errMsg = snap["error"] as? String ?? ""
handler(true,errMsg)
} else {
handler(false, "")
}//end if
}//end observe
}//end func
addPaymentSource
Функция Google Cloud - JS:
exports.addPaymentSource = functions.database
.ref('/stripe_customers/{userId}/sources/{pushId}/token').onWrite((change, context) => {
const source = change.after.val();
if (source === null){
return null;
}
return admin.database().ref(`/stripe_customers/${context.params.userId}/customer_id`)
.once('value').then((snapshot) => {
return snapshot.val();
}).then((customer) => {
return stripe.customers.update(customer, {source}); //createSource(customer, {source});
}).then((response) => {
return change.after.ref.parent.set(response);
}, (error) => {
return change.after.ref.parent.child('error').set(userFacingMessage(error));
}).then((error) => {
return reportError(error, {user: context.params.userId});
});
});