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


Включение надстроек подписки для приложения

Ваше приложение на универсальной платформе Windows (UWP) может предлагать вашим клиентам покупки подписок и дополнений. Вы можете использовать подписки для продажи цифровых продуктов в приложении (например, функций приложений или цифрового содержимого) с автоматически повторяющимися периодами выставления счетов.

Замечание

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

Основные сведения о функциях

Надстройки подписки для приложений UWP поддерживают следующие функции:

  • Вы можете выбрать из периодов подписки 1 месяц, 3 месяца, 6 месяцев, 1 год или 2 года.
  • Вы можете добавить бесплатные пробные периоды 1 недели или 1 месяца в подписку.
  • Пакет SDK для Windows предоставляет API-интерфейсы, которые вы можете использовать в своем приложении, чтобы получить информацию о доступных надстройках подписки и позволить покупку такой надстройки. Кроме того, мы предоставляем ИНТЕРФЕЙСы REST API, которые можно вызывать из служб, чтобы управлять подписками для пользователя.
  • Вы можете просматривать аналитические отчеты, предоставляющие количество приобретений подписки, активных подписчиков и отмененных подписок в течение заданного периода времени.
  • Клиенты могут управлять подпиской на https://account.microsoft.com/services странице своей учетной записи Майкрософт. Клиенты могут использовать эту страницу для просмотра всех приобретенных подписок, отмены подписки и изменения формы оплаты, связанной с подпиской.

Шаги по активации подписочного дополнения для вашего приложения

Чтобы включить покупку дополнений подписки в приложении, выполните следующие действия.

  1. создать отправку надстройки для вашей подписки в Центре партнеров и опубликовать её. При выполнении процесса подачи дополнений обратите особое внимание на следующие свойства:

    • тип продукта: убедитесь, что выбран подписки.

    • Период подписки: выберите повторяющийся период выставления счетов для подписки. Вы не можете изменить период подписки после публикации надстройки.

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

    • Пробный период. Попробуйте выбрать 1 неделю или 1 месяц пробной версии для подписки, чтобы пользователи могли попробовать содержимое подписки перед покупкой. Вы не можете изменить или удалить пробный период после публикации надстройки подписки.

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

      Замечание

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

    • видимости. Если вы создаете тестовую надстройку, которая будет использоваться только для тестирования возможностей покупки в приложении для вашей подписки, рекомендуется выбрать один из Скрытый в магазине вариантов. В противном случае можно выбрать оптимальный вариант видимости для вашего сценария.

    • Цены: выберите цену вашей подписки в этом разделе. После публикации дополнения нельзя повысить цену подписки. Тем не менее, вы можете снизить цену позже.

      Это важно

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

  2. В вашем приложении используйте API в пространстве имен Windows.Services.Store, чтобы определить, приобрел ли текущий пользователь ваше дополнительное подписочное расширение, а затем предложите его пользователю для покупки в приложении. Дополнительные сведения см. в примерах кода в этой статье.

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

  4. Создайте и опубликуйте отправку приложения, содержащую обновленный пакет приложения, включая тестируемый код. Дополнительные сведения см. в подача приложений.

Примеры кода

В примерах кода в этом разделе показано, как использовать API в пространстве имен Windows.Services.Store , чтобы получить сведения о надстройках подписки для текущего приложения и запросить покупку надстройки подписки от имени текущего пользователя.

В этих примерах имеются следующие предварительные требования:

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

Код в этих примерах предполагает:

  • В файле кода используются инструкции для пространств имен Windows.Services.Store и System.Threading.Tasks.
  • Приложение — это однопользовательское приложение, которое запускается только в контексте пользователя, запускающего приложение. Дополнительные сведения см. в разделе "Покупки в приложении" и пробные версии.

Замечание

Если у вас есть классическое приложение, использующее классический мост, может потребоваться добавить дополнительный код, не показанный в этих примерах, чтобы настроить объект StoreContext. Дополнительные сведения см. в статье Использование класса StoreContext в классическом приложении, которое использует мост для настольных компьютеров.

Приобретение дополнения к подписке

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

  1. Сначала код определяет, имеет ли клиент активную лицензию для подписки. Если у клиента уже есть активная лицензия, ваш код должен разблокировать функции подписки по мере необходимости (так как это специфично для вашего приложения, это указано в комментарии к примеру).
  2. Затем код получает объект StoreProduct , представляющий подписку, которую вы хотите приобрести от имени клиента. В коде предполагается, что вы уже знаете идентификатор магазина надстройки подписки, которую вы хотите приобрести, и что вы назначили это значение переменной subscriptionStoreId.
  3. Затем код определяет, доступна ли пробная версия для подписки. Кроме того, приложение может использовать эти сведения для отображения сведений о доступной пробной версии или полной подписке клиенту.
  4. Наконец, код вызывает метод RequestPurchaseAsync , чтобы запросить покупку подписки. Если пробная версия доступна для подписки, пробная версия будет предложена клиенту для покупки. В противном случае для покупки будет предложена полная подписка.
private StoreContext context = null;
StoreProduct subscriptionStoreProduct;

// Assign this variable to the Store ID of your subscription add-on.
private string subscriptionStoreId = "";  

// This is the entry point method for the example.
public async Task SetupSubscriptionInfoAsync()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
        // If your app is a desktop app that uses the Desktop Bridge, you
        // may need additional code to configure the StoreContext object.
        // For more info, see https://aka.ms/storecontext-for-desktop.
    }

    bool userOwnsSubscription = await CheckIfUserHasSubscriptionAsync();
    if (userOwnsSubscription)
    {
        // Unlock all the subscription add-on features here.
        return;
    }

    // Get the StoreProduct that represents the subscription add-on.
    subscriptionStoreProduct = await GetSubscriptionProductAsync();
    if (subscriptionStoreProduct == null)
    {
        return;
    }

    // Check if the first SKU is a trial and notify the customer that a trial is available.
    // If a trial is available, the Skus array will always have 2 purchasable SKUs and the
    // first one is the trial. Otherwise, this array will only have one SKU.
    StoreSku sku = subscriptionStoreProduct.Skus[0];
    if (sku.SubscriptionInfo.HasTrialPeriod)
    {
        // You can display the subscription trial info to the customer here. You can use 
        // sku.SubscriptionInfo.TrialPeriod and sku.SubscriptionInfo.TrialPeriodUnit 
        // to get the trial details.
    }
    else
    {
        // You can display the subscription purchase info to the customer here. You can use 
        // sku.SubscriptionInfo.BillingPeriod and sku.SubscriptionInfo.BillingPeriodUnit
        // to provide the renewal details.
    }

    // Prompt the customer to purchase the subscription.
    await PromptUserToPurchaseAsync();
}

private async Task<bool> CheckIfUserHasSubscriptionAsync()
{
    StoreAppLicense appLicense = await context.GetAppLicenseAsync();

    // Check if the customer has the rights to the subscription.
    foreach (var addOnLicense in appLicense.AddOnLicenses)
    {
        StoreLicense license = addOnLicense.Value;
        if (license.SkuStoreId.StartsWith(subscriptionStoreId))
        {
            if (license.IsActive)
            {
                // The expiration date is available in the license.ExpirationDate property.
                return true;
            }
        }
    }

    // The customer does not have a license to the subscription.
    return false;
}

private async Task<StoreProduct> GetSubscriptionProductAsync()
{
    // Load the sellable add-ons for this app and check if the trial is still 
    // available for this customer. If they previously acquired a trial they won't 
    // be able to get a trial again, and the StoreProduct.Skus property will 
    // only contain one SKU.
    StoreProductQueryResult result =
        await context.GetAssociatedStoreProductsAsync(new string[] { "Durable" });

    if (result.ExtendedError != null)
    {
        System.Diagnostics.Debug.WriteLine("Something went wrong while getting the add-ons. " +
            "ExtendedError:" + result.ExtendedError);
        return null;
    }

    // Look for the product that represents the subscription.
    foreach (var item in result.Products)
    {
        StoreProduct product = item.Value;
        if (product.StoreId == subscriptionStoreId)
        {
            return product;
        }
    }

    System.Diagnostics.Debug.WriteLine("The subscription was not found.");
    return null;
}

private async Task PromptUserToPurchaseAsync()
{
    // Request a purchase of the subscription product. If a trial is available it will be offered 
    // to the customer. Otherwise, the non-trial SKU will be offered.
    StorePurchaseResult result = await subscriptionStoreProduct.RequestPurchaseAsync();

    // Capture the error message for the operation, if any.
    string extendedError = string.Empty;
    if (result.ExtendedError != null)
    {
        extendedError = result.ExtendedError.Message;
    }

    switch (result.Status)
    {
        case StorePurchaseStatus.Succeeded:
            // Show a UI to acknowledge that the customer has purchased your subscription 
            // and unlock the features of the subscription. 
            break;

        case StorePurchaseStatus.NotPurchased:
            System.Diagnostics.Debug.WriteLine("The purchase did not complete. " +
                "The customer may have cancelled the purchase. ExtendedError: " + extendedError);
            break;

        case StorePurchaseStatus.ServerError:
        case StorePurchaseStatus.NetworkError:
            System.Diagnostics.Debug.WriteLine("The purchase was unsuccessful due to a server or network error. " +
                "ExtendedError: " + extendedError);
            break;

        case StorePurchaseStatus.AlreadyPurchased:
            System.Diagnostics.Debug.WriteLine("The customer already owns this subscription." +
                    "ExtendedError: " + extendedError);
            break;
    }
}

Узнать информацию о надстройках подписки для текущего приложения

В этом примере кода показано, как получить сведения обо всех надстройках подписки, доступных в приложении. Чтобы получить эти сведения, сначала используйте метод GetAssociatedStoreProductsAsync , чтобы получить коллекцию объектов StoreProduct , представляющих каждую из доступных надстроек для приложения. Затем получите StoreSku для каждого продукта и используйте свойства IsSubscription и SubscriptionInfo для доступа к сведениям о подписке.

private StoreContext context = null;

public async Task GetSubscriptionsInfo()
{
    if (context == null)
    {
        context = StoreContext.GetDefault();
        // If your app is a desktop app that uses the Desktop Bridge, you
        // may need additional code to configure the StoreContext object.
        // For more info, see https://aka.ms/storecontext-for-desktop.
    }

    // Subscription add-ons are Durable products.
    string[] productKinds = { "Durable" };
    List<String> filterList = new List<string>(productKinds);

    StoreProductQueryResult queryResult =
        await context.GetAssociatedStoreProductsAsync(productKinds);

    if (queryResult.ExtendedError != null)
    {
        // The user may be offline or there might be some other server failure.
        System.Diagnostics.Debug.WriteLine($"ExtendedError: {queryResult.ExtendedError.Message}");
        return;
    }

    foreach (KeyValuePair<string, StoreProduct> item in queryResult.Products)
    {
        // Access the Store product info for the add-on.
        StoreProduct product = item.Value;

        // For each add-on, the subscription info is available in the SKU objects in the add-on. 
        foreach (StoreSku sku in product.Skus)
        {
            if (sku.IsSubscription)
            {
                // Use the sku.SubscriptionInfo property to get info about the subscription. 
                // For example, the following code gets the units and duration of the 
                // subscription billing period.
                StoreDurationUnit billingPeriodUnit = sku.SubscriptionInfo.BillingPeriodUnit;
                uint billingPeriod = sku.SubscriptionInfo.BillingPeriod;
            }
        }
    }
}

Управление подписками ваших сервисов

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

Отмена

Клиенты могут использовать https://account.microsoft.com/services страницу для своей учетной записи Майкрософт для просмотра всех подписок, которые они приобрели, отмены подписки и изменения формы оплаты, связанной с подпиской. Когда клиент отменяет подписку с помощью этой страницы, они продолжают иметь доступ к подписке в течение текущего периода выставления счетов. Они не получают возмещение за любую часть текущего периода выставления счетов. В конце текущего периода выставления счетов их подписка деактивируется.

Вы также можете отменить подписку за пользователя, используя наш REST API, чтобы изменить платежный статус подписки для данного пользователя.

Продление подписки и льготный период

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

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

Неподдерживаемые сценарии

В настоящее время для надстроек подписки не поддерживаются следующие сценарии.

  • Продажи подписок клиентам непосредственно через Магазин в настоящее время не поддерживаются. Подписки доступны только для покупок цифровых продуктов в приложении.
  • Клиенты не могут переключать периоды подписки с помощью https://account.microsoft.com/services страницы для своей учетной записи Майкрософт. Чтобы перейти на другой период подписки, клиенты должны отменить текущую подписку, а затем приобрести подписку с другим периодом подписки из приложения.
  • Переключение уровней в настоящее время не поддерживается для надстроек подписки (например, переключение клиента из базовой подписки на подписку premium с дополнительными функциями).
  • продажные и промо-коды в настоящее время не поддерживаются для дополнений подписки.
  • Продление существующих подписок после настройки видимости надстройки подписки на – Остановить приобретение. Дополнительную информацию см. в разделе Установите цену и доступность надстройки.