В приложении Биллинг: элемент не найден

Я выполнил шаги для In App billing:

  1. установлена демо-приложение
  2. опубликовано в приложении
  3. не опубликовано само приложение

Хотя Я CAN купить товар, есть любопытное предупреждение "товар не найден", что я должен уволить, прежде чем я могу перейти к экрану покупки.

и эта ошибка журнала:

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 ответов


это не ошибка на стороне сервера. Ошибка находится в onClick для кнопки покупки в классе подземелий образца приложения.

предоставленный метод имеет ошибку в инструкции if {} else if {}, где он вызывает mBillingService.requestPurchase вызывается дважды, если выбранный элемент не является элементом подписки (mManagedType != Управляемый.ПОДПИСКА.) Таким образом, один и тот же элемент будет запрошен дважды, один раз с типом элемента "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.Подписка на 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();
        }
    }

У меня такая же ошибка при установке примера dungeons, а также при применении образца кода к моему проекту. Я заметил, что если я пойду в makerequestbundle и изменю API_VERSION на 1, то я могу делать управляемые покупки inapp без этой ошибки.

еще я заметил, что подписки выполняются без этой ошибки, если они оставлены на API_VERSION 2.

им интересно, если это ошибка сервера, как я посмотрел на код и не могу найти проблему. Мой IDs продукта все соответствуя etc.


элемент не найден ошибка возникает, когда ваш идентификатор продукта (в файле apk) не соответствует идентификатору продукта (записанному в списке продуктов в учетной записи market).

и если вы используете " android.тест.купленный " тогда вам не нужно загружать свой apk.

и 1 вещь, которая наиболее важна, вы должны добавить свой "открытый ключ" в свой код. Этот шаг должен использовать ваш пример Android или ваш собственный код приложения.

смотрите эту ссылку для общественности key:
http://developer.android.com/guide/market/billing/billing_integrate.html


я испытал то же самое поведение. Многие посты, которые я прочитал, говорилось, что это просто ошибка на стороне сервера и вы ничего не можете с этим поделать.

тем не менее, я решил получить более старую копию InApp Billing sample code от моего друга, и теперь я больше не испытываю item not found error перед отображением экрана покупки.

Это заставляет меня полагать, что что-то не так с тем, как собирается запрос сервера в более последней копии InApp Billing sample code.

у меня не было возможности проанализировать различия между старым образцом кода и новым образцом кода.

но все, что я могу сказать вам, это то, что если вы можете получить более старую копию образца кода, то вы больше не будете испытывать проблемы у вас есть.


к сожалению, похоже, что если вы измените API на 1, подписки будут отключены. Таким образом, это фактически избавляет от ошибки "элемент не найден", но делает подписки нефункциональными (они должны быть доступны только в API 2).

Итак, вернемся к чертежной доске. Я собираюсь выполнить рефакторинг кода, чтобы вернуться к API 1, для некурящих, подписка на запросы и API 2 для всех остальных. Кажется, несколько элегантное решение.