我目前正在测试我的InApp计费机制(使用InApp Billing版本3 API,因此将TrivialDrive示例作为参考).
我有一个托管项目,即升级到高级版本.
现在,使用我的测试帐户购买该项目是有效的,但是当我之后在Google结帐中取消整个订单时,我的代码仍然告诉我该项目已购买,因此授予高级功能.
以下是我在MainActivity中检查购买的方法.我不会在某处本地保存购买状态,因为据我所知,使用billing API v3,您可以根据需要查询特定购买.
@Override
protected void onStart() {
// TODO Auto-generated method stub
super.onStart();
iabHelper = new IabHelper(this, Helper.getPKey());
iabHelper.enableDebugLogging(true);
iabHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
@Override
public void onIabSetupFinished(IabResult result) {
Log.d("IAB", "SETUP FINISHED");
if(!result.isSuccess())
{
Log.d("IAB", "SETUP NOT OK");
return;
}
else
Log.d("IAB", "SETUP OK");
iabHelper.queryInventoryAsync(
new QueryInventoryFinishedListener() {
@Override
public void onQueryInventoryFinished(IabResult result, Inventory inv) {
Log.d("IAB", "Query inventory finished.");
if (result.isFailure()) {
Log.d("IAB","Failed to query inventory: " + result);
return;
}
Log.d("IAB", "Query inventory …Run Code Online (Sandbox Code Playgroud) 我无法弄清楚如何使用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
Run Code Online (Sandbox Code Playgroud)
这里发生了一些有趣的事情:
Log.d(TAG, "Got a verified purchase: " + purchase);它打印代表purchase."purchaseState":0Log.i(TAG, "purchase " + purchase.getPurchaseToken() + " is in " + purchase.getPurchaseState() + " state");.purchase.getPurchaseState()产生的值为1如果我查看getPurchaseStateAndroid Studio中的实现,我会看到以下内容:
public @PurchaseState int getPurchaseState() {
switch (mParsedJson.optInt("purchaseState", PurchaseState.PURCHASED)) {
case 4:
return PurchaseState.PENDING;
default:
return PurchaseState.PURCHASED; …Run Code Online (Sandbox Code Playgroud) 我有很多帖子和 Google 文档,但我仍然不清楚如何判断应用内购买已退款。我小心红了In-App Billing v3 - 不检测退款,Google Play In-App Billing Version 3 支持退款吗?.
我相信我在不久前通过复制和粘贴从 Google 官方文档中记下了以下笔记:
purchaseState:订单的购买状态。可能的值为 0(已购买)、1(已取消)或 2(已退款)。
现在,官方文档有以下内容:
-> purchaseState:订单的购买状态。它总是返回 0-
(购买)。
更具体地说,如果 IAB 购买被退款或取消,那是否仍在 mHelper.queryInventoryAsync(mGotInventoryListener) 获取的用户库存中?如果是这样,如何判断购买已被取消或退款?
更新 [2019-12-12]:
我已经测试了很多次并确认了以下几点:
如果订单在退款后被取消,它将从getPurchasesList返回的结果中消失。发生这种情况所需的时间各不相同。可能是几分钟到 10 多个小时。我认为这取决于 Google Play 何时刷新其缓存。似乎可以打开 Google Play 来刷新其缓存。在一种情况下,getPurchasesList在退款 10 多个小时后仍然返回了已退款的购买,但在 Google Play 一打开它就停止了退货。