【问题标题】:Android in-app subscription: Inventory call returns purchase as null even if purchase existsAndroid 应用内订阅:即使购买存在,库存调用也会将购买返回为 null
【发布时间】:2014-03-05 16:52:25
【问题描述】:

这个问题与Purchased subscription not returned in inventory & Android billing - error you own this item 非常相似,但其中提供的答案并没有解决我的问题。

我有来自https://code.google.com/p/marketbilling/ 的最新代码。我的签名 apk 安装在设备上,并作为草稿上传到 Play 商店。我的订阅购买存在于 Google Wallet Merchant Center 中,并显示在 queryPurchases 和 queryInventoryAsync 中,但在我的 PurchaseActivity 中显示为 null。

此代码来自 IabHelper.java 中的 queryPurchases 方法,显示购买信息:

        for (int i = 0; i < purchaseDataList.size(); ++i) {
            String purchaseData = purchaseDataList.get(i);
            String signature = signatureList.get(i);
            String sku = ownedSkus.get(i);

            logDebug("Purchase Data: "+purchaseData);

            if (Security.verifyPurchase(mSignatureBase64, purchaseData, signature)) {
                logDebug("Sku is owned: " + sku);
                Purchase purchase = new Purchase(itemType, purchaseData, signature);

                logDebug("Purchase Data: "+purchase);

                if (TextUtils.isEmpty(purchase.getToken())) {
                    logWarn("BUG: empty/null token!");
                    logDebug("Purchase data: " + purchaseData);
                }

                // Record ownership and token
                inv.addPurchase(purchase);

                logDebug("Get Purchase Data: "+ inv.getPurchase(sku));
            }
            else {
                logWarn("Purchase signature verification **FAILED**. Not adding item.");
                logDebug("   Purchase data: " + purchaseData);
                logDebug("   Signature: " + signature);
                verificationFailed = true;
            }
        }

此方法“queryInventoryAsync”来自 IabHelper.java 类并返回库存信息:

public void queryInventoryAsync(final boolean querySkuDetails,
                           final List<String> moreSkus,
                           final QueryInventoryFinishedListener listener) {
    final Handler handler = new Handler();
    checkNotDisposed();
    checkSetupDone("queryInventory");
    flagStartAsync("refresh inventory");
    (new Thread(new Runnable() {
        public void run() {
            IabResult result = new IabResult(BILLING_RESPONSE_RESULT_OK, "Inventory refresh successful.");
            Inventory inv = null;
            try {
                inv = queryInventory(querySkuDetails, moreSkus);
            }
            catch (IabException ex) {
                result = ex.getResult();
            }

            flagEndAsync();

            final IabResult result_f = result;
            final Inventory inv_f = inv;
            if (!mDisposed && listener != null) {
                handler.post(new Runnable() {
                    public void run() {
                        listener.onQueryInventoryFinished(result_f, inv_f);
                        logDebug("Result: "+ result_f.getResponse() + " inventory: "+ inv_f.getAllOwnedSkus().get(0));
                    }
                });
            }
        }
    })).start();
}

这是来自我的购买活动:

IabHelper.QueryInventoryFinishedListener mInventoryListener = new IabHelper.QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result, Inventory inventory) {

        // Is it a failure?
        if (result.isFailure()) {
            Log.i(TAG, "Failed to query inventory: " + result);
            return;
        }else{
            //This returns false
            Log.i(TAG, "Query inventory was successful: " + inventory.hasPurchase(sku)); 
        }

        // Do we have the premium upgrade?
        //This returns null
        Purchase premiumPurchase = inventory.getPurchase(sku);

虽然 queryPurchase 和 queryInventoryAsync 显示我的设备和电子邮件帐户存在购买,但 getPurchase(sku) 将 Purchase 显示为 null 并且 hasPurchase(sku) 返回 false。

有人知道为什么会这样吗?谢谢!

【问题讨论】:

  • 您确定您正在启动的应用是已签名的应用吗?使用同一个帐户?
  • @jmunoz 是的。我很确定。
  • 好的,只是想确定这个事实。您是否尝试使用示例应用程序。我已尝试使用此示例应用程序,将其作为草稿上传并检查它是否正常工作......后来我复制了我需要的行
  • 您找到原因了吗?我有一个类似的问题。我查询所有 sku 详细信息,然后检查其中是否已购买。如果我调用同步获取所有详细信息,它会检测到购买的物品。如果我异步执行,对 getPurchase 的调用总是返回 null。
  • @Benzino 确保您传递了正确的 sku 并且它不为空。就我而言,sku 中有一个错字。

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


【解决方案1】:

我遇到了同样的问题,就这样解决了

  • 将草稿应用程序上传为 alpha 或 beta 以及一些版本代码。
  • 使用具有有效订阅的帐户登录设备。
  • 在此设备上安装与 alpha/beta 版本相同版本的签名应用程序。

【讨论】:

    猜你喜欢
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 2017-06-09
    • 2015-06-06
    • 2012-12-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    相关资源
    最近更新 更多