Проверка покупок в приложении после переустановки или удаления пользовательских настроек

Я реализовал биллинг в приложении из этого руководства. . Предметом покупки является возможность установить собственный фон. Это прекрасно работает, но когда я удаляю и переустанавливаю приложение (или очищаю пользовательские настройки), мне трудно понять, как проверить, что кто-то уже купил элемент в приложении.

    public void buySelected() {

    if (backgroundColorsPurchased == true) {
        this.colorChangeDialog(); //if user has already purchased, just call the dialog instead of re-buying.
        //if the person has cleared their prefs, they'll have to be online to re-verify that they did indeed buy the item.

    }else{
        if(BillingHelper.isBillingSupported()){
            BillingHelper.requestPurchase(mContext, "background.colors");
            BillingHelper.setCompletedHandler(mTransactionHandler);

        } else {
            Log.i(TAG,"Can't purchase on this device");

        }
    }
}

Затем у меня есть обработчик:

    public Handler mTransactionHandler = new Handler(){
    public void handleMessage(android.os.Message msg) {
        Log.i(TAG, "Transaction complete");
        Log.i(TAG, "Transaction status: "+BillingHelper.latestPurchase.purchaseState);
        Log.i(TAG, "Item purchased is: "+BillingHelper.latestPurchase.productId);

        if(BillingHelper.latestPurchase.isPurchased()){
        //this is where we show the stuff that the person purchased. In this case, the dialog to change the background colour.
            backgroundColorsPurchased = true; //just setting this to true so that the next time somebody clicks the donate button it'll just open the dialog.

            //call the change background dialog
            colorChangeDialog();

        }else{
            //fail
            Toast.makeText(getApplicationContext(), "Fail", Toast.LENGTH_SHORT).show();

        }
    }

 };

Как я могу убедиться, что товар был куплен ранее? Рынок просто постоянно выдает диалоговое окно, в котором говорится: «Вы уже приобрели этот предмет или покупка еще не завершена». Когда я пытаюсь использовать что-то вроде if(BillingHelper.latestPurchase.isPurchased()){, я получаю принудительное закрытие, если это не внутри обработчика.


person ajwest    schedule 13.08.2011    source источник


Ответы (3)


Вам нужно вызвать restoreTransactions. Взгляните на пример по умолчанию, который Android предоставил для In App Billing для получения дополнительной информации.

person PravinCG    schedule 13.08.2011
comment
Да, я пролил через это, но это очень сложно. У меня есть 1 предмет, который мне просто нужно подтвердить, был ли он куплен или нет, и, похоже, нет четкого способа сделать это. :( - person ajwest; 13.08.2011
comment
BillingHelper.java имеет защищенный метод static void restoreTransactionInformation в упомянутой вами ссылке. Вы можете использовать это, чтобы восстановить предыдущую транзакцию. Всегда рекомендуется запускать его один раз после установки приложения. - person PravinCG; 13.08.2011
comment
О, хорошо, похоже, мне нужно вызвать BillingHelper.getPurchaseInformation(notifyIds);, где notifyIds — массив строк. Но откуда мне взять этот массив строк? - person ajwest; 13.08.2011
comment
BillingHelper.restoreTransactionInformation(BillingSecurity.generateNonce()); Работает, но рынок почему-то принудительно закрывается. Отпишусь, если разберусь. Спасибо за вашу помощь. - person ajwest; 13.08.2011
comment
Если это помогло вам, вы можете выбрать ответ или проголосовать за него. В идеале сбой был бы для некоторого исключения нулевого указателя, если вы не защищаете должным образом. - person PravinCG; 14.08.2011
comment
Вы с этим чего-нибудь добились? Я застрял, чтобы решить это, так что не могли бы вы опубликовать, что вы сделали? - person Hippyjim; 12.03.2012

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

person Nikolay Elenkov    schedule 13.08.2011

вы можете просто использовать логин и базу данных Fire-base в реальном времени с полем premium_enabled - true/false (это поможет, если пользователь перейдет на другой мобильный телефон со старым идентификатором Google для Play-store)

шаг за шагом

добавьте логин Google в свое приложение. сделайте запись пользователя в fire-base user_id/email_id и поле premium_enabled и сохраните в нем данные. (вы можете добавить поля в соответствии с вашими требованиями)

если пользователь купил, сделайте запись premium_enabled - true, а также используйте общие настройки для проверки в автономном режиме

person Dhaval Jotaniya    schedule 12.02.2018