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


Включение покупки потребляемых продуктов в приложении

Предложить потребляемые продукты в приложении — элементы, которые можно приобрести, использовать и приобрести снова— через платформу магазина для предоставления клиентам возможности покупки, которая является надежной и надежной. Это особенно полезно для таких вещей, как валюта в игре (золото, монеты и т. д.), которые можно приобрести, а затем использовать для приобретения конкретных power ups.

Внимание

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

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

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

Шаг 1. Создание запроса на покупку

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

В следующем примере показан запрос на покупку продукта в приложении. Вы заметите примечания кода, указывающие, когда приложение должно выполнять локальное выполнение используемого продукта в приложении для двух разных сценариев— когда запрос выполнен успешно, и когда запрос не выполнен из-за незаполненной покупки этого же продукта.

PurchaseResults purchaseResults = await CurrentAppSimulator.RequestProductPurchaseAsync("product1");
switch (purchaseResults.Status)
{
    case ProductPurchaseStatus.Succeeded:
        product1TempTransactionId = purchaseResults.TransactionId;

        // 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:
        product1TempTransactionId = purchaseResults.TransactionId;

        // 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;
}

Шаг 2. Отслеживание локального выполнения потребляемого

При предоставлении клиенту доступа к используемому продукту в приложении важно отслеживать, с каким продуктом выполняется продукт (productId), и с какой транзакцией связана транзакция (transactionId).

Внимание

Ваше приложение отвечает за точное выполнение отчетов в Магазине. Этот шаг необходим для поддержания справедливой и надежной покупки для ваших клиентов.

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

private void GrantFeatureLocally(string productId, Guid transactionId)
{
    if (!grantedConsumableTransactionIds.ContainsKey(productId))
    {
        grantedConsumableTransactionIds.Add(productId, new List<Guid>());
    }
    grantedConsumableTransactionIds[productId].Add(transactionId);

    // Grant the user their content. You will likely increase some kind of gold/coins/some other asset count.
}

В следующем примере показано, как использовать массив из предыдущего примера для доступа к парам идентификаторов и идентификаторов продукта, которые позже используются при выполнении отчетов в Store.

Внимание

Независимо от методологии, которую ваше приложение использует для отслеживания и подтверждения выполнения, ваше приложение должно продемонстрировать должное усердие, чтобы гарантировать, что ваши клиенты не взимает плату за элементы, которые они не получили.

private Boolean IsLocallyFulfilled(string productId, Guid transactionId)
{
    return grantedConsumableTransactionIds.ContainsKey(productId) &&
        grantedConsumableTransactionIds[productId].Contains(transactionId);
}

Шаг 3. Создание отчетов о выполнении продукта в Магазине

После завершения локального выполнения приложение должно выполнить вызов ReportConsumableFulfillmentAsync , включающий идентификатор продукта и транзакцию покупки продукта.

Внимание

Не удалось сообщить о выполненных продуктах в приложении в Магазине, что приведет к тому, что пользователь не сможет приобрести этот продукт еще раз, пока не будет сообщено о выполнении предыдущей покупки.

FulfillmentResult result = await CurrentAppSimulator.ReportConsumableFulfillmentAsync(
    "product2", product2TempTransactionId);

Шаг 4. Определение невыполненных покупок

Ваше приложение может использовать метод GetUnfulfilledConsumablesAsync , чтобы проверить наличие неподполненных потребляемых продуктов в приложении в любое время. Этот метод следует вызывать регулярно, чтобы проверить наличие незаполненных потребляемых ресурсов, которые существуют из-за непреднамеренных событий приложения, таких как прерывание сетевого подключения или завершение работы приложения.

В следующем примере показано, как getUnfulfilledConsumablesAsync можно использовать для перечисления неподполненных расходных материалов и способов итерации приложения с помощью этого списка для выполнения локального выполнения.

private async void GetUnfulfilledConsumables()
{
    products = await CurrentApp.GetUnfulfilledConsumablesAsync();

    foreach (UnfulfilledConsumable product in products)
    {
        logMessage += "\nProduct Id: " + product.ProductId + " Transaction Id: " + product.TransactionId;
        // This is where you would pass the product ID and transaction ID to
        // currentAppSimulator.reportConsumableFulfillment to indicate local fulfillment to the Windows Store.
    }
}