С пользователя взимается плата, но он не получает доступа к платному контенту Xamarin Forms InAppBilling

#xamarin #xamarin.forms #in-app-purchase #in-app-billing

#xamarin #xamarin.forms #покупка в приложении #in-app-биллинг

Вопрос:

У меня есть приложение Xamarin Forms, в котором я использовал плагин InAppBilling для совершения покупок в приложении. Клиенты могут покупать расходные материалы из приложения, используя приложение.

  • Приложение вызывает CrossInAppBilling.Текущий.PurchaseAsync() для покупки товара в Apple in-app purchase.
  • После завершения покупки мы получаем информацию, возвращенную от Apple, как приобретенную, и отправляем еще один вызов в базу данных, чтобы сохранить запись о покупке в нашей базе данных. Функция addPayment() . Который, в свою очередь, предоставляет пользователю доступ к элементу, за который он заплатил.

Некоторые пользователи говорят, что они заплатили цену, но они никогда не получали доступа к контенту. Это ошибка в этом плагине или мне нужно что-то делать на моей стороне. Ниже приведена моя функция покупки товара:

 public async Task Purchase()
    {
        try
        {
            var productId = GetProductId(courseDetails.price);

            var connected = await CrossInAppBilling.Current.ConnectAsync();
            if (!connected)
            {
                //Couldn't connect to billing, could be offline, alert user
                Settings.Message = "Could not connect to billing right now, it could be offline. Try again later.";
                return;

            }
          
          var purchase = await CrossInAppBilling.Current.PurchaseAsync(productId, ItemType.InAppPurchase, "apppayload");

            // check if failed
            if (purchase == null)
            {
                // Not purchased, alert the user
                await home.DisplayAlert("Error", "Could not complete your purchase. Please try again.", "Ok");
            }
            // SUCCESSFULL, add into the database. 
            else if (purchase.State == PurchaseState.Purchased)
            {
                //Purchased, save this information
                var id = purchase.Id;
                string serializedObject = JsonConvert.SerializeObject(purchase);

                // send an API call to save record to DB
                var result = AddPaymentToDB(id, serializedObject).GetAwaiter().GetResult();
                
                await home.DisplayAlert("Success", "You have successfully purchased this course. Your payment ID is :"   purchase.Id, "Ok");
                IsReady = true;
                await LoadPaidContent(result.data);
            }
            isProcessingPaymentRequest = false;
        }
        catch (InAppBillingPurchaseException ex)
        {
            switch (ex.PurchaseError)
            {
                case PurchaseError.AppStoreUnavailable:
                    await home.DisplayAlert("Error", "Currently the app store seems to be unavailble. Try again later.", "Ok");
                    break;
                case PurchaseError.BillingUnavailable:
                    await home.DisplayAlert("Error", "Billing seems to be unavailable, please try again later.", "Ok");
                    break;
                case PurchaseError.PaymentInvalid:
                    await home.DisplayAlert("Error", "Payment seems to be invalid, please try again.", "Ok");
                    break;
                case PurchaseError.PaymentNotAllowed:
                    await home.DisplayAlert("Error", "Payment does not seem to be enabled/allowed, please try again.", "Ok");
                    break;

                case PurchaseError.UserCancelled:
                    break;

                default:
                    await home.DisplayAlert("Error", ex.Message, "Ok");
                    break;
            }
            isProcessingPaymentRequest = false;

        }
        catch (Exception ex)
        {
            isProcessingPaymentRequest = false;
        }
        finally
        {
            //Disconnect, it is okay if we never connected
            await CrossInAppBilling.Current.DisconnectAsync();
            isProcessingPaymentRequest = false;
        }
    }
  

Комментарии:

1. Добро пожаловать в SO! Привет, вы имеете в виду, что некоторые пользователи не ведут учет покупки в базе данных после завершения покупки?

2. Почему-то да. Он успешен более чем в 90% случаев. Но мне интересно, не завершается ли каким-либо образом сбой вызова API или что происходит, но я добавил проверку для сохранения информации о покупке в локальном хранилище, даже если вызов базы данных завершается неудачно. Таким образом, пользователь может загружать контент, открывая приложение позже, не оплачивая контент, потому что он уже заплатил. Это отлично работает в среде изолированной среды. Но в производстве почему-то для очень немногих людей это не удается.

3. Хорошо, если бы вы могли просматривать журналы сбоев, было бы полезно проверить, в чем проблема.