Android应用内结算:订单取消后,购买状态保持“已购买”状态

我目前正在testing我的InApp计费机制(使用InApp计费版本3 API,因此以TrivialDrive为例)。

我有一个pipe理项目,这是升级到高级版本。

现在,使用我的testing帐户购买该项目的作品,但是当我在Google checkout之后取消整个订单时,我的代码仍然告诉我该项目是购买的,因此授予了高级function。

这里是我如何检查我的MainActivity购买。 我不在本地保存购买状态,因为我了解到,使用结算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 was successful."); // Do we have the premium upgrade? boolean mIsPremium = inv.hasPurchase(Helper.premiumSku); Purchase p = inv.getPurchase(Helper.premiumSku); if(p != null) Log.d("IAB PURCHASE STATE", IabHelper.getResponseDesc(p.getPurchaseState())); else Log.d("IAB PURCHASE STATE", "Purchase is null"); Log.d("IAB", "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM")); } } ); } }); } 

我不断getPurchaseState = 0,这意味着是购买,甚至在我取消订单后一个小时。 为什么?

Solutions Collecting From Web of "Android应用内结算:订单取消后,购买状态保持“已购买”状态"

我知道这已经一年了,但是没有一个提供的答案/提示帮助了我,所以我想我会添加我的解决scheme。

首先,我遇到了同样的问题。 即做了testing购买,取消了,仍然收到购买状态,表示有效购买。

我忘记的是,我最近将Google Play开发者控制台的设置面板上的“许可testing响应”字段从“RESPOND_NORMALLY”切换为“LICENSED”

在将其切换回“RESPOND_NORMALLY”之后,取消购买的购买状态正确地返回。

所以,你可能想在你尝试等待几天之前检查一下

步骤1,等待约10分钟; 直到你看到“取消订单”交付。 在你的谷歌钱包。

9月15日上午11:28取消订单已交付。

9月15日11:18已取消您取消了此订单。 原因:客户要求取消。

第2步。注销您的testing谷歌帐户在设备上,然后重新login。

至less这解决了我的问题。

在具有相同帐户的其他设备上使用该应用程序时,也会发生此问题。 在设备重新启动之前,即使在数小时之后,该项目也不会以购买的方式收到。 如果试图再次购买,谷歌钱包对话框说“项目已经拥有”。 从iabHelper返回的代码仍然是“用户取消”,导致购买活动的实际响应不会退还,只是写在debugging日志中。

 else if (resultCode == Activity.RESULT_CANCELED) { logDebug("Purchase canceled - Response: " + getResponseDesc(responseCode)); result = new IabResult(IABHELPER_USER_CANCELLED, "User canceled."); if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null); } 

所以它不可能反应这个谷歌计费对话框,因为我们总是得到相同的结果IABHELPER_USER_CANCELED,即使对话说“项目已经拥有”。

编辑:

我解决这个问题:

 else if (resultCode == Activity.RESULT_CANCELED) { logDebug("Purchase canceled - Response: " + getResponseDesc(responseCode)); if(responseCode == 7) result = new IabResult(BILLING_RESPONSE_RESULT_ITEM_ALREADY_OWNED, "Item already owned."); else result = new IabResult(IABHELPER_USER_CANCELLED, "User canceled."); if (mPurchaseListener != null) mPurchaseListener.onIabPurchaseFinished(result, null); } 

所以,现在如果来自结算对话框的回复是“已经拥有的项目”,我将其报告给我的听众。

在等了大约12个小时,尝试了这里提到的一切后,我仍然面临同样的问题。 下面的adb命令对我来说有什么窍门:

adb shell pm清除com.android.vending

这在Google官方文档中已经得到了很好的回答。 在这里复制单词。

当用户取消订阅时,Google Play不会为当前的结算周期提供退款。 相反,它允许用户访问已取消的订阅,直到当前的结算周期结束,在此时它终止订阅。 例如,如果用户在周期的第15天购买了每月订阅并取消订阅,则Google Play将认为该订阅有效期至第30天结束(或其他date,具体取决于月份)。

这应该解释一切。 getPurchase()仍将返回购买数据,直到当前订阅周期结束。

您可以使用的是购买数据的自动autoRenewing字段。 根据文件 :

autoRenewing:表示订阅是否自动更新。 如果设置为true,则订阅处于活动状态,并将在下一个结算date自动续订。 如果为false,则表明用户已取消订阅

取消后立即更新该字段。

如果我正确地看到在trivialdrivesample中的参考代码是错误的,这将是在应用程序计费的官方参考项目的耻辱。

如果购买== null这只是意味着它从来没有被购买。 要获得真实的信息,你必须打电话

 purchase.getPurchaseState() 

根据这里

purchaseState订单的购买状态。 可能的值为0(已购买),1(已取消),2(已退款)或3(已过期,仅限订阅购买)。

我在文档(IAB API v2)中find了以下部分,但我不确定这是否可用于IAB API v3。 广播可能仍然会被发送。

“…当Google Play收到来自Google电子钱包的退款通知时,您的应用程序可能会收到IN_APP_NOTIFY广播意图,在这种情况下,Google Play会向您的应用程序发送一条IN_APP_NOTIFY消息,您的应用程序可以像处理应用程序发起的REQUEST_PURCHASE消息,以便最终您的应用程序将收到一个PURCHASE_STATE_CHANGED消息,其中包含已退款项目的信息。退款信息包含在PURCHASE_STATE_CHANGED广播意图附带的JSONstring中。另外,JSON中的purchaseState字段string设置为2“。

来自: http : //developer.android.com/google/play/billing/v2/api.html#billing-action-notify

只需重启。

为我工作。 Nexus 4上的Android 5.1.1