使用 Firebase 云功能和 Firestore 在 android 上验证购买 [关闭]

Posted

技术标签:

【中文标题】使用 Firebase 云功能和 Firestore 在 android 上验证购买 [关闭]【英文标题】:Verifying a purchase on android using Firebase cloud function and Firestore [closed] 【发布时间】:2019-02-12 15:10:40 【问题描述】:

我一直在开发一个功能来验证 android 设备上的购买。 从这里到那里,我得到了这个使用 Firebase 实时数据库的代码,我不想使用它:

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: 'Service Account Email',
    key: '-----BEGIN PRIVATE KEY-----\n**********************************************************************************==\n-----END PRIVATE KEY-----\n',
    scopes: ['https://www.googleapis.com/auth/androidpublisher']
);
admin.initializeApp();

exports.validatePurchases = functions.database
    .ref('/purchases/uId/orderId')
    .onCreate((event, context) => 
        const purchase = event.val();
        if (purchase.is_processed === true) 
            console.log('Purchase already processed!, exiting');
            return null;
        
        const orderId = context.params.orderId;
        const dbRoot = event.ref.root;
        const package_name = purchase.package_name;
        const sku = purchase.sku;
        const my_token = purchase.token;

        authClient.authorize((err, result) => 
            if (err) 
                console.log(err);
            
            publisher.purchases.products.get(
                auth: authClient,
                packageName: package_name,
                productId: sku,
                token: my_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) 
                    return event.ref.child('is_validated').set(true);
                 else 
                    return event.ref.child('is_validated').set(false);
                
            );
        );
        return null;
    );

如何将他的功能转换为 Firebase firestore 以及如何从 android 设备调用它?

【问题讨论】:

老兄,你只是复制粘贴我的答案????,真的! “我一直在做一个函数……”,真的???? 【参考方案1】:

有几种可能的方法:

1/ 在您的应用中,调用与 Firestore 交互的 Cloud Function

正如doc 中所述,您可以从您的应用中调用云函数:

Firebase 客户端 SDK 的 Cloud Functions 可让您调用函数 直接来自 Firebase 应用。在此从您的应用调用函数 方式,在 Cloud Functions 中编写和部署 HTTPS 可调用函数, 然后添加客户端逻辑以从您的应用中调用该函数。

在这个 HTTPS 可调用函数中,您可以按照您希望的方式(读/写/修改/删除)与 Firestore 数据库进行交互,并将一些数据返回到您的应用。

Firestore 和 Cloud Functions 的 doc 展示了如何在 Cloud Functions 中写入和读取 Firestore。还有一个官方示例演示了如何通过 HTTP 云函数与 Firestore 进行交互,here(不完全是 HTTPS 可调用函数,但非常相似)。

您可以按如下方式调用 HTTPS 可调用函数(上面引用的 doc 的摘录):

addMessage(inputMessage)
        .addOnCompleteListener(new OnCompleteListener<String>() 
            @Override
            public void onComplete(@NonNull Task<String> task) 
                if (!task.isSuccessful()) 
                    Exception e = task.getException();
                    if (e instanceof FirebaseFunctionsException) 
                        FirebaseFunctionsException ffe = (FirebaseFunctionsException) e;
                        FirebaseFunctionsException.Code code = ffe.getCode();
                        Object details = ffe.getDetails();
                    

                    // ...
                

                // ...
            
        );

2/ 根据 Firestore 中的一些事件触发 Cloud Function 并监听此 Cloud Function 执行的更改

正如 doc 中针对 Firestore 和云功能所述:

您可以部署 Node.js 代码来处理由 您的 Cloud Firestore 数据库....

Firestore 支持创建、更新、 删除和写入事件。

然后,您将在 Android 应用中使用侦听器来检测 Firestore 中的更改,如 here 所述。

在您的情况下,根据您在问题中包含的代码,您将在订单文档中写入一个值,这将触发对 authClient.authorize() 的调用(类似于您问题中的实时数据库代码),然后成功,更新/创建另一个您正在应用中收听的文档。

因此,使用这种方法,您不会直接调用函数

【讨论】:

啊..谢谢..你给了我这么多有用的链接:) 我是新手,能否提供触发(更新firestore)的云功能验证购买? 我建议您尝试编写一些代码,如果遇到特定问题,请寻求帮助。毫无疑问,社区将很乐意帮助您更正您的代码。 我会试试的。谢谢

以上是关于使用 Firebase 云功能和 Firestore 在 android 上验证购买 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Firebase 云存储添加图像存储功能?

云功能和 Firebase 的客户端 CORS 错误

Flutter/Firebase:管理功能是应用内功能还是云功能?

如何使用 Firebase 云功能发送自定义电子邮件

使用云功能在 Firebase 实时数据库中交换排名 - 游戏

如何使用 Firebase 云功能向客户端(Swift)发送条带响应