アプリのサブスクリプション アドオンの有効化

重要

現在、サブスクリプション アドオンを作成できるのは、早期導入プログラムに参加している開発者アカウントに限られます。 いずれは、すべての開発者アカウントでサブスクリプション アドオンをご利用いただけます。現時点でこの正式リリース前のドキュメントを公開しているのは、この機能がどのようなものかを開発者の皆様に簡単に紹介することが目的です。

UWP アプリが Windows 10 バージョン 1607 以降を対象としている場合、ユーザーにサブスクリプション アドオンのアプリ内購入を提供できます。 サブスクリプションを使用すると、自動の定期的な課金期間を設定してアプリ内でデジタル製品 (アプリの機能やデジタル コンテンツなど) を販売できます。

機能の概要

UWP アプリのサブスクリプション アドオンでは、次の機能をサポートします。

  • サブスクリプション期間を 1 か月、3 か月、6 か月、1 年、または 2 年から選択できます。 一部のアプリでは、テスト目的専用の 6 時間のサブスクリプションを使用できます。
  • サブスクリプションに 1 週間または 1 か月の無料試用期間を追加できます。
  • Windows SDK では、アプリで利用可能なサブスクリプション アドオンに関する情報を入手したり、サブスクリプション アドオンを購入できるようにしたりするためにアプリで利用できる API を提供しています。 また、サービスから呼び出してユーザーのサブスクリプションを管理できる REST API も提供しています。
  • サブスクリプションの取得数、アクティブなサブスクリプション会員数、および特定の期間中に取り消されたサブスクリプション数を表示する分析レポートを確認できます。
  • ユーザーは自分の Microsoft アカウントの http://account.microsoft.com/services ページでサブスクリプションを管理できます。 ユーザーはこのページを使用して、取得したサブスクリプションすべての表示、サブスクリプションの取り消し、およびサブスクリプションに関連付けられた支払方法の変更ができます。

注意

アプリでサブスクリプション アドオンの購入ができるようにするには、アプリは Windows 10 バージョン 1607 以降を対象とし、Windows.ApplicationModel.Store 名前空間ではなく、Windows.Services.Store 名前空間の API を使用して、アプリ内購入エクスペリエンスを実装する必要があります。 これらの名前空間の違いについて詳しくは、「アプリ内購入と試用版」をご覧ください。

アプリのサブスクリプション アドオンを有効化する手順

アプリでサブスクリプション アドオンを購入できるようにするには、次の手順に従います。

  1. デベロッパー センター ダッシュボードでサブスクリプションのアドオンの申請を作成し、申請を公開します。 アドオンの申請プロセスに従い、次のプロパティをよく確認します。

    • 製品の種類: [サブスクリプション]を選択していることを確認します。

    • サブスクリプション期間: サブスクリプションの定期的な課金期間を選択します。 アドオンの公開後にサブスクリプション期間を変更することはできません。

      各サブスクリプション アドオンがサポートするのは、単一のサブスクリプション期間と試用期間だけです。 アプリで提供するサブスクリプションの種類ごとに異なるサブスクリプション アドオンを作成する必要があります。 たとえば、試用期間のない月間サブスクリプション、1 か月の試用期間のある月間サブスクリプション、試用期間のない年間サブスクリプション、1 か月の試用期間のある年間サブスクリプションを提供する場合、サブスクリプション アドオンを 4 つ作成する必要があります。

      注意

      If you are in the process of implementing the in-app purchase experience for your subscription, we recommend that you create a test add-on with the For testing only – 6 hours subscription period to help you test the experience. You can choose this test period only if you select one of the Hidden in the Store visibility options for your test add-on.

    • 試用期間: ユーザーがサブスクリプション コンテンツを購入する前に試すことのできる期間を 1 週間にするか、1 か月にするかを選択することを検討します。 サブスクリプション アドオンの公開後に試用期間を変更または削除することはできません。

      サブスクリプションの無料試用版を取得するには、ユーザーは有効な支払方法の設定も含めて標準のアプリ内購入プロセスに従って、サブスクリプションを購入する必要があります。 試用期間中に料金を請求されることはありません。 試用期間の終わりに、サブスクリプションは自動的に完全なサブスクリプションに変わり、有料サブスクリプションの最初の期間の料金がユーザーの支払方法に請求されます。 ユーザーが試用期間中にサブスクリプションを取り消した場合、試用期間が終わるまでサブスクリプションは有効のままです。

      注意

      Some trial durations are not available for all subscription periods.

    • 可視性: サブスクリプションのアプリ内購入エクスペリエンスのテストだけに使用するテスト用アドオンを作成している場合は、[ストアに表示しない] オプションのいずれかを選択することをお勧めします。 それ以外の場合は、シナリオに最適な可視化オプションを選択します。

    • 価格: このセクションでサブスクリプションの価格を選択します。 アドオンの公開後にサブスクリプションの価格を上げることはできません (ただし、後で価格を下げることはできます)。

      重要

      アドオンの作成時、既定では、価格は最初 [無料] に設定されています。 サブスクリプション アドオンの申請の完了後にアドオンの価格を上げることはできないため、ここで必ずサブスクリプションの価格を選択してください。

  2. アプリで、Windows.Services.Store 名前空間の API を使用して、現在のユーザーが既にサブスクリプション アドオンを取得していて、そのユーザーにアドオンをアプリ内購入として販売するかどうかを確認します。 詳細については、この記事のコード サンプルを参照してください。

  3. アプリで、サブスクリプションのアプリ内購入の実装をテストします。 ストアからアプリを開発用デバイスに 1 回ダウンロードして、そのライセンスをテストに使用する必要があります。 詳細については、アプリ内購入のテスト ガイダンスをご覧ください。

    注意

    アプリで、テスト専用 (6 時間) のサブスクリプション期間を利用できる場合、この期間を設定したテスト用アドオンを作成して、エクスペリエンスのテストに役立てることをお勧めします。 このテスト期間は、テスト用アドオンに [ストアに表示しない] 可視性オプションのいずれかを選択した場合にのみ選択できます。

  4. テストしたコードを含む更新したアプリ パッケージを含めたアプリの申請を作成して公開します。 詳しくは、「アプリの申請」をご覧ください。

コード例

このセクションのコード例では、Windows.Services.Store 名前空間の API を使用して現在のアプリのサブスクリプション アドオンに関する情報を取得する方法および現在のユーザーの代わりにサブスクリプション アドオンの購入を要求する方法を説明します。

これらの例には、次の前提条件があります。

  • Windows 10 バージョン 1607 以降をターゲットとするユニバーサル Windows プラットフォーム (UWP) アプリの Visual Studio プロジェクト。
  • Windows デベロッパー センター ダッシュボードでアプリの申請を作成し、このアプリがストアで公開されている。 必要に応じで、テスト中にストアでアプリを検索できないようにアプリを構成することも可能です。 詳しくは、テスト ガイダンスをご覧ください。
  • デベロッパー センター ダッシュボードでアプリのサブスクリプション アドオンを作成した。

これらの例のコードは、次の点を前提としています。

  • コードは、workingProgressRing という名前の ProgressRingtextBlock という名前の TextBlock を含む Page のコンテキストで実行されます。 これらのオブジェクトは、それぞれ非同期操作が発生していることを示するためと、出力メッセージを表示するために使用されます。
  • コード ファイルには、Windows.Services.Store 名前空間の using ステートメントがあります。
  • アプリは、アプリを起動したユーザーのコンテキストでのみ動作するシングル ユーザー アプリです。 詳しくは、「アプリ内購入と試用版」をご覧ください。

注意

デスクトップ ブリッジを使用するデスクトップ アプリケーションがある場合、これらの例には示されていないコードを追加して StoreContext オブジェクトを構成することが必要になることがあります。 詳しくは、「デスクトップ ブリッジを使用するデスクトップ アプリケーションでの StoreContext クラスの使用」をご覧ください。

現在のアプリのサブスクリプション アドオンの情報の取得

このコード例では、アプリで利用可能なサブスクリプション アドオンの情報を取得する方法を示しています。 この情報を取得するには、まず 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;
            }
        }
    }
}

サブスクリプション アドオンの購入

この例では、StoreProduct クラスの RequestPurchaseAsync メソッドを使用して、サブスクリプション アドオンを購入する方法を示しています。 この例では、購入するサブスクリプション アドオンのストア ID を既に知っていることを前提とします。

private StoreContext context = null;

public async void PurchaseSubscription(string storeId)
{
    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.
    }

    // First, get the StoreProduct object for the subscription add-on. This example
    // assumes you already know the Store ID for the add-on and you have passed
    // it to this method.
    string[] productKinds = { "Durable" };
    List<String> filterList = new List<string>(productKinds);
    string[] storeIds = new string[] { storeId };

    workingProgressRing.IsActive = true;
    StoreProductQueryResult queryResult =
        await context.GetStoreProductsAsync(filterList, storeIds);
    workingProgressRing.IsActive = false;

    StoreProduct mySubscription = queryResult.Products.FirstOrDefault().Value;

    // Make sure the user has not already acquired the subscription add-on, then 
    // offer it for purchase to the user.
    if (!mySubscription.IsInUserCollection)
    {
        workingProgressRing.IsActive = true;
        StorePurchaseResult result = await mySubscription.RequestPurchaseAsync();
        workingProgressRing.IsActive = false;

        // 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:
                textBlock.Text = "The purchase was successful.";
                break;

            case StorePurchaseStatus.NotPurchased:
                textBlock.Text = "The purchase did not complete. " +
                    "The user may have cancelled the purchase. ExtendedError: " + extendedError;
                break;

            case StorePurchaseStatus.NetworkError:
                textBlock.Text = "The purchase was unsuccessful due to a network error. " +
                    "ExtendedError: " + extendedError;
                break;

            case StorePurchaseStatus.ServerError:
                textBlock.Text = "The purchase was unsuccessful due to a server error. " +
                    "ExtendedError: " + extendedError;
                break;

            default:
                textBlock.Text = "The purchase was unsuccessful due to an unknown error. " +
                    "ExtendedError: " + extendedError;
                break;
        }
    }
}

サービスからのサブスクリプションの管理

更新したアプリがストアで公開され、ユーザーがサブスクリプション アドオンを購入できるようになったら、ユーザーのサブスクリプションの管理が必要になる可能性があります。 サービスから呼び出して次のサブスクリプション管理タスクを実行できる REST API が用意されています。

取り消し

ユーザーは自分の Microsoft アカウントの http://account.microsoft.com/services ページを使用して、取得したサブスクリプションすべての表示、サブスクリプションの取り消し、およびサブスクリプションに関連付けられた支払方法の変更ができます。 ユーザーがこのページを使用してサブスクリプションを取り消した場合、現在の請求サイクルの期間中はサブスクリプションを引き続き利用できます。 現在の請求サイクルのどのようなタイミングにおいても、払い戻しは行われません。 現在の請求サイクルの最後に、サブスクリプションが無効になります。

REST API を使用して、ユーザーの代わりにサブスクリプションを取り消して、特定のユーザーのサブスクリプションに関する請求の状態を変更することもできます。

サポートされていないシナリオ

次のシナリオは、サブスクリプション アドオンで現在サポートされていません。

  • 現時点では、ストアを通じたユーザーへのサブスクリプションの直接販売はサポートされていません。 サブスクリプションはデジタル製品のアプリ内購入でのみ利用可能です。
  • ユーザーが自分の Microsoft アカウントの http://account.microsoft.com/services ページを使用してサブスクリプション期間を切り替えることはできません。 異なるサブスクリプション期間に切り替えるには、ユーザーは現在のサブスクリプションを取り消して、アプリで別のサブスクリプション期間のサブスクリプションを購入する必要があります。
  • サブスクリプション アドオンでは現在、サブスクリプション レベルの切り替えはサポートされていません (たとえば、ユーザーをベーシック サブスクリプションから機能の多いプレミアム サブスクリプションに切り替えるなど)。
  • サブスクリプション アドオンでは現在、セールプロモーション コードはサポートされていません。