Первоначально я создал приложение с помощью 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();
}
}
Однако, похоже, это не работает. Я не уверен, что я делаю неправильно. Есть идеи, чего еще мне не хватает в моем коде?
Я обнаружил, что ошибка происходит здесь:
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