在应用结算中:未找到商品

时间:2012-05-27 15:15:37

标签: android in-app-billing

我已按照应用结算中的步骤进行操作:

  1. 已安装的演示应用
  2. 发布了应用内商品
  3. 未发布应用程序本身
  4. 虽然我 CAN 购买该商品,但仍有一个好奇的警告"找不到商品"在我进入购买屏幕之前我必须解雇。

    AND此日志错误:

    E/Volley(1384): [157] BasicNetwork.performRequest: Unexpected response code 500 for https://android.clients.google.com/fdfe/details?doc=subs:com.testorooney.testo:sword_001
    

5 个答案:

答案 0 :(得分:31)

这不是服务器端错误。该错误发生在示例应用程序的Dungeons类的onClick for Purchase按钮中。

提供的方法在if {} else if {}语句中有一个错误,当所选项目不是订阅项目(mManagedType!= Managed.SUBSCRIPTION)时,它会导致mBillingService.requestPurchase被调用两次。因此,同一项目将被请求两次,一次是项目类型为“inapp”(这是有效请求),紧接着是项目类型为“subs”(这是不正确的,并显示“找不到项目”)

这是有缺陷的代码:

if (mManagedType != Managed.SUBSCRIPTION &&
                    !mBillingService.requestPurchase(mSku, Consts.ITEM_TYPE_INAPP, mPayloadContents)) {
                showDialog(DIALOG_BILLING_NOT_SUPPORTED_ID);
            } else if (!mBillingService.requestPurchase(mSku, Consts.ITEM_TYPE_SUBSCRIPTION, mPayloadContents)) {
                // Note: mManagedType == Managed.SUBSCRIPTION
                showDialog(DIALOG_SUBSCRIPTIONS_NOT_SUPPORTED_ID);
            }

要解决此问题,请将mManagedType == Managed.SUBSCRIPTION添加到else上面。

以下是该功能的外观:

@Override
    public void onClick(View v) {
        if (v == mBuyButton) {
            if (Consts.DEBUG) {
                Log.d(TAG, "buying: " + mItemName + " sku: " + mSku);
            }

            if (mManagedType != Managed.SUBSCRIPTION &&
                    !mBillingService.requestPurchase(mSku, Consts.ITEM_TYPE_INAPP, mPayloadContents)) {
                showDialog(DIALOG_BILLING_NOT_SUPPORTED_ID);
            } else if (mManagedType == Managed.SUBSCRIPTION && !mBillingService.requestPurchase(mSku, Consts.ITEM_TYPE_SUBSCRIPTION, mPayloadContents)) {
                // Note: mManagedType == Managed.SUBSCRIPTION
                showDialog(DIALOG_SUBSCRIPTIONS_NOT_SUPPORTED_ID);
            }
        } else if (v == mEditPayloadButton) {
            showPayloadEditDialog();
        } else if (v == mEditSubscriptionsButton) {
            editSubscriptions();
        }
    }

答案 1 :(得分:3)

我在安装地下城示例时以及将代码示例应用到我的项目时遇到同样的错误。我注意到,如果我去makerequestbundle并将API_VERSION更改为1,那么我可以执行inapp托管购买而不会出现此错误。

我注意到的另一件事是,如果留在API_VERSION 2上,订阅会在没有此错误的情况下执行。

我想知道这是否是服务器端错误,因为我查看了代码并且无法找到问题。我的产品ID都匹配等。

答案 2 :(得分:0)

我经历过同样的行为。我读过的很多帖子都说它只是一个服务器端错误而且你无能为力。

但是,我决定从我的一位朋友处获取InApp Billing sample code的较旧副本,现在我在显示购买屏幕之前不再体验item not found error

这让我相信在最新的InApp Billing sample code副本中组装服务器请求的方式有问题。

我没有机会分析旧示例代码和新示例代码之间的差异。

但我能告诉你的是,如果你能获得示例代码的旧版本,那么你将不再遇到问题。

答案 3 :(得分:0)

未找到项目当您的产品ID(在apk文件中)与产品ID(在市场帐户中的产品列表中写入)不匹配时,会发生错误。

如果您使用的是“android.test.purchased”,则无需上传您的apk。

最重要的一件事是,您必须在代码中添加“公钥”。此步骤必须使用您的Android示例或您自己的应用代码。

有关公钥,请参阅此链接:
http://developer.android.com/guide/market/billing/billing_integrate.html

答案 4 :(得分:0)

不幸的是,如果您将API更改为1,则会禁用订阅。因此,实际上这确实消除了“未找到项目”错误,但使订阅无法正常运行(它们必须仅在API 2中可用)。

所以,回到绘图板。我将重构代码以返回API 1,用于非订阅请求,以及API 2用于所有其他请求。看起来像是一个有点优雅的解决方案。