Подтвердить что ты не робот

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

Я выполнил следующие шаги для биллинга приложений:

  • Установленное демо-приложение
  • Опубликован продукт в приложении
  • НЕ опубликовано само приложение

Хотя я 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
4b9b3361

Ответ 1

Это НЕ ошибка на стороне сервера. Ошибка находится в кнопке onClick для покупки в классе Dungeons образца приложения.

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

Ответ 2

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

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

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

Ответ 3

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

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

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

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

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

Ответ 4

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

И если вы используете "android.test.purchased", вам не нужно загружать свой apk.

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

Смотрите эту ссылку для открытого ключа:
http://developer.android.com/guide/market/billing/billing_integrate.html

Ответ 5

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

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