Проблема с покупкой в приложении в Windows 10 UWP
Я пытаюсь включить элемент покупки в приложении в своем приложении (уже в хранилище Windows 10), но при попытке купить этот элемент всегда получаю то же сообщение об ошибке:
![This in-App Purchase item is no longer available in MyAppName]()
Этот элемент покупки в приложении больше не доступен в MyAppName
Код довольно прост и только то, что рекомендуют документы:
var itemName = "app.advanced_items.full";
if (CurrentApp.LicenseInformation.ProductLicenses[itemName].IsActive) {
return true;
}
var results = await CurrentApp.RequestProductPurchaseAsync(itemName);
if (results.Status == ProductPurchaseStatus.Succeeded ||
results.Status == ProductPurchaseStatus.AlreadyPurchased) {
return true;
} else {
return false;
}
Дополнительная информация:
- Я создал и отправил элемент in-app в хранилище, прежде чем создавать пакет, как сказано в документации.
- Название элемента одинаково как в хранилище, так и в приложении (
itemName
для кода)
- Я попробовал это перед отправкой в магазин
- Я попробовал это после отправки в магазин (Мое приложение в настоящее время нарушено там! - невозможно купить товар)
Я подозреваю, что проблема может быть связана со следующим:
- Отображаемое имя приложения (на
Package.appxmanifest
) - это не одно и то же имя приложения в хранилище (имя, которое я хотел, недоступно, поэтому я сделал это дольше, но приложение после установки отображает исходное имя). Это более короткое имя - это сообщение об ошибке...
Я изменил "отображаемое имя" на полное имя приложения, но ошибка была такой же. Я не знаю, может ли его отправить в магазин, возможно, это изменит (я и не хочу развернуть другую ошибку для проверки этой теории)
Дополнительно:
Единственные ресурсы, которые я нашел в Интернете по этой проблеме, были бесполезны и связаны с Windows 8: ссылка
Предложения?
Ответы
Ответ 1
Спустя 2 месяца, разговаривая с поддержкой Microsoft, они, наконец, исправили что-то на своей стороне, и мой IAP начал работать.
Я считаю, что исправление было глобальным, но если ваш IAP все еще не работает, свяжитесь с ним, чтобы опубликовать его.
Ниже выдержки из письма, которое они мне прислали:
Мы опубликовали публикацию для ваших IAP в этом приложении. Это должно исправьте ситуацию, как только процесс завершится. Вы можете захотеть периодически проверять в течение следующих нескольких часов, чтобы узнать, можете ли вы чтобы подтвердить, что исправление сработало для вас. Дайте мне знать, что вы видите.
Ответ 2
Пожалуйста, свяжитесь с продуктом IAP. Я думаю, что тот, который вы упомянули в своем коде, отличается от того, который указан в вашем магазине.
Если это то же самое, я рекомендую использовать метод LoadListingInformationAsync, который возвращает список IAP и затем выбирает требуемый IAP из этого списка. Если существует несоответствие имени, вы не сможете получить этот IAP. Таким образом, мы сможем найти его из-за проблемы с именами.
Я также добавил пример кода для этого. Попробуйте.
try
{
var listing = await CurrentApp.LoadListingInformationAsync();
var iap = listing.ProductListings.FirstOrDefault(p => p.Value.ProductId == "removeads");
receipt = await CurrentApp.RequestProductPurchaseAsync(iap.Value.ProductId, true);
if (CurrentApp.LicenseInformation.ProductLicenses[iap.Value.ProductId].IsActive)
{
CurrentApp.ReportProductFulfillment(iap.Value.ProductId);
//your code after purchase is successful
}
}
catch (Exception ex)
{
//exception
}
Ответ 3
Я считаю, что проблема заключается в том, что вам нужно различать тестирование и производство. Вы не можете использовать режим производства, если вы не публикуетесь в магазине. См. CurrentApp и CurrentAppSimulator.
На странице CurrentAppSimiulator
:
Примечание
Пока приложение не будет указано в хранилище Windows, объект CurrentApp не будет работать в приложении. Используйте CurrentAppSimulator для тестирования лицензий на приложение и продуктов в приложении при разработке вашего приложения. После тестирования приложения и перед отправкой в хранилище Windows вы должны заменить экземпляры CurrentAppSimulator на CurrentApp. Ваше приложение не сможет выполнить сертификацию, если использует CurrentAppSimulator.
Вот как я решаю это в своем приложении С#define, который я изменяю для тестирования/производства, и прокси-класс, который переключается между CurrentApp и CurrentAppSimulator, чтобы сделать мой другой код намного проще на глазах.
App.xaml.cs, App()
//
// configure in-app purchasing
//
#if false
#warning WARNING: You are using CurrentAppProxy in TEST MODE!
CurrentAppProxy.SetTestMode(true); // true for test, false for production
#else
CurrentAppProxy.SetTestMode(false); // true for test, false for production
CurrentAppProxy.cs
public static class CurrentAppProxy
{
static bool? testmode = null;
public static async void SetTestMode(bool mode)
{
testmode = mode;
if (mode)
{
var file = await Package.Current.InstalledLocation.GetFileAsync("WindowsStoreProxy.xml");
if (file != null)
{
await CurrentAppSimulator.ReloadSimulatorAsync(file);
}
}
}
public static LicenseInformation LicenseInformation
{
get
{
if (testmode == null) throw new NotSupportedException();
else if (testmode.Value) return CurrentAppSimulator.LicenseInformation;
else return CurrentApp.LicenseInformation;
}
}
public static IAsyncOperation<IReadOnlyList<UnfulfilledConsumable>> GetUnfulfilledConsumablesAsync()
{
if (testmode == null) throw new NotSupportedException();
else if (testmode.Value) return CurrentAppSimulator.GetUnfulfilledConsumablesAsync();
else return CurrentApp.GetUnfulfilledConsumablesAsync();
}
public static IAsyncOperation<ListingInformation> LoadListingInformationAsync()
{
if (testmode == null) throw new NotSupportedException();
else if (testmode.Value) return CurrentAppSimulator.LoadListingInformationAsync();
else return CurrentApp.LoadListingInformationAsync();
}
public static IAsyncOperation<FulfillmentResult> ReportConsumableFulfillmentAsync(string productId, Guid transactionId)
{
if (testmode == null) throw new NotSupportedException();
else if (testmode.Value) return CurrentAppSimulator.ReportConsumableFulfillmentAsync(productId, transactionId);
else return CurrentApp.ReportConsumableFulfillmentAsync(productId, transactionId);
}
public static IAsyncOperation<PurchaseResults> RequestProductPurchaseAsync(string productId)
{
if (testmode == null) throw new NotSupportedException();
else if (testmode.Value) return CurrentAppSimulator.RequestProductPurchaseAsync(productId);
else return CurrentApp.RequestProductPurchaseAsync(productId);
}
}
Использование в моем приложении...
private async Task RefreshInAppOffers()
{
// in-app offers
List<KeyValuePair<string, ProductListing>> products = null;
UnfulfilledConsumable unfulfilledConsumable = null;
InAppOffers.Children.Clear();
try
{
var listinginfo = await CurrentAppProxy.LoadListingInformationAsync();
products = listinginfo.ProductListings.ToList();
products.Sort((p1, p2) => p1.Value.FormattedPrice.CompareTo(p2.Value.FormattedPrice));
CurrentAppProxy здесь ключ. Если он работает с симулятором, он должен работать с вашими производственными элементами. Вам просто нужно иметь все остальные части для всех различных условий. Некоторое тестирование проще всего сделать в отладчике.
Ответ 4
Я попытался связаться с Microsoft по этому вопросу, и они попросили меня сделать IAP недоступным, а затем снова сделать его доступным. Я должен сказать, что это не решило мою проблему, но если вы хотите попробовать, выполните следующие действия:
- Создайте обновление для IAP
- В разделе "Распространение и видимость" IAP недоступен для покупки
- Отправить обновление
- Подождите, пока обновление опубликовано.
- Создать новое обновление для IAP
- Установить распределение и видимость обратно к Доступно для покупки
- Отправить обновление
- Как только это обновление опубликовано, повторите проверку IAP
После этого они сказали мне попробовать сделать все приложение недоступным для всех стран и опубликовать его. Затем сделайте обратное. Нет успеха ни...
Ответ 5
У меня такая же проблема. В моей ситуации решение состоит в том, чтобы добавить все описания языка в IAP, а затем оно отлично работает
Ответ 6
У меня была аналогичная проблема с моим новым приложением UWP, "Midi Player". IAP был доступен для покупки на WP 8.1 сразу после сертификации и публикации, но показывает ту же ошибку на платформе W10M (Windows 10 Mobile) (я считаю, что все приложения Windows 10 UWP имеют тот же магазин).
Я открыл проблему с Microsoft, но они не могут мне помочь. К счастью, проблема сейчас ушла:) Что я сделал:
- опубликованная первоначальная версия приложения.
- создан IAP
- проверено IAP (работает на WP8.1, не работает на W10M)
- Я обнаружил, что мой файл Package.appxmanifest был слегка изменен (строка mp: PhoneIdentity PhoneProductId = "7f32ab79-xxx-xxx-aff3-ce228745b36f" PhonePublisherId = "00000000-0000- 0000-0000-000000000000" ) после публикации
- Я изменил версию (младший номер) и отправил новую версию с измененным Package.appxmanifest
- Сегодня я проверил IAP на W10M Lumia 950, и он работает.
Итак, мой вывод:
- вам нужно повторно опубликовать приложение после, создав IAP
- вам следует подождать немного