Средства за встроенные приложения Google Play всегда возвращаются через 3 дня в Xamarin.Android/.NET 8

Первоначально я создал приложение с помощью Xamarin.Android, которое использует NuGet/Lib, Plugin.InAppBilling. Недавно я перенес его на .NET 8, но заметил, что через пару дней после того, как пользователи заплатили, я потерял продажи, так как они были автоматически возвращены. Я прочитал на некоторых форумах, что мне нужно подтвердить платеж, поэтому я добавил код, который, по моему мнению, должен это сделать:

const string PRODUCT_ID = "my.product.com";
const string PRODUCT_ID_MORE_THAN_ONE= "my.other.product.com";
readonly Context context = Application.Context;

public async Task<bool> ShowDonate(bool isMoreThanOneAllowed = false)
{
    try
    {
        var connected = await CrossInAppBilling.Current.ConnectAsync();

        //Couldn't connect to billing, could be offline, alert user
        if (!connected)
        {
            Toast.MakeText(context, "No internet available", ToastLength.Short).Show();
            return false;
        }

        var productId = isMoreThanOneAllowed ? PRODUCT_ID_MORE_THAN_ONE : PRODUCT_ID;
        var purchase = await CrossInAppBilling.Current.PurchaseAsync(productId, ItemType.InAppPurchase);
        if (purchase == null)
        {
            //Not purchased, alert the user
            Toast.MakeText(context, "Didn't work", ToastLength.Short).Show();
            return false;
        }
        else
        {
            // Purchase was successful
            if ((bool)!purchase.IsAcknowledged)
            {
                if (isMoreThanOneAllowed)
                {
                    // For consumables, we need to consume the purchase
                    var consumeResult = await CrossInAppBilling.Current.ConsumePurchaseAsync(productId, purchase.PurchaseToken);
                    if (consumeResult)
                    {
                        // Consuming was successful
                        Toast.MakeText(context, "Thank you", ToastLength.Short).Show();
                        return true;
                    }
                    else
                    {
                        Toast.MakeText(context, "Didn't work", ToastLength.Short).Show();
                        return false;
                    }
                }
                else
                {
                    // For non-consumables, we finalize (acknowledge) the purchase
                    var acknowledgeResult = await CrossInAppBilling.Current.FinalizePurchaseAsync(purchase.PurchaseToken);
                    if (acknowledgeResult.First().Success)
                    {
                        Toast.MakeText(context, "Thank you", ToastLength.Short).Show();
                        return true;
                    }
                    else
                    {
                        Toast.MakeText(context, "Didn't work", ToastLength.Short).Show();
                        return false;
                    }
                }
            }
            else
            {
                // Purchase was already acknowledged
                Toast.MakeText(context, "Thank you", ToastLength.Short).Show();
                return true;
            }
        }
    }
    catch
    {
        // Handle exception
        Toast.MakeText(context, "Didn't work", ToastLength.Short).Show();
        return false;
    }
    finally
    {
        await CrossInAppBilling.Current.DisconnectAsync();
    }
}

Однако, похоже, это не работает. Я не уверен, что я делаю неправильно. Есть идеи, чего еще мне не хватает в моем коде?

0
0
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я обнаружил, что ошибка происходит здесь:

var consumeResult = await CrossInAppBilling.Current.ConsumePurchaseAsync(productId, purchase.PurchaseToken);

И здесь:

var acknowledgeResult = await CrossInAppBilling.Current.FinalizePurchaseAsync(purchase.PurchaseToken);

Мне не следовало использовать: purchase.PurchaseToken, но мне пришлось использовать: purchase.TransactionIdentifier. На этом всё, после этого всё стало работать как положено. Вы можете прочитать больше об этом здесь:

https://jamesmontemagno.github.io/InAppBillingPlugin/PurchaseNonConsumable.html

Другие вопросы по теме

Похожие вопросы

Как я могу сохранить настройки в Jetpack Compose, используя хранилище данных настроек?
Как удалить все записи в базе данных и полностью ее инициализировать, включая первичные ключи, при переустановке приложения в Android Room?
Исключение Apache SSHD из-за отсутствия определенного домашнего каталога пользователя
Использование сериализации Kotlin Kotlinx с дженериками
Получение API возвращает массив массивов вместо массива объектов с использованием Retrofit и Gson
Временная блокировка при использовании диспетчера учетных данных для входа в Google
Циклическая зависимость между следующими задачами после обновления плагина Gradle и плагина Firebase Crashlytics
Ошибка при открытии складного avd: для устройства Pixel_fold требуется функция складывания, но образ системы не поддерживает
Как прочитать штрих-код в приложении .Net MAUI с помощью сканера штрих-кода на устройстве Android (а не в камере)?
Проблема с getOnBackPressedDispatcher при обработке стека фрагментов