Тест виставлення рахунків через додаток: android.test.purchased вже належить


122

В даний час я тестую виставлення рахунків через додаток для майбутнього додатка, і після того, як я вперше успішно "купив" тестовий елемент "android.test.purchaps", я отримую код відповіді 7 кожного разу, коли намагаюся придбати його знову, це означає, що я вже є власником цього предмета.

12-15 23: 02: 14.149: E / IabHelper (19829): Помилка виставлення рахунків у програмі: Неможливо придбати товар, Відповідь про помилку: 7: Елемент вже належить

Як я розумію, ця покупка повинна бути завжди можливою, правда? Так що розробник може протестувати свою програму?

Якщо ні, то як я можу "скинути" його стан на невласність? Я використовую пакет util із зразка виставлення рахунків через додаток Google.


1
мій набір - це вірші. Мені потрібне повідомлення, яке вже належить, але кожен раз його дозволяють купувати
Sandeep P

Відповіді:


109

Додайте цей код до потоку, щоб ініціювати запит на споживання.

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

Ось для тесту на придбання

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

І

if (response == 0)

то споживання успішне.

також не забудьте зробити mService загальнодоступним

IabHelper.Java

тоді можна отримати доступ таким чином:

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

2
Легенда це працює, @psykhi дійсно повинен був дати вам бали. Я намагався споживати його, але не міг розробити марку закупівлі. Спасибі
Блонделл

1
Дякую! @prasharonnet
Y2i

1
Це величезна економія часу. Ідеально. Дякую.
PrivusGuru

13
Що таке mService? mHelper? Але я не можу знайти споживанняПокупка ()
Bagusflyer

1
mService є об'єктом інтерфейсу IInAppBillingService.aidl, який пов'язується з послугою придбання, ініційованою для inapp-купівлі.
Aashutosh Sharma

92

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

adb shell pm clear com.android.vending

1
спасибі це зробив трюк, я просто повинен був очистити додаток, тому я зробив повну відповідь. Це правильний підхід для мене.
sivi

Це правильний підхід для багатьох людей. Додавання коду до вашої програми та повторне розміщення займає більше часу (призначене для каламбуру).
Michael Labbé

9
Це хороше рішення для тестового пристрою, але будьте уважні: він скине всі ваші налаштування в додатку Google Play Store. Отже, я б краще не робив цього на своєму особистому пристрої.
racs

7
Немає! це погана ідея, ви втратили в додатку покупку іншого продукту та інших додатків. Хорошим є те, що вам доведеться споживати продукт, якщо ви хочете перевірити свій додаток у купівлі додатків, сценарій - це просто створити дві речі, одну для покупки, а іншу для споживання придбаного. пункт.
Рахул Мандалія

2
@RahulMandaliya ваш додаток має бути стійким до очищення кешу, використовуючи API getPurchases (), щоб знати, що вже було придбано.
mttmllns

66

Виявляється, придбаний елемент android.test. поводиться як звичайний ідентифікатор. Це означає, що якщо ви хочете мати можливість придбати його знову, вам доведеться споживати його десь у своєму коді. Я думаю, що документація Google в цьому питанні вводить в оману і що вони повинні додати ще один статичний ідентифікатор, який ви можете нескінченно купувати для тестових цілей.


Використовуйте виклик інвентаря, щоб отримати предмет Купівля, а потім споживати його - це досить просто, як тільки ви обіймаєте його.
слот

3
Подивіться нижче на відповідь від @mttmlins або прочитайте vvse.com/blog/blog/2016/08/26/…
IgorGanapolsky

Не зовсім правда, у мене є випадок, коли є тест, billingClient.queryPurchases()який не споживається, але він не повертає цей неспоживаний предмет, тому зараз я не можу споживати предмет, тому що не можу purchaseTokenйого отримати
Джемшит Іскендеров,

28

Версія в додатку 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);
        }
    }
};

Оскільки малюнок вартує тисячі слів, цілий робочий фрагмент коду з голими кістками коштує тисячу "Додайте цей код до теми. . . '.
Androidcoder

11

Версія 3 - Найшвидший спосіб вирішити : Очищення кешу Google Play Store дозволить "android.test.purchased" знову доступним.


Чи це не вплине і на інші програми, встановлені в системі?
ІгорГанапольський

1
@IgorGanapolsky, ні. Це стосується лише імітованих покупок. "Справжні" покупки зберігаються на сервері Google і не змінюються.
Денис

1
Я очистив дані програми Google Play, але це не спрацювало. Інформація про тестові покупки все ще існує.
Шрікар Редді

2
@Richard через "налаштування / менеджер програм /" або перетягування піктограми Google Play Store з меню до кнопки "інформація" (у верхній частині екрана). Нарешті, просто натисніть кнопку «очистити кеш».
Денис

1
Найкраща відповідь для мене. Всі інші хороші, але це, безумовно, найшвидший спосіб вирішити
Ігнасіо Рода


9

Ось так ми можемо споживати предмет

 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();
        }
    });

Працював для мене - використовував android.test.purchaseна певному етапі, що спричиняв проблеми - завдання інвентаризації в виставленнях рахунків просто кинуло безліч помилок і так і не було закінчено. Запустивши це одноразово, це очистило його, щоб я міг відновити використання свого фактичного SKU і продовжувати, як я був раніше. Спасибі
Jon

1
Відмінна відповідь. Працює зі статичними відповідями = до того, як apk із увімкненою оплатою через додаток буде завантажено в Google Play.
infero

Дякую! Працювали для мене.
AndroidMechanic - Viral Patel

6

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

Найкраще рішення, яке працювало для мене, щоб очистити 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 OS. Сподіваємось, це допоможе комусь витратити на кілька днів менше на впровадження андроїд у виставлення рахунків.


uninstallне потрібно очищати android.test . придбаний sku.
ІгорГанапольський

4

Головне питання - ви повинні споживати android.test.purchasedтовар. Але цей товар не буде доступний у вашому інвентарі запитів, тому ви не можете споживати, використовуючи звичайний потік.

Отже, якщо ви використовуєте IabHelper у IabHelperкласі, ви можете тимчасово змінити IInAppBillingServicemService на загальнодоступний, щоб він був доступний у вашому IabHelper.

Тоді у своєму класі ви можете споживати так,

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

Якщо успіх, відповідь буде 0.

Сподіваюся, це допомагає.


Дотична: чи можна повернути повернення за керований елемент (за допомогою тестового рахунку - він, схоже, не відображається на інформаційній панелі)?
Ед Лі

Ви можете зателефонувати consumeAsync()на android.test.purchased . З цим немає жодної проблеми.
ІгорГанапольський

Для простого тестування це найкращий спосіб, якщо використовувати IabHelper. Допомогли мені.
Rúben

2

Для тестування я також пропоную вам вставити фрагмент коду, який очищатиме всі продукти, які ви купили, перш ніж викликати метод, який ініціалізує потік покупки 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);

2

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


1

Якщо ви перебуваєте в тестовому середовищі

1) У випадку покупки android.test.purchased я можу скинути підроблений платіж шляхом перезавантаження пристрою Android (спожитого інвентаря).

2) У утиліті InApp є файл під назвою Security.java зробити його наступним, тимчасовим. Оскільки тестовий платіж (підроблений) завжди повертається помилковим через виняток із безпеки.

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");
                }
            }
        };

0
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();
            }
       }

    };

-1

У моєму випадку виявляється, що Google не записує покупку товару. Швидше, локальна копія Google Play Services кешує покупку. Таким чином, коли на цьому ж пристрої робиться другий запит android.test.purchased already owned. Однак використання іншого пристрою або скидання пристрою очищає кеш-пам'ять і дозволяє повторити покупку.


-1

У моєму випадку мені просто потрібно було очистити кеш програм. Очистивши кеш, я зміг знову запустити потік покупки.

З мого пристрою (4.4.2) я перейшов до "Налаштування-> Менеджер програм". Далі я вибрав додаток на вкладці "ЗАВАНТАЖЕНО", а потім "Очистити кеш".


-2

Це різниця між споживчими та неспоживними предметами; Неспоживні предмети (з якими ви, мабуть, маєте справу тут) постійно відслідковують їх стан, тоді як витратні речі можна придбати кілька разів. Вам доведеться зайти в консоль управління Play і скасувати / повернути продаж, щоб перевірити його ще раз.


1
Але річ у тому, що я не маю жодної "сили" щодо цих "підроблених" товарів, і я не бачу, де я міг би змінити статус продажу, оскільки вони не є реальними покупками. The google говорить про придбаний на android.test.purchased: Коли ви робите запит на виставлення рахунку через додаток з цим ідентифікатором продукту, Google Play відповідає, ніби ви успішно придбали товар. Тож я досить розгублений: /
psykhi

Ви все ще робите тестування статичної відповіді? Якщо так, то вам просто потрібно змінити, який статичний відповідь надсилається. Це здається, що ви готові "Тестувати покупки через додаток за допомогою власних ідентифікаторів продукту", однак це робить реальні покупки із скасованими замовленнями.
addaon

Я все ще застряг зі статичними ідентифікаторами. Мені б хотілося тестувати покупку через додаток за допомогою ідентифікатора, придбаного android.test.purchased. Він просто працював уперше, коли він завжди повинен працювати з того, що я розумію в документі Google. Вибачте, якщо мені не було зрозуміло!
Психі

Моє неправильне тлумачення, вибачте. У такому випадку ... я не знаю. Це, безумовно, повинно повертати успіх кожного разу, я не бачив випадку, який ви бачите. Вибачте.
addaon

Спробую ще раз переглянути проблему після доброї ночі сну :) Дякую за допомогу!
psykhi
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.