[英]Android in-app billing - How to handle refunds
我正在嘗試在我的應用程序中實施應用程序內計費,除了退款之外,一切都很好。 在過去的幾天里,我一直在反對這一點,如果用戶要求退款,似乎無法從應用程序方面知道。 我希望能夠在用戶獲得退款后撤銷對一次性托管產品(刪除廣告)的訪問權限。 我沒有使用后端,所以我依賴 Google Play API。
我嘗試的是使用queryPurchaseHistoryAsync
查詢 Google Play API,它返回用戶最近購買的列表。 這似乎不起作用,因為在要求退款后購買仍然存在(在寫這篇文章之前已經等待了一天)。
這是我所做的:
所以任何用戶都可以購買我的應用內產品,然后立即 go 到他的 Google Play 頁面並要求退款? 是我遺漏了一些明顯的東西還是這個 API 是一場噩夢?
PurchaseState
枚舉是
public @interface PurchaseState {
// Purchase with unknown state.
int UNSPECIFIED_STATE = 0;
// Purchase is completed.
int PURCHASED = 1;
// Purchase is waiting for payment completion.
int PENDING = 2;
}
我在這里沒有看到任何與退款相關的內容,在我看來這是一個非常正常的用例,所以我仍然認為我缺少一些關鍵信息,我該怎么做?
謝謝你的幫助
即使用戶進行了退款並實際獲得了退款,任何進行的購買仍將被記錄。 當您(開發者/應用所有者)為應用內產品發出退款/撤銷請求時也是如此。
唯一的區別是購買的"purchaseState" 。 Google 的計費庫的問題在於,它們在對PENDNG或PURCHASED state 的 purchase.getPurchaseState() 調用中掩蓋了這個“purchaseState”值。 見反編譯代碼:
public int getPurchaseState() {
switch(this.zzc.optInt("purchaseState", 1)) {
case 4:
return 2; // PENDING
default:
return 1; // PURCHASED
}
}
當您有一個應用內產品退款state時,它的 state 相當 UNSPECIFIED_STATE ,如上面的代碼中一樣被屏蔽為 PURCHASED 。
要克服這個問題,只需忽略庫的 purchase.getPurchaseState() 方法,而是使用您自己的未屏蔽自定義:
int getUnmaskedPurchaseState(Purchase purchase) {
int purchaseState = purchase.getPurchaseState();
try {
purchaseState = new JSONObject(purchase.getOriginalJson()).optInt("purchaseState", 0);
} catch (JSONException e) {
e.printStackTrace();
}
return purchaseState;
}
谷歌似乎剛剛做了這件事,以推動您執行此解決方案。 使用作廢的購買 API提供與用戶已作廢的購買相關的訂單列表。 根據他們的文件...
可以通過以下方式取消購買:
- 用戶要求為他們的訂單退款。 用戶取消他們的訂單。
- 訂單被退回。
- 開發商取消或退款訂單。 注意:只有撤銷的訂單才會顯示在 Voided Purchases API 中。
- 如果開發者在沒有設置撤銷選項的情況下退款,訂單將不會顯示在 API 中。
- Google 取消或退款訂單。
但是,此解決方案目前不能作為 Java android 庫提供,您將不得不發出服務器請求並使用 Google Play 開發人員 API。
簡單的解決方案似乎不再起作用 - 您只會獲得已購買狀態,而沒有其他任何東西。 有人對此問題有任何最新的解決方案嗎? 在我看來,如果您不符合使用無效購買 API 的購買條件,那么買家可以簡單地購買產品並退款,然后像購買一樣繼續使用。 肯定有許多應用程序面臨完全相同的問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.