繁体   English   中英

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

[英]How to check if the user has an active subscription in Android, 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);
    }
}

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

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

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

***更新所以进一步澄清:

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

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

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

所以我的问题是,

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

2 - 是否有不同的 API 用于检查订阅状态?

3 - 您是否想在您第一次确认订阅时通过存储用户偏好/cookie 在您的应用程序中自己管理订阅,以便您知道订阅何时到期?

您需要“有执照的测试人员”。 它们将允许您在设备上“侧载”您的应用程序,即使是调试版本也是如此。 在这种情况下,我对 sideload 的解释将涵盖从 Android Studio 构建工具以及adb install....和其他不涉及 Play 商店的方法进行安装。

https://developer.android.com/google/play/billing/test

通常,Google Play 结算 API 对于未签名并上传到 Google Play 的应用程序会被阻止。 许可证测试人员可以绕过此检查,这意味着您可以旁加载应用程序进行测试,即使是使用带有调试签名的调试版本的应用程序,也无需上传到应用程序的新版本。 请注意,package 名称必须与为 Google Play 配置的应用程序的名称匹配,并且 Google 帐户必须是 Google Play 控制台帐户的许可证测试员。

我也看不到您如何使用startConnection 在成功完成之前,我不确定您是否拥有最新数据。 如果这使您获得陈旧的价值,我不会感到惊讶。 我会通过查看onBillingSetupFinishedonBillingServiceDisconnected仔细检查以确保没有发生静默错误。 暂时避免信任queryPurchases()

https://medium.com/@NandagopalR/integrating-google-play-billing-into-an-android-application-b6eb6af176a7

queryPurchases() 方法使用 Google Play 商店应用程序的缓存,而无需发起网络请求。 如果您需要检查用户对每个产品 ID 的最近购买情况,可以使用 queryPurchaseHistoryAsync(),传递购买类型和 PurchaseHistoryResponseListener 来处理查询结果。

顺便问一下,在queryPurchaseHistoryAsync之前isReady()的值是多少, BillingResult::getDebugMessageBillingResult::getResponseCode的值是多少?

另外,请使用isFeatureSupported ,尽管您的问题似乎不是来自这里。 但我建议在所有活动部件正常工作之前不要使用订阅进行测试: https://developer.android.com/reference/com/android/billingclient/api/BillingClient#isFeatureSupported(java.lang.String)

好吧,想通了,是我的错误。

我在我的主要活动 onCreate() 中调用了 queryPurchases(),但 BillingClient 还没有准备好。

我将它移到 onBillingSetupFinished() 并且它现在返回正确的购买。 现在一切都按预期工作。 当您在应用重启后调用 queryPurchases() 时,您将获得活动订阅。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM