如何取消Android上的应用内测试购买?

时间:2016-08-08 17:43:25

标签: android billing in-app

直到2016年6月20日,我才能取消在我的应用中完成的测试购买。 从同一个测试帐户进行多个应用程序内购买(非消费品),可以轻松开发和测试代码,而不需要太多的麻烦。

2016年6月20日之后,我的商家帐户中没有显示购买情况 我无法从我的测试帐户购买超过1次。我得到的只是:“你已经拥有这个项目”的消息。

我向Google开发者支持小组发送了一个请求,答案是:

从2016年6月20日开始,我们更改了一次性应用内购买(IAP)的测试购买。 以前,测试购买一次性IAP会生成订单ID。从2016年6月20日开始,一次性IAP不会生成正式订单ID(如果有的话),也不会出现在Merchant Center中。此行为已适用于订阅IAP。 您可以在Android开发者帮助中心了解有关测试应用内结算的详情:https://developer.android.com/google/play/billing/billing_testing.html#testing-purchases

好吧..所以我去了上面提到的链接,那里有一节: 取消已完成的测试购买 其中说明:

Google Play为每位用户积累了已完成的测试购买,但未将其传递给财务处理。 在某些情况下,您可能希望手动取消测试购买以继续测试。为此,请在Play商店中打开应用页面。如果要取消的测试购买是订阅,您还可以使用Purchases.subscriptions API的cancel()方法。 重要提示:Purchases.subscriptions API的refund()和revoke()方法不支持测试购买。

所以我去Play商店的应用页面......然后做到了什么?网页没有说明我应该在那里做什么。有人知道吗?

确实说:您还可以使用Purchases.subscriptions API的cancel()方法。

表示使用cancel()方法不是唯一的方法。

如何解决此问题而不在我的应用中添加其他代码?

9 个答案:

答案 0 :(得分:14)

我进入主Google Play控制台页面并点击订单管理。在此之下,我能够选择所有测试购买并退款。我是该应用程序的主要开发人员,因此我可以访问。如果您是测试人员,您可能需要联系支持团队并要求他们退还您的订单。

答案 1 :(得分:13)

  

所有托管的应用内商品均为耗材。

docs中所述。

这意味着您可以使用自有物品而不是取消购买并重新购买。 我建议在应用启动时查询广告资源:

mIabHelper.queryInventoryAsync(this);

然后您可以在回调中使用自有项目:

@Override
public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
    Purchase purchase = inventory.getPurchase(MY_SKU);
    boolean isBought = (purchase != null && verifyDeveloperPayload(purchase));
    if (isBought) {
        mIabHelper.consumeAsync(purchase, new OnConsumeFinishedListener() {
            @Override
            public void onConsumeFinished(Purchase purchase, IabResult result) {
                //Clear the purchase info from persistent storage
            }
        });
    }
}

这对于测试IAB流是可以的,但请确保从发行版中删除此代码。

答案 2 :(得分:4)

我找到了一个不太方便的解决方案,但有效。您似乎可以使用不可兼容的产品,这样您就可以再次购买它们。我正在使用phonegap,所以我只有cordova-plugin-purchase插件的示例代码:

store.when("your.product.id").updated(product => {
    if(product.owned) {
        var transaction = product.transaction;
        product.transaction = null;
        store.inappbilling.consumePurchase(
            function() { // success
                alert("consume success");
            },
            function(err, code) { // error
                alert("consume error " + err)
            },
            product.id,
            transaction.id
        );
    }
});

当您致电store.refresh()或购买产品时,系统会调用更新后的回调。因此,根据您的使用情况,您需要实施另一种检查何时使用该产品的方法。

我没有使用本机Android应用内付款的经验,但显然您也可以在那里使用这些产品。

编辑:对不起,我刚刚读到您并不想在项目中添加其他代码。我现在不认为这是可能的,但我想在这里保留我的答案,因为这可能有助于其他人尝试测试应用内付款。

答案 3 :(得分:4)

  • 在Play控制台上,转到“开发者帐户”->“帐户详细信息”,设置许可证测试人员(默认情况下,您是一个)

  • 购买物品

  • 转到“订单管理”,选择那些测试订单,然后选择:退款,但是在退款时不要忘记检查REVOKE。 (我忘了撤销,现在找不到找回它们的方法)

无论如何,另一个测试帐户即可。

答案 4 :(得分:3)

来自https://stackoverflow.com/a/30178861/326904 @mttmllns

  

无需编写任何特殊的消费代码。只需使用adb   清除Google Play商店数据的命令:

adb shell pm clear com.android.vending

答案 5 :(得分:0)

没有为此找到解决方案。 我的解决方法是从测试用户列表中删除当前测试用户,进行真实购买,然后使用商家控制台取消它。

答案 6 :(得分:0)

queryPurchaseHistoryAsync方法仍然可以找到我去年做出的测试订单,尽管很早以前就已经消耗,退款和吊销了它们。我发现有帮助的一项预防措施是清除Google Play商店应用中的数据(设置/应用/ Google Play商店/存储/清除数据)。 queryPurchaseHistoryAsync从这里获取过时的购买数据,尽管只有非联网(我发现完全不可靠)queryPurchases才可以这样做。毕竟,您可能必须在应用程序中添加其他代码,但这并不需要太多。

随着对Trivial Drive 2的支持下降(文档中的链接将您带到“ 404页面不存在”错误),github文件被存档,并且更新为billing:2.1.0将为您提供自动售货导入IabHelper类中的编译错误),可能会认为此流行的涉及IabHelper的问题的答案已过时。如果您遵循从https://developer.android.com/google/play/billing/billing_overview开始的文档中的基本代码段,并且没有混乱的帮助程序类,那么记帐将变得更加简单。一个持续存在的问题是,“两种方法都具有相同的擦除,但都不会覆盖另一种”方法冲突错误,您可能会在此实现中遇到此错误,请在此处'Both methods have same erasure, yet neither overides the other' method clash error in SkuDetailsResponseListener()查看我的解决方案。

一旦实现了最新的计费代码,就可以在生产应用中创建一个隐藏的触发器,以调用queryPurchaseHistoryAsync来获取PurchaseHistoryRecordList。然后,为该列表中的每个项目调用consumerAsync。这是消耗所有测试订单的准系统代码,允许对非消耗品进行多次测试:

billingClient.queryPurchaseHistoryAsync(BillingClient.SkuType.INAPP,
   new PurchaseHistoryResponseListener() {
      @Override
      public void onPurchaseHistoryResponse(BillingResult billingResult,
         List<PurchaseHistoryRecord> purchaseHistoryRecordList){                                            
         if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK
             && purchaseHistoryRecordList != null) {
             for (PurchaseHistoryRecord purchaserecord : purchaseHistoryRecordList) {
                 if(purchaserecord!=null){
                 ConsumeParams consumeParams =
                     ConsumeParams.newBuilder()
                    .setPurchaseToken(purchaserecord.getPurchaseToken())
                    .setDeveloperPayload(purchaserecord.getDeveloperPayload())
                    .build();                                                                 
                     billingClient.consumeAsync(consumeParams, consumelistener);
}}}}});

答案 7 :(得分:0)

对于使用基于新的TrivialDriveKotlin的方式的人们,使用该方法在应用程序的安装过程中会消耗消耗性产品

handleConsumablePurchasesAsync

如果您购买的不是消耗品,则可以通过将相应的sku添加到GameSku对象中的CONSUMABLE_SKUS中来使其消耗品。例子:

val CONSUMABLE_SKUS = listOf(GAS, PREMIUM_CAR)

然后从设备上卸载您的应用程序,然后再次安装,您的非消耗品购买再次可用。快速而简单。 当然,不要忘记删除您的

答案 8 :(得分:0)

对我有用的是两者的结合:

  • 转到订单管理并退款
  • 清除Play商店应用中的缓存/数据(以及您的应用中放置了一些共享的偏好)。

此外,如果您获得的商品已经拥有状态,则可以使用购买令牌并调用billingClient.consumeAsync()来消费所购买的商品。