#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. Хорошо, если бы вы могли просматривать журналы сбоев, было бы полезно проверить, в чем проблема.