【发布时间】:2019-09-05 09:33:58
【问题描述】:
我无法确定如何使用com.android.billingclient:billing:2.0.3 检测 Android 中托管(不可消费)应用内产品何时退款。这个问题似乎很深,但也许我让它变得比应该的更复杂。
首先,我进行了一次测试购买,已确认并已退款:
查看我的应用程序的日志,我看到以下内容:
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);打印购买,它正在打印代表purchase的底层JSON。 - 注意
"purchaseState":0 - 第二个日志行以
Log.i(TAG, "purchase " + purchase.getPurchaseToken() + " is in " + purchase.getPurchaseState() + " state");发出。 - 注意这里
purchase.getPurchaseState()的结果是1
如果我在 Android Studio 中查看 getPurchaseState 的实现,我会看到以下内容:
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 状态。
我发现像 In-App Billing v3 - Don't detect refund 这样的帖子表明 Play 服务正在缓存购买,但我不相信这是导致此问题的原因,因为如果我在我的应用程序运行之间修改我的代码以确认/消费购买,这些获得状态更改会立即反映在购买的 JSON 中。
我应该如何检测退款的被管理产品?
【问题讨论】:
-
这个问题你解决了吗?好像还是一样..
-
这是一个严重的错误,现在我的用户只是在退还他们的购买并且仍然获得购买状态!