Я использую Angular6, я внедряю платежи Stripe в своем приложении и использую функции Google Cloud для запуска кода на стороне сервера.Я могу успешно заставить платеж работать, но я добавляю больше логики к своей функции.В этой функции я обрабатываю платеж.Моя облачная функция запускается, когда я onWrite
документ в /payments/${this.userId}/payments
коллекцию.
в блоке кода .then
, я хочу проверить, был ли платеж Stripe успешным, и только если он был успешнымзатем обновите данные пользователя в базе данных соответствующими документами.Однако я не уверен, что это лучший метод.
Кроме того, в настоящее время я слушаю изменения в документе, где будет возвращен объект заряда Stripe, используя onSnapshot
, однако, как только он будетуспешно, я не хочу слушать эти изменения значения, пока не будет произведен другой платеж.
Как мне добиться этого поведения?
processPayment(token: any, amount: number){
const payment = { token, amount };
this.paymentCollection.doc(`${this.userId}`).collection('payments').add({
payment
})
.then(docRef => {
this.docRefId = docRef.id;
//if payment successful then add to the db of purchased lessons
console.log(this.docRefId);
this.db.collection("payments/"+`${this.userId}`+"/payments").doc(`${this.docRefId}`)
.onSnapshot(function(doc) {
if(doc.data().status === "succeeded"){
const updatedBalance = this.balance - amount;;
let writeBatch = firebase.firestore().batch();
//CAN'T SEE CART CONTENTS
for(let buyable of this.cartContents){
let purchasedLessonsRef = this.afs.firestore.doc(`/purchased_lessons/${this.userId}/lessons/${buyable.b_id}`);
writeBatch.update(purchasedLessonsRef, buyable);
}
//Update balance ref
let userBalanceRef = this.afs.firestore.doc(`/users/${this.userId}`);
writeBatch.update(userBalanceRef, {balance: updatedBalance});
this.docRefId = null;
return writeBatch.commit().then(function () {
console.log("commiting batch")
});
}
});
console.log("finished function");
})
.catch(error => console.error("Error adding document: ", error))
}