【问题标题】:Cannot update a Firestore's document after a purchase verification using Firebase functions使用 Firebase 功能进行购买验证后无法更新 Firestore 的文档
【发布时间】:2019-09-05 08:34:39
【问题描述】:

我一直在开发一个在服务器端验证购买的功能。一切正常。 只有一个问题,当购买有效时(response.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;
});    

【问题讨论】:

  • 你检查user_id是否不为空?
  • 是的,我查过了,它不为空。
  • 尝试添加 .catch 块,看看是否有错误抛出。 return admin.firestore().collection('users').doc(user_id).update({ purchaseToken: purchase_token, isPremiumS: 'true' }).catch(error => { ... })
  • 好的,我试试,谢谢

标签: node.js firebase google-cloud-firestore in-app-purchase google-cloud-functions


【解决方案1】:

您的函数应该从您的 Firestore update() 调用中返回 Promise,而不是返回 null

在两个地方添加return

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

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

在函数末尾删除return null;

【讨论】:

  • 我试过你的解决方案,我得到了这个错误:函数返回未定义,预期的承诺或值
  • 我还注意到,在显示此错误后,控制台还显示“成功”消息(几分钟后作为原始问题)并且没有更新文档。
  • 我不知道该建议什么。我不熟悉您使用的 googleapis,也找不到参考文档。您介意更新问题以显示您的更改,以便我确认您正确理解了我的说明吗?
  • 我按照您的指示进行操作,但正如我告诉您的那样,我收到了上述错误。我对这个api也不熟悉。不管怎样,谢谢你的建议。
  • 解决了!我没有返回 authClient.authorize,而是返回了一个新的 Promise:return new Promise((resolve,reject) =>{ authClient.authorize((err, result) => {
猜你喜欢
  • 2019-02-12
  • 1970-01-01
  • 2020-07-20
  • 2019-08-07
  • 1970-01-01
  • 2019-06-12
  • 2023-02-03
  • 2021-02-13
  • 1970-01-01
相关资源
最近更新 更多