[英]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
。 在成功完成之前,我不確定您是否擁有最新數據。 如果這使您獲得陳舊的價值,我不會感到驚訝。 我會通過查看onBillingSetupFinished
和onBillingServiceDisconnected
仔細檢查以確保沒有發生靜默錯誤。 暫時避免信任queryPurchases()
:
queryPurchases() 方法使用 Google Play 商店應用程序的緩存,而無需發起網絡請求。 如果您需要檢查用戶對每個產品 ID 的最近購買情況,可以使用 queryPurchaseHistoryAsync(),傳遞購買類型和 PurchaseHistoryResponseListener 來處理查詢結果。
順便問一下,在queryPurchaseHistoryAsync
之前isReady()
的值是多少, BillingResult::getDebugMessage
和BillingResult::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.