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


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

Ваше приложение универсальная платформа 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 с дополнительными функциями).
  • Продажи и рекламные коды в настоящее время не поддерживаются для надстроек подписки.
  • Продление существующих подписок после настройки видимости надстройки подписки для остановки приобретения. Дополнительные сведения см. в разделе "Настройка цен и доступности надстроек".