34

我参加了 Google 的“In-App Billing v3”培训。我要买一件东西,但我有问题。

https://developer.android.com/training/in-app-billing/index.html

我已经取消并退款了购买,但应用程序检测到购买是真实的。我无法继续测试我的应用程序,因为我总是检测到该商品是购买的。

我在 logCat 中发现的唯一错误是下一个:

[3687] InAppBillingService.logResponseBundle:捆绑包不包含响应代码

在启动 mHelper.queryInventoryAsync(mGotInventoryListener) 后出现。

任何想法?

4

4 回答 4

22

ps - 这表明更新退款需要时间

http://code.google.com/p/marketbilling/issues/detail?id=88#makechanges

但我不相信 - 我意识到他们正在设备上缓存购买数据,但 24 小时是很长的时间......

更新后添加了在我取消“测试”交易超过 24 小时后,这些帐户仍然获得许可!!

再次更新 - 36 小时后,该应用仍获得许可。我卸载并重新安装它仍然是许可的!

再次更新!- 我将设备恢复出厂设置,登录,安装了应用程序,但它是未经许可的......

还有另一个更新——谷歌的回复表明退款是“自动”处理的,但可能需要“长达 72 小时”才能在设备上刷新——没有其他途径可以检测到退款,因此玩家最多可以得到 3 天的退款。”免费”如果他们退款 - 呃,好吧,这是应用内购买,而不是应用内购买,但仍然,这似乎有点过分?

于 2012-12-16T20:32:43.157 回答
4

在等待了大约 12 个小时并尝试了这里和类似线程上建议的所有内容后,我仍然面临同样的问题。对我来说诀窍是以下 adb 命令:

adb shell pm clear com.android.vending

于 2015-10-27T02:40:03.313 回答
2

您可以通过消费该项目轻松否定购买以进行测试。

使用 Trivial Drive 示例,我在 MainActivity.java 中添加了以下代码,这将在应用程序启动时“消耗”高级升级:

        // Do we have the premium upgrade?
        Purchase premiumPurchase = inventory.getPurchase(SKU_PREMIUM);
        mIsPremium = (premiumPurchase != null && verifyDeveloperPayload(premiumPurchase));
        Log.d(TAG, "User is " + (mIsPremium ? "PREMIUM" : "NOT PREMIUM"));

        // dss added for test: Consume the premium upgrade for test purposes.
        boolean testConsume = true;
        if (mIsPremium && testConsume) {
            Log.d(TAG, "NOT FOR PRODUCTION: We have a premium upgrade. Consuming it.");
            mHelper.consumeAsync(inventory.getPurchase(SKU_PREMIUM), mConsumeFinishedListener);
            mIsPremium = false;
        } //dss end add

作为奖励,当您消费升级时,您将获得免费的四分之一油箱,因为样本将所有消费视为其他地方的汽油。在 MainActivity 中搜索“Provisioning”以查找位置。

于 2016-04-12T20:51:06.380 回答
0

我解决它的方法是使用忽略我所做的特定购买的代码块。我在打印出购买信息的代码中有一个日志语句,然后我在我的 purchaseTimes 应用程序中硬编码一个列表以忽略。这是一团糟,每次我想测试时都必须重新编译,但我还没有找到更好的方法。

于 2013-04-06T19:22:28.933 回答