Невозможно обновить документ Firestore после подтверждения покупки с помощью функций Firebase

#node.js #firebase #google-cloud-firestore #in-app-purchase #google-cloud-functions

#node.js #firebase #google-облако-firestore #покупка в приложении #google-cloud-функции

Вопрос:

Я работал над функцией проверки покупки на стороне сервера. Все работает хорошо. Только одна проблема, когда покупка действительна (ответ.status === 200) консоль показывает (успех), но документ не был обновлен. Вот мой код. Я что-то пропустил?

 const functions = require('firebase-functions');
const admin = require('firebase-admin');
const {google} = require('googleapis');
const publisher = google.androidpublisher('v2');
const authClient = new google.auth.JWT({
   email: 'my_email',
   key: 'my_key',
   scopes: ['https://www.googleapis.com/auth/androidpublisher']
});

admin.initializeApp();
admin.firestore().settings({timestampsInSnapshots: true});

exports.validatePurchases = functions.firestore
.document('purchases/{channel}')
.onCreate((docSnapshot, context) => {
    const purchase = docSnapshot.data();
    const order_id = purchase.orderId;
    const package_name = purchase.packageName;
    const sku = purchase.sku;
    const purchase_token = purchase.purchaseToken;
    const user_id = purchase.userId;

    authClient.authorize((err, result) => {
        if (err) {
            console.log(err);
        }
        publisher.purchases.subscriptions.get({
            auth: authClient,
            packageName: package_name,
            subscriptionId: sku,
            token: purchase_token
        }, (err, response) => {
            if (err) {
                console.log(err);
            }
            // Result Status must be equals to 200 so that the purchase is valid
            if (response.status === 200) {
                console.log('success');
                return admin.firestore().collection('users').doc(user_id).update({
                    purchaseToken: purchase_token,
                    isPremiumS: 'true'
                });                    
            } else {
                console.log('fail');
                return admin.firestore().collection('users').doc(user_id).update({
                    purchaseToken: purchase_token,
                    isPremiumS: 'false'
                });                    
            }
        });
    });
    return null;
});    
  

Комментарии:

1. Вы проверяли, user_id не равно ли значение null?

2. Да, я проверил, это не null.

3. Попробуйте добавить блок .catch и посмотрите, есть ли ошибки. return admin.firestore().collection('users').doc(user_id).update({ purchaseToken: purchase_token, isPremiumS: 'true' }).catch(error => { ... })

4. хорошо, я попробую, спасибо

Ответ №1:

Вместо возврата null ваша функция должна возвращать Promise из ваших update() вызовов Firestore.

Добавить return в двух местах:

   return authClient.authorize((err, result) => {...

  return publisher.purchases.subscriptions.get({...
  

Удалить return null; в конце функции

Комментарии:

1. Я попробовал ваше решение, я получил эту ошибку: функция возвращена неопределенной, ожидаемое обещание или значение

2. я также заметил, что после отображения этой ошибки консоль также показывает сообщение об успешном завершении (через несколько минут как исходную проблему) и без обновления документа.

3. Я не знаю, что предложить. Я не знаком с googleap, который вы используете, и не могу найти справочные документы. Не возражаете ли вы обновить вопрос, чтобы показать ваши изменения, чтобы я мог подтвердить, что вы правильно поняли мои инструкции?

4. Я следовал вашим инструкциям, но, как я уже говорил, я получил вышеуказанную ошибку. Я тоже не знаком с этим API. В любом случае спасибо за ваше предложение.

5. решаемая ! вместо возврата AuthClient.authorize я вернул новое обещание : return new Promise((разрешить, отклонить) =>{ AuthClient.authorize((ошибка, результат) => {