我无法弄清楚如何使用 Android 检测何时为托管(不可消费)应用内产品发放退款com.android.billingclient:billing:2.0.3
。这个问题似乎相当深,尽管我可能让它变得比应有的更复杂。
首先,我进行了一次测试购买,该购买已被确认并退款:
查看我的应用程序的日志,我看到以下内容:
D/BillingManager: Got a verified purchase: Purchase. Json: {"orderId":"GPA.3362-7185-5389-78416","packageName":"com.glan.input","productId":"pro","purchaseTime":1567672759460,"purchaseState":0,"purchaseToken":"pbkpcaadklleoecegjfjdpbl.AO-J1OwsR6WVaVZCCYOU6JyYN1r0qJsrwitIPZfhc3jX4yketRUwNzKqwMgYx0TgZ2GebEGbXDL0RlMyogwtSKSPsaHCJ4RA4MPlIGay-aM1-QhmnqwjXjQ","acknowledged":true}
I/BillingManager: purchase pbkpcaadklleoecegjfjdpbl.AO-J1OwsR6WVaVZCCYOU6JyYN1r0qJsrwitIPZfhc3jX4yketRUwNzKqwMgYx0TgZ2GebEGbXDL0RlMyogwtSKSPsaHCJ4RA4MPlIGay-aM1-QhmnqwjXjQ is in 1 state
这里发生了一些有趣的事情:
- 我们可以看到图像中的订单 ID 与检测到的购买相符
- 第一个日志行正在打印购买
Log.d(TAG, "Got a verified purchase: " + purchase);
它正在打印代表以下内容的底层 JSONpurchase
.
- 注意
"purchaseState":0
- 第二条日志行发出
Log.i(TAG, "purchase " + purchase.getPurchaseToken() + " is in " + purchase.getPurchaseState() + " state");
.
- 请注意,这里
purchase.getPurchaseState()
导致值为1
如果我看一下执行情况getPurchaseState
在 Android Studio 中我看到以下内容:
public @PurchaseState int getPurchaseState() {
switch (mParsedJson.optInt("purchaseState", PurchaseState.PURCHASED)) {
case 4:
return PurchaseState.PENDING;
default:
return PurchaseState.PURCHASED;
}
}
在文件的前面部分PurchaseState
接口声明为:
@Retention(SOURCE)
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;
}
这好像是getPurchaseState
一去不复返PurchaseState.UNSPECIFIED_STATE
并且只返回PENDING
JSON 的值为4
。我已经确认了一个状态PENDING
当使用需要一段时间才能批准的付款方式执行购买时,会正确返回。
我发现类似的帖子应用内结算 v3 - 不检测退款 https://stackoverflow.com/questions/13861625/in-app-billing-v3-dont-detect-refund这表明 Play 服务正在缓存购买,但我不相信这会导致此问题,因为如果我在应用程序运行之间修改代码以确认/消费购买,这些状态更改会立即反映在购买的 JSON 中。
我该如何检测已退款的托管产品?