【问题标题】:Android In-app billing purchased itemsAndroid 应用内结算购买的商品
【发布时间】:2016-07-28 11:59:01
【问题描述】:

我正在按照教程编写应用内计费项目,并且我设法让一切变得更好,但是当我想知道用户是否购买了某个项目时,它总是错误的,即使我使用其他设备进行测试也是如此拥有 Beta 版测试人员帐户。

这是我用来购买商品的:

mHelper = new IabHelper(MainActivity.this, base64EncodedPublicKey);

    mHelper.startSetup(new IabHelper.OnIabSetupFinishedListener() {
       public void onIabSetupFinished(IabResult result) {
           IabHelper.QueryInventoryFinishedListener mGotInventoryListener
                   = new IabHelper.QueryInventoryFinishedListener() {
               public void onQueryInventoryFinished(IabResult result,
                                                    Inventory inventory) {

                   if (result.isFailure()) {
                       // handle error here
                   }
                   else {
                       // does the user have the premium upgrade?
                       boolean mIsPremium = inventory.hasPurchase(ITEM_SKU);
                       // update UI accordingly
                       Toast.makeText(getApplicationContext(), "" + mIsPremium, Toast.LENGTH_LONG).show();
                       if(mIsPremium){
                           buy.setVisibility(View.INVISIBLE);
                       }
                   }
               }
           };
           mHelper.queryInventoryAsync(mGotInventoryListener);
       }
    });

这是购买该物品的代码:

buy.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            mHelper.launchPurchaseFlow(MainActivity.this, ITEM_SKU, 10001,
                    new IabHelper.OnIabPurchaseFinishedListener() {
                        public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
                            if (result.isFailure()) {
                                return;
                            } else if (purchase.getSku().equals(ITEM_SKU)) {
                                mHelper.queryInventoryAsync(new IabHelper.QueryInventoryFinishedListener() {
                                    public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
                                        if (result.isFailure()) {
                                        } else {
                                            mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU),
                                                    new IabHelper.OnConsumeFinishedListener() {
                                                        public void onConsumeFinished(Purchase purchase, IabResult result) {
                                                            if (result.isSuccess()) {
                                                                buy.setVisibility(View.GONE);
                                                            } else {
                                                            }
                                                        }
                                                    });
                                        }
                                    }
                                });
                            }
                        }
                    }, "mypurchasetoken");
        }
    });

当我在真实设备上使用我的 beta 测试人员的帐户测试应用程序时,购买该项目时代码运行良好,但是当我关闭应用程序并再次打开它时,第一个代码表示该帐户没有购买项目。

【问题讨论】:

    标签: android in-app-billing


    【解决方案1】:

    您可能在购买退货后消费该产品。

    有关消耗品/非消耗品的信息请参见此处: https://developer.android.com/google/play/billing/api.html#consumetypes

    【讨论】:

    • 虽然这可能是答案,但这不应该是要求更多信息的评论吗?您正在回答一个问题。
    • 我可以改写为“您可能正在消费产品......”,这样会更好吗?
    • 我相信。基本上,检查此答案的另一个用户可以看到他们可能遇到的“最有可能”的问题。消耗品不会显示为代码错误,但会显示相同的行为。
    • 我现在读了它,我想出售的物品是非消耗品,换句话说,是“获得优质”物品。正如我在这个问题link 中看到的那样,我必须使用共享首选项,但我认为这是一个坏主意,如果用户删除应用程序怎么办?我认为谷歌可能有办法检索购买的物品,但在我的情况下,结果总是错误的。
    【解决方案2】:

    好的,伙计们,我已经解决了,这是遵循教程的错误,但如果不阅读有关消耗品/非消耗品的信息,我永远不会解决它。我的商品是一次性购买的,所以不需要:

    mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU),
                                                    new IabHelper.OnConsumeFinishedListener() {
                                                        public void onConsumeFinished(Purchase purchase, IabResult result) {
                                                            if (result.isSuccess()) {
                                                                buy.setVisibility(View.GONE);
                                                            } else {
                                                            }
                                                        }
                                                    });
    

    在代码的第二部分,我所要做的就是删除它,然后一切都OK了,这样,代码的第二部分将是:

    buy.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mHelper.launchPurchaseFlow(MainActivity.this, ITEM_SKU, 10001,
                        new IabHelper.OnIabPurchaseFinishedListener() {
                            public void onIabPurchaseFinished(IabResult result, Purchase purchase) {
                                if (result.isFailure()) {
                                    return;
                                } else if (purchase.getSku().equals(ITEM_SKU)) {
                                    mHelper.queryInventoryAsync(new IabHelper.QueryInventoryFinishedListener() {
                                        public void onQueryInventoryFinished(IabResult result, Inventory inventory) {
                                            if (!result.isFailure()) {
                                                buy.setVisibility(View.GONE);
                                            }
                                        }
                                    });
                                }
                            }
                        }, "mypurchasetoken");
            }
        });
    

    希望这对将来的某人有所帮助,谢谢!。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-12-09
      • 2012-08-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多