Unity3D. Xbox.
Implemented the purchase of a license for the game. In the Microsoft Store for desctop Windows it works fine (and when installed from the store and from under Visual Studio, including in the debug assembly), it does NOT work on XBox in dev and retail modes. The license (purchase) has been in the store for a week. For the experiment, I posted the assembly in open access (the day has not yet passed). I repeat: the purchase works without problems on the desktop, it does not work on the XBox. This code does not work (the check works, in both cases):
// Get product information from the app store
StoreProductResult productResult = await context.GetStoreProductForCurrentAppAsync();
if (productResult == null || productResult.Product == null)
//if (productResult.ExtendedError != null)
{
// User may be disconnected or there may be some other server failure
purchaseCallback?.Invoke(XBoxIAPStatus.NotGetStoreProduct, productResult.ExtendedError);
return;
}
Весь код:
public static async void PurchaseFullLicense(Action<XBoxIAPStatus, Exception> purchaseCallback, Action<XBoxIAPStatus> licChanged)
{
#if ENABLE_IL2CPP && UNITY_WSA_10_0
licenseChanged = licChanged;
if (context == null)
{
context = StoreContext.GetDefault();
// Подписываемся на событие изменения лицензии
context.OfflineLicensesChanged += context_OfflineLicensesChanged;
}
if (context == null)
{
purchaseCallback?.Invoke(XBoxIAPStatus.NoInitContext, null);
return;
}
// Получить информацию о продукте в магазине приложений
StoreProductResult productResult = await context.GetStoreProductForCurrentAppAsync();
if (productResult == null || productResult.Product == null)
//if (productResult.ExtendedError != null)
{
// Пользователь может быть отключен или может быть какой-то другой сбой сервера
purchaseCallback?.Invoke(XBoxIAPStatus.NotGetStoreProduct, productResult.ExtendedError);
return;
}
// Покупка полной лицензии ...
StoreAppLicense license = await context.GetAppLicenseAsync();
if (license != null && appLicense.IsActive && license.IsTrial)
{
// Пока демо версия
StorePurchaseResult result = await productResult.Product.RequestPurchaseAsync();
if (result.ExtendedError != null)
{
// Ошибка: print result.ExtendedError.Message
purchaseCallback?.Invoke(XBoxIAPStatus.NotRequestPurchase, null);
return;
}
// Покупка прошла. Результат:
switch (result.Status)
{
case StorePurchaseStatus.AlreadyPurchased:
// Вы уже купили это приложение и имеете полностью лицензированную версию
purchaseCallback?.Invoke(XBoxIAPStatus.AlreadyPurchased, null);
return;
case StorePurchaseStatus.Succeeded:
// Лицензия будет обновлена автоматически с помощью события StoreContext.OfflineLicensesChanged
purchaseCallback?.Invoke(XBoxIAPStatus.Succeeded, null);
return;
case StorePurchaseStatus.NotPurchased:
// Товар не был куплен, возможно, он был отменен
purchaseCallback?.Invoke(XBoxIAPStatus.NotPurchased, null);
return;
case StorePurchaseStatus.NetworkError:
// Сетевая ошибка
purchaseCallback?.Invoke(XBoxIAPStatus.NetworkError, null);
return;
case StorePurchaseStatus.ServerError:
// Ошибка сервера
purchaseCallback?.Invoke(XBoxIAPStatus.ServerError, null);
return;
default:
// Не определённая ошибка
purchaseCallback?.Invoke(XBoxIAPStatus.UnDefined, null);
return;
}
}
else
// Вы уже купили это приложение и имеете полностью лицензированную версию
purchaseCallback?.Invoke(XBoxIAPStatus.LicenseFull, null);
#else
purchaseCallback?.Invoke(XBoxIAPStatus.NotXBoxPlatform, null);
#endif
#pragma warning restore 1998
}


