已购买的库存收集未显示所有已购买的产品,Google Play应用内结算

时间:2016-02-11 20:49:25

标签: android google-play in-app-billing

我已在应用结算https://github.com/blundell/SimpleInAppPurchaseV3中实施了此项目。除了并没有为Inventory对象返回所有购买的产品外,一切看起来都有效。

我开始使用id包含多个具有相同前缀的产品,使用java包格式

acmestudio.myapp.upgrade1.red
acmestudio.myapp.upgrade1.blue
acmestudio.myapp.upgrade1.green

这是问题的开始。我购买的第一个, acmestudio.myapp.upgrade1.red 工作并显示在已购买的库存物品中。

然而,在购买其他产品之后会:

  • a)成功处理,
  • b)但随后不会在已购买的productIds列表中返回

我想也许这是一个格式问题,所以我将点符号更改为下划线。然而,同样的事情发生了。现在我有了这些id的多个产品

acmestudio_myapp_upgrade1_red
acmestudio_myapp_upgrade1_blue
acmestudio_myapp_upgrade1_green

而且,它只适用于第一个。所以现在在我购买的Skus列表中,它有: [acmestudio.myapp.upgrade1.red,acmestudio_myapp_upgrade1_blue]

即使我从结算API中看到订单确认,也会发生这种情况

PurchaseInfo:{"orderId":"GPA.1390-8158-3067-22151","packageName":"com.acmestudio.myapp”,
”productId":"acmestudio_myapp_upgrade1_red”,”purchaseTime":1455140848461,"purchaseState":0,
"purchaseToken":"akdnfgpkcnckkcdomomimihi.AO-J1OwKCGfAKHDDsBxbKjeVKRZ0hIOSXALhVPeYaKx2GsVGH6NbVDs4nj6sLf48oUy9Zs0MziVA7xFtebELB0Q6udcN_1fvaNynkFLVVJXJmZGeEiRy9c8KH7HIn2QK2SZc1EzB2NLtOoVu324s2EwPmmtLYKj6MA"}

我想我必须缺少一些步骤,因为我将调试器设置为停在这里..在IabHelper.java的github项目代码中...也就是说,这个问题出现在我甚至没有碰过的代码中。 https://github.com/blundell/SimpleInAppPurchaseV3/blob/master/src/com/android/vending/billing/util/IabHelper.java#L814

ArrayList<String> ownedSkus = ownedItems.getStringArrayList(
                    RESPONSE_INAPP_ITEM_LIST);

这是我要检查的代码。注意我得到了2个清单对象的实例:

    1. 在主线程上
    1. 在Asynch电话中

      List<String> moreSkus = null;
      Inventory inventory  = billingHelper.queryInventory(querySkuDetails, moreSkus);
      
      IabHelper.QueryInventoryFinishedListener inventoryLstnr = 
          new IabHelper.QueryInventoryFinishedListener() {
      
              @Override
              public void onQueryInventoryFinished(IabResult result, Inventory inv)
              {
                  Log.d("Query inventory finished.");
      
                  // Is it a failure?
                  if (result.isFailure()) {
                          Log.d("Failed to query inventory: " + result);
                      return;
                  }
      
                  Log.d("Query inventory was successful.");
      
              }
      
      };
      
      billingHelper.queryInventoryAsync(true, inventoryLstnr);
      

我在这里缺少什么? ..也许我需要独特的前缀?!接下来我会尝试,但似乎不应该存在问题。

1 个答案:

答案 0 :(得分:0)

好的,感谢SO的建议,因为我发布了这个问题,看起来这个问题与billingHelper.consumeAsync(..)电话有关。

通过评论,我正在购买的产品ID出现在inventory.mPurchaseMap

我最后偶然发现这篇文章完美地解释了它: https://stackoverflow.com/a/25452735/2162226

  

正如作者所说:

     

这是按预期工作的 - 在您正在使用的代码中   立即进行应用内购买,这意味着您可以购买它   再次..

     

没有任何迹象表明你无法购买托管   产品不止一次。你不能做的是购买托管   之前购买同一个托管项目之前的产品   消耗掉。

这篇帖子是我看到的那个建议,让我朝着正确的方向前进: https://stackoverflow.com/a/18808407/2162226