如何检查用户在 Android、Google Play 中是否有有效订阅?

Jam*_*mes 5 android in-app-billing google-play

我有一个在 Google Play 中订阅的应用程序。当用户启动应用程序时,我需要知道用户是否有有效的订阅。这似乎是理所当然的事情,但从搜索和尝试实施来看,这似乎是不可能的?

我正在使用 Google 较新的计费 2/3,遵循 Google 的教程,

class BillingManager implements PurchasesUpdatedListener
...
public void checkAsync() {
    Log.e(TAG, "checkAsync");
    billingClient.queryPurchaseHistoryAsync(BillingClient.SkuType.SUBS, new PurchaseHistoryResponseListener() {
        @Override
        public void onPurchaseHistoryResponse(BillingResult billingResult, List<PurchaseHistoryRecord> list) {
            Log.e(TAG, "checkCached result: " + list);
            if (list == null) {
                return;
            }

            for (PurchaseHistoryRecord ps : list) {
                //System.out.println("PAYMENT: " + ps.getSku() + " : " + ps.getPurchaseTime());
            }
        }
    });
}

public void checkCached() {
    Log.e(TAG, "checkCached");
    List<Purchase> result = billingClient.queryPurchases(BillingClient.SkuType.SUBS).getPurchasesList();
    Log.e(TAG, "checkCached result: " + result);
    if (result == null) {
        return;
    }
    for (Purchase purchase : result) {
        handlePurchase(purchase);
    }
}
Run Code Online (Sandbox Code Playgroud)

我认为这就是您应该获得用户购买的方式。但它根本不起作用,两个调用总是返回 null。仅当您重新安装应用程序或清除数据时,它才会返回正确的购买信息。

那么应用程序到底应该如何做到这一点呢?

一旦我进入内部测试,就可以购买该应用程序,并通过 Google Play 链接下载它。(在此之前订阅根本不起作用)。

*** 更新因此进一步澄清:

我正在使用有效的测试用户,并且订阅工作正常。我的问题是 API queryPurchases() 或 queryPurchaseHistoryAsync() 应该做什么。

我所看到的是,这些仅退回尚未由应用程序处理的购买。他们似乎存储了购买是在应用程序数据中处理的。购买后这些返回 null,应用程序重新启动后这些返回 null。如果我清除应用程序数据或重新安装应用程序,那么他们会返回购买(一次),然后在重新启动后再次为空。

据我所知,这些仅用于检测用户何时重新安装您的应用程序或安装在不同的手机上。它们不能用于确定订阅的状态。

所以我的问题是,

1 - 这是否在内部测试中不起作用,并且在应用程序发布时会神奇地以不同的方式工作?

2 - 您是否打算使用不同的 API 来检查订阅的状态?

3 - 您是否打算在您的应用程序中自行管理订阅,方法是在您第一次确认订阅时存储用户首选项/cookie,以便知道订阅何时到期?

Jam*_*mes 2

好吧,明白了,是我的错误。

我在主要活动 onCreate() 中调用 queryPurchases(),但 BillingClient 尚未准备好。

我将其移至 onBillingSetupFinished(),现在它返回正确的购买。现在一切都按预期进行。当您在应用程序重新启动后调用 queryPurchases() 时,您将获得活动订阅。