Поделиться через


Управление большим каталогом продуктов в приложении

Если ваше приложение предлагает большой каталог продуктов в приложении, вы можете при необходимости следовать процессу, описанному в этом разделе, чтобы помочь управлять каталогом. В выпусках до Windows 10 магазин имеет ограничение в 200 продуктов на учетную запись разработчика, и процесс, описанный в этом разделе, можно использовать для обхода этого ограничения. Начиная с Windows 10, Магазин не имеет ограничения на количество списков продуктов на учетную запись разработчика, и процесс, описанный в этой статье, больше не требуется.

Внимание

В этой статье показано, как использовать элементы пространства имен Windows.ApplicationModel.Store . Это пространство имен больше не обновляется с новыми функциями, и мы рекомендуем вместо этого использовать пространство имен Windows.Services.Store . Пространство имен Windows.Services.Store поддерживает последние типы надстроек, такие как управляемые магазином надстройки и подписки, и предназначены для обеспечения совместимости с будущими типами продуктов и функций, поддерживаемых Центром партнеров и Магазином. Пространство имен Windows.Services.Store было введено в Windows 10 версии 1607, и его можно использовать только в проектах, предназначенных для Windows 10 Anniversary Edition (10.0; Сборка 14393) или более поздняя версия в Visual Studio. Дополнительные сведения см. в разделе "Покупки в приложении" и пробные версии.

Чтобы включить эту возможность, вы создадите несколько записей продуктов для определенных ценовых категорий, каждый из которых может представлять сотни продуктов в каталоге. Используйте перегрузку метода RequestProductPurchaseAsync , указывающую определенное приложением предложение, связанное с продуктом из приложения, перечисленным в Магазине. Помимо указания связи предложения и продукта во время вызова, приложение также должно передать объект ProductPurchaseDisplayProperties , содержащий сведения о предложении большого каталога. Если эти сведения не указаны, вместо этого будут использоваться сведения о указанном продукте.

Магазин будет использовать только предложение из запроса на покупку в результирующей покупкеResults. Этот процесс не изменяет сведения, которые изначально предоставляются при перечислении продукта в приложении в Магазине.

Необходимые компоненты

  • В этом разделе рассматривается поддержка Магазина для представления нескольких предложений в приложении с помощью одного продукта в приложении, указанного в Магазине. Если вы не знакомы с покупками в приложении, ознакомьтесь со сведениями о лицензии и правильном перечислении покупки в приложении в Магазине.
  • При первом коде и тестировании новых предложений в приложении необходимо использовать объект CurrentAppSimulator вместо объекта CurrentAppApp . Таким образом вы можете проверить логику лицензии с помощью имитированных вызовов к серверу лицензирования вместо вызова динамического сервера. Для этого необходимо настроить файл с именем WindowsStoreProxy.xml в %userprofile%\AppData\local\packages\<имя>_пакета\LocalState\Microsoft\Windows Store\ApiData. Симулятор Microsoft Visual Studio создает этот файл при первом запуске приложения или также можно загрузить пользовательский в среде выполнения. Дополнительные сведения см. в разделе "Использование файла WindowsStoreProxy.xml с CurrentAppSimulator".
  • В этом разделе также приводятся примеры кода, предоставляемые в примере Store. Этот пример — отличный способ получить практический опыт работы с различными вариантами монетизации, предоставляемыми для приложений универсальная платформа Windows (UWP).

Создание запроса на покупку для продукта в приложении

Запрос на покупку определенного продукта в большом каталоге обрабатывается так же, как и любой другой запрос на покупку в приложении. Когда приложение вызывает новую перегрузку метода RequestProductPurchaseAsync, приложение предоставляет как ПредложениеId, так и объект ProductPurchaseDisplayProperties, заполненный именем продукта в приложении.

string offerId = "1234";
string displayPropertiesName = "MusicOffer1";
var displayProperties = new ProductPurchaseDisplayProperties(displayPropertiesName);

try
{
    PurchaseResults purchaseResults = await CurrentAppSimulator.RequestProductPurchaseAsync(
        "product1", offerId, displayProperties);
    switch (purchaseResults.Status)
    {
        case ProductPurchaseStatus.Succeeded:
            // Grant the user their purchase here, and then pass the product ID and transaction ID
            // to currentAppSimulator.reportConsumableFulfillment to indicate local fulfillment to
            // the Windows Store.
            break;
        case ProductPurchaseStatus.NotFulfilled:
            // First check for unfulfilled purchases and grant any unfulfilled purchases from an
            // earlier transaction. Once products are fulfilled pass the product ID and transaction
            // ID to currentAppSimulator.reportConsumableFulfillment to indicate local fulfillment
            // to the Windows Store.
            break;
        case ProductPurchaseStatus.NotPurchased:
            // Notify user that the purchase was not completed due to cancellation or error.
            break;
    }
}
catch (Exception)
{
    // Notify the user of the purchase error.
}

Отчет о выполнении предложения в приложении

Приложению потребуется сообщить о выполнении продукта в Магазине, как только предложение было выполнено локально. В сценарии большого каталога, если ваше приложение не сообщает о выполнении предложения, пользователь не сможет приобрести какие-либо предложения в приложении, используя тот же список продуктов Магазина.

Как упоминалось ранее, магазин использует только предоставленные сведения о предложении для заполнения PurchaseResults и не создает постоянную связь между крупным предложением каталога и списком продуктов Store. В результате необходимо отслеживать права пользователей на продукты и предоставлять контекст для конкретного продукта (например, имя приобретаемого элемента или сведения об этом) пользователю за пределами операции RequestProductPurchaseAsync .

Следующий код демонстрирует вызов выполнения и шаблон обмена сообщениями пользовательского интерфейса, в котором вставляется определенная информация о предложении. В отсутствие конкретных сведений о продукте в примере используются сведения из product ListingInformation.

string offerId = "1234";
product1ListingName = product1.Name;
string displayPropertiesName = "MusicOffer1";

if (String.IsNullOrEmpty(displayPropertiesName))
{
    displayPropertiesName = product1ListingName;
}
var offerIdMsg = " with offer id " + offerId;
if (String.IsNullOrEmpty(offerId))
{
    offerIdMsg = " with no offer id";
}

FulfillmentResult result = await CurrentAppSimulator.ReportConsumableFulfillmentAsync(productId, transactionId);
switch (result)
{
    case FulfillmentResult.Succeeded:
        Log("You bought and fulfilled " + displayPropertiesName + offerIdMsg);
        break;
    case FulfillmentResult.NothingToFulfill:
        Log("There is no purchased product 1 to fulfill.");
        break;
    case FulfillmentResult.PurchasePending:
        Log("You bought product 1. The purchase is pending so we cannot fulfill the product.");
        break;
    case FulfillmentResult.PurchaseReverted:
        Log("You bought product 1. But your purchase has been reverted.");
        // Since the user' s purchase was revoked, they got their money back.
        // You may want to revoke the user' s access to the consumable content that was granted.
        break;
    case FulfillmentResult.ServerError:
        Log("You bought product 1. There was an error when fulfilling.");
        break;
}