13

我已按照应用内计费的步骤进行操作:

  1. 已安装的演示应用
  2. 发布了应用内商品
  3. 未发布应用程序本身

虽然我可以购买该物品,但有一个奇怪的警告“找不到物品”,我必须先将其关闭,然后才能进入购买屏幕。

和这个日志错误:

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
4

5 回答 5

31

这不是服务器端错误。该错误出现在示例应用程序的 Dungeons 类中的“购买”按钮的 onClick 中。

提供的方法在 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 if 上面。

以下是函数的外观:

@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();
        }
    }
于 2012-07-07T03:03:12.627 回答
3

在安装地牢示例以及将代码示例应用于我的项目时,我也遇到了同样的错误。我注意到,如果我去 makerequestbundle 并将 API_VERSION 更改为 1,那么我可以在没有此错误的情况下进行应用内管理购买。

我注意到的另一件事是,如果保留在 API_VERSION 2 上,订阅执行时不会出现此错误。

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

于 2012-06-03T01:28:03.410 回答
0

我经历了同样的行为。我读过的许多帖子都说这只是一个服务器端错误,您对此无能为力。

但是,我决定InApp Billing sample code从我的一个朋友那里得到一个旧版本,现在我不再体验item not found error显示购买屏幕之前的体验。

这使我相信在更新的InApp Billing sample code.

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

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

于 2012-05-29T14:11:18.877 回答
0

当您的产品 id(在 apk 文件中)与产品 id(写在市场帐户的产品列表中)不匹配时,会发生错误。

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

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

请参阅此链接以获取公钥:http:
//developer.android.com/guide/market/billing/billing_integrate.html

于 2012-05-30T14:33:43.520 回答
0

不幸的是,看起来如果您将 API 更改为 1,订阅将被禁用。因此,这实际上消除了“未找到项目”错误,但使订阅不起作用(它们必须仅在 API 2 中可用)。

所以,回到绘图板。我将重构代码以返回 API 1(用于非订阅请求)和 API 2 用于所有其他请求。似乎是一个有点不优雅的解决方案。

于 2012-06-05T13:03:48.540 回答