【发布时间】:2012-12-27 13:14:03
【问题描述】:
我目前正在测试我的 InApp 计费机制(使用 InApp Billing 版本 3 API,因此以 TrivialDrive 示例作为参考)。
我有一个托管项目,升级到高级版本。
现在,使用我的测试帐户购买该商品是可行的,但是当我之后在 Google 结帐中取消整个订单时,我的代码仍然告诉我该商品已被购买并因此授予高级功能。
这是我在 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,这意味着已购买,即使在我取消订单一小时后也是如此。为什么?
【问题讨论】:
-
我没有答案,但可以确认我也遇到了这个问题。
1. 购买
2. 进入谷歌结帐并取消订单
3. 观察已发送确认订单取消的电子邮件
4. 后续请求给出 PurchasedState = 0(即已购买)
也许需要一段时间才能过滤更改?另请参阅本页 cmets 部分中的以下讨论,其他人报告了同样的问题。 plus.google.com/u/1/+AndroidDevelopers/posts/R8DKwZDsz5m -
我看到了类似的问题。我使用 IAP v3 API 并购买了一件商品,然后在谷歌结帐中取消了订单。但是当我再次尝试购买时,IAP v3 会返回“7:Item Already Owned”。我也在使用 trivialdrive 示例。库存显示该项目的 purchasestate 为“0”,并且 purchaseate 为 1358439773 是格林威治标准时间 2013 年 1 月 17 日下午 4:22。这正是 google checkout 显示为取消日期的日期和时间。
-
这与您的问题无关,但我只想指出,使用 IabHelper.getResponseDesc(p.getPurchaseState()) 获取购买状态的描述是不合适的,因为 getResponseDesc()用于检索响应代码的描述,而不是购买状态指示器的描述。对于后者,根据developer.android.com/google/play/billing/…,“可能的值为 0(已购买)、1(已取消)或 2(已退款)。”这些常量似乎没有在原始的 TrivialDrive 示例代码中定义甚至使用。
-
@Toni:我现在已经使用 TrivialDrive 示例应用的修改版本测试了取消订单,并且遇到了同样的问题。我进入 Checkout 并取消了我从我自己的测试帐户(不是开发者帐户)下的订单,十五小时后,该应用程序仍然报告购买类型为 0(已购买)。这是在带有 Google Play 商店版本 3.10.10 的 Nexus 7 上。在此之后,我清除了 Google Play 应用程序的缓存,停止了 TrivialDrive 应用程序并重新启动它。还是没有变化。然后,第一次在我的 Nexus One 手机上安装了 TrivialDrive;仍然购买。
-
好的,答案是最多可能需要 72 小时。请参阅此其他 SO 页面的已接受答案:stackoverflow.com/questions/13861625/…
标签: android in-app-purchase in-app-billing