облачная функция firebase оплаты полосы не обновляет базу данных - PullRequest
0 голосов
/ 11 ноября 2018

Я использую чередующиеся платежи в своем приложении - пытаюсь реализовать баланс пользователя.

В настоящее время у меня есть следующий код в моем 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;
            })
    })

Любая помощь приветствуется.

...