Проблема с покупкой в ​​приложении в 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
  • вам следует подождать немного