Google Play Billing Library v4 проверка покупок в приложении

Я использую Google Play Billing Library v4 для покупок в приложений Android
(implementation "com.android.billingclient:billing:4.0.0")

Я не нашел никаких методов, которые могут проверить покупку продукта пользователем.
Если пользователь переустановил приложение, как мне проверить и восстановить все покупки в приложении?

Все найденные мной варианты предлагают мне использовать метод API Developer Google Play: Purchases.products.get
Всегда ли для этого требуется сервер?
Во всяком случае, мне это кажется слишком сложным для простой задачи.

Я использовал это решение (anjlab / android-inapp-billing-v3), но эта библиотека больше не поддерживается, и я решил разобраться, как работает биллинг от Google в последней версии.

Я не хотел бы использовать устаревший метод. queryPurchases.
Думаю, и этот метод мне не поможет queryPurchaseHistoryAsync, потому что onPurchaseHistoryResponse возвращает ["productId", purchaseToken", "purchaseTime", "quantity", "developerPayload"] причем последние два параметра могут отсутствовать или иметь значение null (Это я проверил в своем приложений)

Вопрос: Как мне просто реализовать проверку всех моих товаров (3ш) на наличие оплаты пользователем в приложении. Если пользователь переустановил приложение или сменил телефон. Мне нужно восстановить покупки пользователю.

Java


Ответы (1 шт):

Автор решения: dubok79

При инициализации клиента передается слушатель purchasesUpdatedListener

billingClient = BillingClient.newBuilder(this)
            .setListener(purchasesUpdatedListener)
            .enablePendingPurchases()
            .build();

Ну и сам слушатель

private final PurchasesUpdatedListener purchasesUpdatedListener = new PurchasesUpdatedListener() {
    @Override
    public void onPurchasesUpdated(@NonNull BillingResult billingResult, @Nullable List<Purchase> purchases) {
        if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.OK
                && purchases != null) {
            //обработка покупки
        } else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.ITEM_ALREADY_OWNED) {
            //если покупка уже была сделана ранее
            //получаем список ранее сделанных покупок
            billingClient.queryPurchasesAsync(BillingClient.SkuType.INAPP,
                    listenerPurchasesResponsAlreadyOwned);
        } else if (billingResult.getResponseCode() == BillingClient.BillingResponseCode.USER_CANCELED) {
            //здесь можно написать, что мне очень жаль, что покупка была отменена
        } else {
        }
    }
};
→ Ссылка