In-App Billing test: android.test.purchased уже принадлежит

В настоящее время я тестирую In-App Billing для будущего приложения, и после того, как я успешно "купил" тестовый элемент "android.test.purchased" в первый раз, теперь я получаю код ответа 7 каждый раз, когда я пытаюсь купить это снова, что означает, что я уже владею этим элементом.

12-15 23: 02: 14.149: E/IabHelper (19829): Ошибка биллинга в приложении: невозможно для покупки товара, Ответ на ошибку: 7: Товар уже принадлежит

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

Если нет, как я могу "reset" его состояние не иметь? Я использую пакет util из Google In-App Billing Sample.

Ответ 1

Оказывается, что объект android.test.purchased ведет себя как обычный идентификатор. Это означает, что если вы хотите иметь возможность купить его снова, вы должны его использовать где-то в своем коде. Я думаю, что документация Google вводит в заблуждение по этому вопросу и что они должны добавить еще один статический идентификатор, который вы можете купить бесконечно для целей тестирования.

Ответ 2

Добавьте этот код в поток, чтобы инициировать запрос на потребление.

int response = mService.consumePurchase(3, getPackageName(), purchaseToken);

Здесь для теста покупки, purchaseToken - это

purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased";

И

if (response == 0)

тогда потребление будет успешным.

Кроме того, не забудьте опубликовать mService в

IabHelper.Java

тогда можно было бы получить доступ так:

int response = mHelper.mService.consumePurchase(3, getPackageName(), purchaseToken);

Ответ 3

Не нужно писать код специального потребления. Просто используйте команду adb для очистки данных в Google Play Store:

adb shell pm clear com.android.vending

Ответ 4

In-app version 3:

IabHelper.QueryInventoryFinishedListener mGotInventoryListener = new IabHelper.QueryInventoryFinishedListener() {

    public void onQueryInventoryFinished(IabResult result, Inventory inventory) {

        .....................

        if (inventory.hasPurchase(SKU_CONTENT)) {

            mHelper.consumeAsync(inventory.getPurchase(SKU_CONTENT), null);
        }
    }
};

Ответ 5

Вот как мы можем потреблять элемент

 consume.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            Thread t = new Thread(new Runnable() {
                @Override
                public void run() {
                    String purchaseToken = "inapp:" + getPackageName() + ":android.test.purchased";
                    try {
                        Log.d("","Running");
                        int response = mService.consumePurchase(3, getPackageName(), purchaseToken);
                        if(response==0)
                        {
                            Log.d("Consumed","Consumed");
                        }else {
                            Log.d("","No"+response);
                        }
                    }catch (RemoteException e)
                    {
                        Log.d("Errorr",""+e);
                    }

                }
            });
            t.start();
        }
    });

Ответ 6

Версия3. Очистка кеша в Google Play Store позволит снова и снова использовать "android.test.purchased".

Ответ 7

Я использовал adb shell:

adb shell pm clear com.android.vending

Ответ 8

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

Лучшее решение, которое помогло мне очистить android.test.purchased, было

adb uninstall com.yourapp.name

а затем

adb shell pm clear com.android.vending

Мне не нужно было снимать наличные и просматривать настройки моих приложений или изменять код для этого. Мне нужно было добавить adb в переменные пути системы windows, которые были довольно прямолинейными. Так что да, вам нужно использовать adb, который вам, вероятно, нужен, так что.

Вы просто добавляете свои C: \...\android-sdk\platform-tools; в пути Windows в переменных среды, и я полагаю, что это довольно просто в Mac и Linux. Надеюсь, это поможет кому-то потратить несколько дней меньше с внедрением андроида в биллингах приложений.

Ответ 9

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

Поэтому, если вы используете IabHelper, в классе IabHelper вы можете временно изменить mService IInAppBillingService на public, чтобы он был доступен из вашего IabHelper.

Тогда в своем классе вы можете так потреблять,

int response = mHelper.mService.consumePurchase(3, getPackageName(), "inapp:"+getPackageName()+":android.test.purchased");

В случае успеха ответ будет 0.

Надеюсь это поможет.

Ответ 10

Если вы находитесь в тестовой среде

1) В случае android.test.purchased я могу reset поддельный платеж, перезапустив устройство Android (потреблял инвентарь).

2) В утилите InApp есть файл под названием Security.java, который делает его следующим: временным. Поскольку тестовый платеж (фальшивка) всегда возвращает false из-за исключения безопасности.

public static boolean verifyPurchase(String base64PublicKey,
                                     String signedData, String signature) {
    return true; }

Затем в вашем вызове OnIabPurchaseFinishedListener fechInvForconsumeItem()

IabHelper.OnIabPurchaseFinishedListener mPurchaseFinishedListener
            = new IabHelper.OnIabPurchaseFinishedListener() {
        public void onIabPurchaseFinished(IabResult result,
                                          Purchase purchase)
        {
            if (result.isFailure()) {
                // Handle error
                Log.e("123","Failure");

                return;
            }
            else if (purchase.getSku().equals(ITEM_SKU)) {
                Log.e("123","PURCAsed");
                fechInvForconsumeItem(); // Restart device if not consume

            }

        }
    };

Функция fechInvForconsumeItem() -

    public void fechInvForconsumeItem() {
    mHelper.queryInventoryAsync(mReceivedInventoryListener);
}
IabHelper.QueryInventoryFinishedListener mReceivedInventoryListener
        = new IabHelper.QueryInventoryFinishedListener() {
    public void onQueryInventoryFinished(IabResult result,
                                         Inventory inventory) {


        if (result.isFailure()) {
            // Handle failure
            Log.e("11","Failure");



        } else {
            Log.e("11","suc");
            mHelper.consumeAsync(inventory.getPurchase(ITEM_SKU),
                    mConsumeFinishedListener);
        }


    }
};

Потребляемый приемник

    IabHelper.OnConsumeFinishedListener mConsumeFinishedListener =
        new IabHelper.OnConsumeFinishedListener() {
            public void onConsumeFinished(Purchase purchase,
                                          IabResult result) {

                if (result.isSuccess()) {
                } else {
                    // handle error
                    Log.e("11","sucConsume");
                }
            }
        };

Ответ 11

В целях тестирования я также предлагаю вам вставить фрагмент кода, который будет очищать все продукты, которые вы купили, до вызова метода, который инициализирует поток покупки gp. Это особенно удобно, когда вы проверяете только один предмет на данный момент. Например. например:

PurchasesResult purchasesResult = mBillingClient.queryPurchases(BillingClient.SkuType.INAPP);
    for (Purchase sourcePurchase : purchasesResult.getPurchasesList()) {
        if(sourcePurchase != null){

            ConsumeResponseListener listener = new ConsumeResponseListener() {
                @Override
                public void onConsumeResponse(String outToken, @BillingResponse int responseCode) {

                    System.out.println("all consumed");
                }
            };
            mBillingClient.consumeAsync(sourcePurchase.getPurchaseToken(), listener);
        }else{
            System.out.println("null");
        }
    }

// and then initiate whole process with clear "shoping basket"

BillingFlowParams.Builder builder = new BillingFlowParams.Builder()
        .setSku(itemName).setType(BillingClient.SkuType.INAPP);

Ответ 12

перейдите на консоль Google Play и откройте вкладку Управление заказами. Там вы можете вернуть/отменить пробные покупки.

Ответ 13

IabHelper.QueryInventoryFinishedListener 
       mQueryFinishedListener = new IabHelper.QueryInventoryFinishedListener() {
       public void onQueryInventoryFinished(IabResult result, Inventory inventory)   
       {
          if (result.isFailure()) {
             return;
           }          
          try {

                if(inventory.hasPurchase("product_sku_id"))
                {   
                     isItemEnable= true;
                     mHelper.consumeAsync(inventory.getPurchase("product_sku_id"),null);            
                }
                else
                {
                       isItemEnable = false;
                }           

            } catch (Exception e) {
                e.printStackTrace();
            }
       }

    };

Ответ 14

В моем случае, похоже, Google не регистрирует покупку для товара. Скорее, локальная копия Служб Google Play кэширует покупку. Таким образом, когда второй запрос выполняется на том же устройстве, появляется android.test.purchased already owned. Однако использование другого устройства или сброс устройства очищает кеш и позволяет повторить покупку.

Ответ 15

В моем случае мне просто нужно было очистить кеш приложений. После очистки кеша я снова смог инициировать процесс покупки.

Из моего устройства (4.4.2) я перешел в "Настройки- > Диспетчер приложений". Затем я выбрал приложение со вкладки "DOWNLOADED", а затем "Очистить кеш".

Ответ 16

В этом разница между потребляемыми и не потребляемыми товарами; не потребляемые предметы (что вы, похоже, имеете в виду здесь) постоянно отслеживают свое состояние, а расходные предметы можно приобрести несколько раз. Вам нужно будет войти в консоль управления воспроизведением и отменить/вернуть продажу, чтобы снова протестировать ее.