Код ответа Товар уже приобретен, но список покупок недействителен

Я реализую IAP в своем приложении. Один предназначен для удаления рекламы, а другой - для добавления головоломки. Я тестировал это на своем устройстве, но столкнулся с проблемой. После покупки товара я получаю ответ с кодом «Товар уже принадлежит», но его нет в списке покупок.

Я настраиваю свой платежный клиент следующим образом,

private void setUpBillingClient(){
        mBillingClient = BillingClient.newBuilder(this).setListener(this).build();
        mBillingClient.startConnection(new BillingClientStateListener() {
            @Override
            public void onBillingSetupFinished(@BillingClient.BillingResponse int billingResponseCode) {
                if (billingResponseCode == BillingClient.BillingResponse.OK) {
                    List skuList = new ArrayList<>();
                    skuList.add(ITEM_SKU_MORE_PUZZLE);
                    skuList.add(ITEM_SKU_REMOVE_AD);
                    SkuDetailsParams.Builder params = SkuDetailsParams.newBuilder();
                    params.setSkusList(skuList).setType(BillingClient.SkuType.INAPP);
                    mBillingClient.querySkuDetailsAsync(params.build(),
                            new SkuDetailsResponseListener() {
                                @Override
                                public void onSkuDetailsResponse(int responseCode, List skuDetailsList) {
                                    // Process the result.
                                    if (responseCode == BillingClient.BillingResponse.OK
                                            && skuDetailsList != null) {
                                        for (Object skuDetailsObject : skuDetailsList) {
                                            SkuDetails skuDetails = (SkuDetails) skuDetailsObject;
                                            String sku = skuDetails.getSku();
                                            String price = skuDetails.getPrice();
                                            if (ITEM_SKU_MORE_PUZZLE.equals(sku)) {
                                                btnMorePuzzle.setText(price);
                                            }
                                            else if(ITEM_SKU_REMOVE_AD.equals(sku)) {
                                                btnRemoveAd.setText(price);
                                            }
                                        }
                                    }
                                }
                            });
                }
            }

            @Override
            public void onBillingServiceDisconnected() {
                //Toast.makeText(getApplicationContext(),  getResources().getString(R.string.billing_connection_failure), Toast.LENGTH_SHORT);
            }
        });

        queryPurchases();
        queryPrefPurchases();
    }

Первый вопрос: почему здесь ответ на оплату «ОК», когда я уже купил товар. Я не хочу указывать текст кнопки как цену, которая устанавливается из этого ответа после покупки продукта.

Это моя реализация Onpurchase,

@Override
public void onPurchasesUpdated(int responseCode, @Nullable List<Purchase> purchases) {
    if (responseCode == BillingClient.BillingResponse.OK && purchases != null) {
        for (Purchase purchase : purchases) {
            if (purchase.getSku().equals(ITEM_SKU_REMOVE_AD)) {
                mSharedPreferences.edit().putBoolean("ad_free", true).commit();
                btnRemoveAd.setText("Done");
                btnRemoveAd.setEnabled(false);
            }
            else if(purchase.getSku().equals(ITEM_SKU_MORE_PUZZLE)){
                mSharedPreferences.edit().putBoolean("more_puzzle", true).commit();
                btnMorePuzzle.setText("Done");
                btnMorePuzzle.setEnabled(false);
            }
        }
    } else if (responseCode == BillingClient.BillingResponse.ITEM_ALREADY_OWNED ) {
        // I am getting response "Item already owned" here for item bought but purchase list here is empty 
        // so i can't do anything for  purchased item
    }
}

Второй вопрос, здесь я получаю ответ, что мой товар уже куплен, но список все еще пуст. Как это правильно реализовать?

Если кто-то уже купил товар, кнопка должна быть отключена. Еще одно сомнение заключается в том, что во время тестирования мне нужно ждать 1-2 часа, чтобы вернуть этот предмет из игрового магазина для повторного тестирования, или есть какой-либо другой метод.

Я слежу за этим кодом для реализации в приложении. https://github.com/patpatchpatrick/Streakr/


person Surabhi Choudhary    schedule 31.07.2019    source источник


Ответы (2)


Здесь нужно отметить только одно: вы запрашиваете только элементы INAPP типа SKU, а не SUBS. Я думаю, что на тип продукта, который вы предоставляете, распространяется подписка, а не внутриигровые продукты, которые обычно используются. Вот почему ваш запрос пуст.

person Vanshaj Daga    schedule 08.08.2019

Я обнаружил ошибку в вашем onPurchasesUpdated, условия установлены неправильно.
Должно получиться примерно следующее:

if(BillingResponse.OK && purchases != null) {
// update records
} else if(BillingResponse.ITEM_NOT_OWNED){ //this condition was missing
// update records if required or ask to buy
} else if(BillingResponse.ITEM_ALREADY_OWNED ){ // update records} 

и я также предлагаю обновить базу данных для этого.

person Viraj S    schedule 08.08.2019