Я использую чередующиеся платежи в своем приложении - пытаюсь реализовать баланс пользователя.
В настоящее время у меня есть следующий код в моем index.js. Ключевым битом для вопроса является последний .then()
блок кода. Этот раздел пишет в мою базу данных Cloud Firestore. Тем не менее, похоже, что это на самом деле не обновляет мою базу данных. Когда я просматриваю свою базу данных, баланс не меняется, и при этом поле начисления не добавляется к объекту полосового платежа, который сохраняется в базе данных. Я не получаю никаких ошибок, и я не уверен, как отладить его.
const functions = require('firebase-functions'); //firebase functions library
const admin = require('firebase-admin'); //firebase admin database
admin.initializeApp(functions.config().firebase);
//initialse stripe with apikey
const stripe = require('stripe')('<stripe test key>')
//name of function is stripe charge
exports.stripeCharge = functions.database
//whenever a new payment is written to the database, the following will be invoked
.ref('/payments/{userId}/payments/{paymentId}')
//event object has the data from the node in the database which is the payment and the token
.onWrite((change, context) => {
const payment = change.after.val();
const userId = context.params.userId;
const paymentId = context.params.paymentId;
let balance = 0;
//return null if there is no payment or if payment already has a charge
if(!payment || payment.charge) return;
//now we chain a promise - this is the user in the database
//this is good for recurring charges or to save customer data in the database
return admin.database()
.ref(`/users/${userId}`)
//once gives a single snapshot of this data
.once('value')
//return the snapshot value
.then(snapshot => {
return snapshop.val();
})
//tell stripe to charge the customer with the payment token
.then(customer => {
balance = customer.balance;
const customerChargeAmount = payment.amount;
const idempotency_key = paymentId; //prevents duplicate charges on customer cards
const source = payment.token.id;
const currency = 'gbp';
const charge = {customerChargeAmount, currency, source};
return stripe.charges.create(charge, {idempotency_key});
})
//wait for stripe to return the actual stripe object which tells us whether the charge succeeded
.then(charge => {
if(!charge) return;
let updates = {};
updates[`/payments/${userId}/payments/${paymentId}/charge`] = charge
if(charge.paid){
balance += charge.amount;
updates[`/users/${userId}/balance`] = balance;
}
admin.database().ref().update(updates);
return true;
})
})
Любая помощь приветствуется.