アプリ内購入と試用版

Windows SDK に用意されている API を使用して、以下の機能を実装し、ユニバーサル Windows プラットフォーム (UWP) アプリによる収益を向上させることができます。

  • アプリ内購入   アプリが無料であるかどうかにかかわらず、コンテンツやアプリの新機能 (ゲームの次のレベルのロック解除など) をアプリ内から直接販売できます。

  • 試用版機能  アプリを Windows デベロッパー センター ダッシュボードで無料試用版として構成した場合、試用期間中に一部の機能を除外または制限することによって、アプリの通常版を購入するようユーザーを促すことができます。 また、ユーザーがアプリを購入する前の試用期間中にだけバナーや透かしなどを表示する機能を有効にすることもできます。

この記事では、UWP アプリでのアプリ内購入と試用版のしくみについて、その概要を説明します。

使用する名前空間を選ぶ

UWP アプリにアプリ内購入機能や試用版機能を追加する際に使用できる名前空間は、2 つあります。どちらの名前空間を使用するかは、アプリのターゲットとなる Windows 10 のバージョンによって決まります。 これらの名前空間の API は同じ目的を果たしますが、その設計は大きく異なります。また、この 2 つの API 間にコードの互換性はありません。

  • Windows.Services.Store  Windows 10 バージョン 1607 以降の場合、アプリはこの名前空間の API を使用して、アプリ内購入および試用版を実装することができます。 アプリのターゲットが Windows 10 バージョン 1607 以降である場合は、この名前空間のメンバーを使用することをお勧めします。 この名前空間は、ストアで管理されるコンシューマブルなアドオンなど、最新の種類のアドオンをサポートしており、Windows デベロッパー センターとストアで今後サポートされる製品および機能の種類と互換性を持つように設計されています。 この名前空間について詳しくは、この記事の「Windows.Services.Store 名前空間を使用するアプリ内購入と試用版」をご覧ください。

  • Windows.ApplicationModel.Store  Windows 10 のすべてのバージョンでは、この名前空間にあるアプリ内購入と試用版向けの以前の API がサポートされています。 Windows 10 用 UWP アプリではこの名前空間を使用できますが、今後デベロッパー センターやストアでは、この名前空間は新しい種類の製品や機能をサポートするように更新されない可能性があります。 この名前空間について詳しくは、「Windows.ApplicationModel.Store 名前空間を使用するアプリ内購入と試用版」をご覧ください。

基本的な概念

ストアで提供されるアイテムはすべて、通常、製品と呼ばれます。 ほとんどの開発者が扱う製品の種類は、アプリアドオンのみです。

アドオンとは、ユーザーがアプリのコンテキストで利用できる製品や機能のことです。たとえば、アプリやゲームで使用される通貨、ゲームの新しい地図や武器、広告を表示せずにアプリを使用できる機能などに加え、音楽やビデオなどのデジタル コンテンツを提供できるアプリなら、そのようなコンテンツのことも表します。 すべてのアプリとアドオンは、そのアプリやアドオンを使用する権利がユーザーにあるかどうかを示す関連付けられたライセンスを備えます。 アプリまたはアドオンを試用版として使用する権利がユーザーにある場合は、その試用版に関する追加情報もライセンスによって提供されます。

アプリでユーザーにアドオンを提供するには、デベロッパー センター ダッシュボードでアプリのアドオンを定義します。これにより、そのアドオンがストアで認識されます。 その後で、アプリで Windows.Services.Store または Windows.ApplicationModel.Store 名前空間の API を使用して、アプリ内購入としてユーザーに販売するアドオンを提供することができます。

UWP アプリでは、次の種類のアドオンを提供できます。

アドオンの種類 説明
永続的 Windows デベロッパー センター ダッシュボードで指定した有効期間のあいだ保持されるアドオンです。

既定では、永続的なアドオンの有効期限が切れることはありません。この場合、アドオンは 1 回のみ購入することができます。 アドオンで特定の期間を指定している場合、期限が切れた後、ユーザーはアドオンを再購入できます。

開発者により管理されるコンシューマブル 購入し、使用した後に再購入できるアドオンです。 この種類のアドオンは、多くの場合、アプリ内通貨に使用されます。

この種類のコンシューマブルでは、アドオンが表すユーザーのアイテムの残量を追跡し、ユーザーによってすべてのアイテムが消費されたらアドオンの購入をフルフィルメント完了としてストアに報告する義務が開発者にあります。 以前のアドオン購入をフルフィルメント完了としてアプリで報告するまで、ユーザーがそのアドオンを再購入することはできません。

たとえば、アドオンがゲーム内の 100 コインを表しており、ユーザーによって 10 コインが消費されている場合、アプリまたはサービスでは、ユーザーの 90 コインの残高を保持する必要があります。 ユーザーによって 100 コインすべてが消費されたら、アプリでそのアドオンをフルフィルメント完了として報告する必要があります。その後、ユーザーは 100 コイン アドオンを再購入できます。

ストアで管理されるコンシューマブル 購入し、使用した後に再購入できるアドオンです。 この種類のアドオンは、多くの場合、アプリ内通貨に使用されます。

この種類のコンシューマブルでは、アドオンが表すユーザーのアイテムの残量はストアで追跡します。 ユーザーによりアイテムが消費されたら、そのアイテムをフルフィルメント完了としてストアに報告する義務が開発者にあり、ストアによってユーザーの残量が更新されます。 アプリでは、ユーザーのアイテムの現在の残量をいつでも照会できます。 ユーザーは、すべてのアイテムを消費したら、そのアドオンを再購入できます。

たとえば、アドオンがゲーム内の 100 のコインの初期量を表しており、ユーザーによって 10 コインが消費された場合、そのアドオンの 10 ユニットがフルフィルメント完了したことをアプリでストアに報告すると、ストアにより残高が更新されます。 ユーザーは、100 コインすべてを消費した後、その 100 コインのアドオンを再購入できます。

  ストアで管理されるコンシューマブルを使用するには、アプリは Windows 10 バージョン 1607 以降をターゲットとし、Windows.ApplicationModel.Store 名前空間ではなく、Windows.Services.Store 名前空間の API を使用する必要があります。

サブスクリプション アドオンを使い続けるために定期的な間隔でユーザーが継続的に課金する永続的なアドオンです。 ユーザーはいつでもサブスクリプションをキャンセルして、それ以降の課金を取り消すことができます。

注:  サブスクリプション アドオンを現在利用できるのは、初期導入プログラムに参加している開発者アカウントに限られます。 サブスクリプション アドオンを使用するには、アプリは Windows 10 バージョン 1607 以降をターゲットとし、Windows.ApplicationModel.Store 名前空間ではなく、Windows.Services.Store 名前空間の API を使用する必要があります。

注意

パッケージで使用される永続的なアドオン (ダウンロード コンテンツまたは DLC とも呼ばれます) など、他の種類のアドオンが利用できるのは一部の開発者に限られており、このドキュメントでは説明しません。

Windows.Services.Store 名前空間を使用するアプリ内購入と試用版

このセクションでは、Windows.Services.Store 名前空間の重要なタスクと概念の概要について説明します。 この名前空間は Windows 10 バージョン 1607 以降をターゲットにしているアプリでのみ使用できます。可能であれば、このようなアプリでは Windows.ApplicationModel.Store 名前空間の代わりに、この Windows.Services.Store 名前空間を使用することをお勧めします。 Windows.ApplicationModel.Store 名前空間については、この記事をご覧ください。

このセクションの内容

ビデオ

Windows.Services.Store 名前空間を使用してアプリにアプリ内購入を実装する方法の概要については、次のビデオをご覧ください。

StoreContext クラスの概要

Windows.Services.Store 名前空間のメイン エントリ ポイントは、StoreContext クラスです。 このクラスには、現在のアプリとその利用可能なアドオンに関する情報の取得、現在のアプリまたはそのアドオンに関するライセンス情報の取得、現在のユーザー向けのアプリまたはアドオンの購入、およびその他のタスクを行う際に使用できるメソッドが用意されています。 StoreContext オブジェクトを取得するには、次のいずれかを実行します。

  • シングル ユーザー アプリ (アプリを起動したユーザーのコンテキストのみで実行されるアプリ) では、静的な GetDefault メソッドを使用して、StoreContext オブジェクトを取得します。このオブジェクトを使用すると、ユーザーの Windows ストア関連のデータにアクセスできます。 ほとんどのユニバーサル Windows プラットフォーム アプリ (UWP) アプリはシングル ユーザー アプリです。

    Windows.Services.Store.StoreContext context = StoreContext.GetDefault();
    
  • マルチ ユーザー アプリでは、静的な GetForUser メソッドを使用して StoreContext オブジェクトを取得します。このオブジェクトを使用すると、アプリの使用中に Microsoft アカウントでサインインした特定のユーザーに関する Windows ストア関連のデータにアクセスできます。 次の例は、利用可能な最初のユーザーの StoreContext オブジェクトを取得します。

    var users = await Windows.System.User.FindAllAsync();
    Windows.Services.Store.StoreContext context = StoreContext.GetForUser(users[0]);
    

注意

デスクトップ ブリッジ を使用する Windows デスクトップ アプリケーションでは、StoreContext オブジェクトを使用する前に、追加の手順を実行してこのオブジェクトを構成する必要があります。 詳しくは、このセクションをご覧ください。

StoreContext オブジェクトを構成すると、このオブジェクトのメソッドを呼び出して、現在のアプリやアドオンに関するストア製品情報の取得、現在のアプリとそのアドオンに関するライセンス情報の取得、現在のユーザー向けのアプリやアドオンの購入、およびその他のタスクを実行できます。 このオブジェクトを使用して実行できる一般的なタスクについて詳しくは、次の記事をご覧ください。

StoreContext および Windows.Services.Store 名前空間にある他の型を使用する方法を示すサンプル アプリについては、ストア サンプルをご覧ください。

アプリ内購入の実装

Windows.Services.Store 名前空間を使用して、アプリでアプリ内購入をユーザーに提供するには:

  1. ユーザーが購入できるアドオンをアプリで提供する場合、デベロッパー センター ダッシュ ボードで、アプリに関するアドオンの申請を作成します。

  2. アプリで提供されるアプリやアドオンの製品情報を取得してから、ライセンスがアクティブになっているかどうかを判断する (つまり、アプリやアドオンを使用するためのライセンスをユーザーが所有しているかどうかを判断する) ようにアプリのコードを記述します。 ライセンスがアクティブになっていない場合、ユーザーに販売するためのアプリやアドオンをアプリ内購入として提供する UI を表示します。

  3. ユーザーがアプリやアドオンの購入を選んだ場合、製品を購入するための適切なメソッドを使用します。

  4. この記事に記載されているテスト ガイダンスに従って、実装をテストします。

試用版機能の実装

Windows.Services.Store 名前空間を使用して、アプリの試用版の機能を除外または制限するには:

  1. Windows デベロッパー センター ダッシュ ボードで、アプリを無料試用版として構成します

  2. アプリで提供されるアプリやアドオンの製品情報を取得してから、アプリに関連付けられているライセンスが試用版ライセンスになっているかどうかを判断するようにアプリのコードを記述します。

  3. 試用版である場合は、アプリの特定の機能を除外または制限します。ユーザーが完全なライセンスを購入した場合は、その機能を有効にします。 詳細とコード例については、「アプリの試用版の実装」をご覧ください。

  4. この記事に記載されているテスト ガイダンスに従って、実装をテストします。

アプリ内購入や試用版の実装のテスト

アプリで Windows.Services.Store 名前空間の API を使用してアプリ内購入と試用版を実装する場合は、アプリをストアに公開してからそのアプリを開発デバイスにダウンロードし、そのライセンスを使用してテストを行う必要があります。 コードをテストするには次のプロセスに従います。

  1. アプリがまだ公開されておらず、ストアで利用できない場合、アプリが Windows アプリ認定キットの最低限の要件を満たしていることを確認し、Windows デベロッパー センター ダッシュボードにそのアプリを申請します。その後で、アプリが認定プロセスに合格し、ストアで利用できることを確認します。 テスト中にストアでアプリを検索できないようにアプリを構成することも可能です。

  2. 次に、以下の操作が完了していることを確認します。

  3. プロジェクトを Visual Studio で開き、[プロジェクト] メニューをクリックし、[ストア] をポイントして、[アプリケーションをストアと関連付ける] をクリックします。 ウィザードの手順を完了し、テストに使用する Windows デベロッパー センター アカウントのアプリとアプリ プロジェクトを関連付けます。

    注意

    プロジェクトとストアのアプリを関連付けていない場合、StoreContext メソッドにより、戻り値の ExtendedError プロパティがエラー コード値 0x803F6107 に設定されます。 この値は、ストアにそのアプリに関する情報がないことを示します。

  4. まだ前の手順で指定したストアのアプリをインストールしていない場合は、アプリをインストールし、アプリを一度実行してから閉じます。 これにより、アプリの有効なライセンスが開発用デバイスにインストールされます。

  5. Visual Studio で、プロジェクトの実行またはデバッグを開始します。 コードによって、ローカルのプロジェクトと関連付けたストア アプリからアプリおよびアドオンのデータが取得されます。 アプリを再インストールするように求められた場合は、その指示に従った後、プロジェクトを実行またはデバッグします。

    注意

    上記の手順を実行すると、ストアに新しいアプリ パッケージを提出しなくても、引き続きアプリのコードを更新し、更新されたプロジェクトを開発用コンピューターでデバッグできます。 テストで使用するローカル ライセンスを取得するため、開発用コンピューターにストア バージョンのアプリを 1 度だけダウンロードする必要があります。 テストが完了し、ユーザーがアプリのアプリ内購入や試用版に関連する機能を利用できるようにするには、ストアに新しいアプリ パッケージを申請するだけで済みます。

アプリで Windows.ApplicationModel.Store 名前空間を使用している場合は、アプリで CurrentAppSimulator クラスを使用することで、アプリをストアに提出する前に、ライセンス情報をテスト中にシミュレートできます。 詳しくは、「CurrentApp クラスと CurrentAppSimulator クラスの概要」をご覧ください。

注意

Windows.Services.Store 名前空間には、テスト中にライセンス情報をシミュレートするために使用できるクラスが用意されていません。 Windows.Services.Store 名前空間を使用してアプリ内購入または試用版を実装する場合は、上記のように、アプリをストアに公開してからそのアプリを開発デバイスにダウンロードし、そのライセンスを使用してテストを行う必要があります。

アプリ内購入の受領通知

Windows.Services.Store 名前空間には、購入が成功した場合の取引の受領通知をアプリのコードで取得する際に使用できる API が用意されていません。 これは、Windows.ApplicationModel.Store 名前空間を使用するアプリの場合とは異なります。このようなアプリでは、クライアント側の API を使用して、取引の受領通知を取得することができます。

Windows.Services.Store 名前空間を使用してアプリ内購入を実装し、特定のユーザーがアプリまたはアドオンを購入したかどうかを確認する必要がある場合は、Windows ストア コレクション REST API製品を照会するためのメソッドを使用できます。 このメソッドで返されるデータによって、指定されたユーザーが特定の製品に対する資格を持っているかどうかを確認し、ユーザーが購入した製品の取引に関するデータを取得することができます。 Windows ストア コレクション API では、Azure AD Authentication を使用してこの情報を取得します。

デスクトップ ブリッジでの StoreContext クラスの使用

デスクトップ ブリッジを使用するデスクトップ アプリケーションでは、StoreContext クラスを使用してアプリ内購入と試用版を実装できます。 ただし、Win32 デスクトップ アプリケーション、またはレンダリング フレームワーク (WPF アプリケーションなど) に関連付けられているウィンドウ ハンドル (HWND) を含んだデスクトップ アプリケーションがある場合、アプリケーションでは、オブジェクトによって表示されるモーダル ダイアログのオーナー ウィンドウとなるアプリケーション ウィンドウを指定するように、StoreContext オブジェクトを構成する必要があります。

多くの StoreContext メンバー (および StoreContext オブジェクトを介してアクセスされる他の関連する型のメンバー) では、製品購入などのストアに関連する操作を行うために、モーダル ダイアログがユーザーに表示されます。 デスクトップ アプリケーションで、モーダル ダイアログのオーナー ウィンドウを指定するように StoreContext オブジェクトが構成されていない場合、このオブジェクトは不正確なデータまたはエラーを返します。

デスクトップ ブリッジを使用するデスクトップ アプリケーションで StoreContext オブジェクトを構成するには、次の手順を実行します。

  1. 次のいずれかを実行して、アプリで IInitializeWithWindow インターフェイスにアクセスできるようにします。

    • アプリケーションが C# や Visual Basic などのマネージ言語で記述されている場合、次の C# の例に示すように、アプリのコードで ComImport 属性を使用して、IInitializeWithWindow インターフェイスを宣言します。 この例では、コード ファイルに System.Runtime.InteropServices 名前空間の using ステートメントが指定されていることを前提としています。

      [ComImport]
      [Guid("3E68D4BD-7135-4D10-8018-9FB6D9F33FA1")]
      [InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
      public interface IInitializeWithWindow
      {
        void Initialize(IntPtr hwnd);
      }
      
    • アプリケーションが C++ で記述されている場合、コードに shobjidl.h ヘッダー ファイルへの参照を追加します。 このヘッダー ファイルには、IInitializeWithWindow インターフェイスの宣言が含まれています。

  2. この記事で既に説明したように、GetDefault メソッド (マルチ ユーザー アプリの場合は GetForUser メソッド) を使用して、StoreContext オブジェクトを取得します。次に、このオブジェクトを IInitializeWithWindow オブジェクトにキャストします。 その後で、IInitializeWithWindow.Initialize メソッドを呼び出し、StoreContext メソッドによって表示されるモーダル ダイアログのオーナーにするウィンドウのハンドルを渡します。 次の C# の例は、アプリのメイン ウィンドウのハンドルをメソッドに渡す方法を示しています。

    StoreContext context = StoreContext.GetDefault();
    IInitializeWithWindow initWindow = (IInitializeWithWindow)(object)context;
    initWindow.Initialize(System.Diagnostics.Process.GetCurrentProcess().MainWindowHandle);
    

製品、SKU、および可用性

ストア内のすべての製品には少なくとも 1 つの SKU があり、各 SKU ごとに少なくとも 1 つの可用性があります。 Windows デベロッパー センター ダッシュボードでは、ほとんどの場合、これらの概念は開発者から抽象化されており、多くの開発者はアプリまたはアドオンの SKU や可用性を定義することはありません。 ただし、Windows.Services.Store 名前空間のストア製品のオブジェクト モデルには SKU と可用性が含まれているため、シナリオによっては、これらの概念の基本的な知識があると役に立つことがあります。

オブジェクト 説明
製品 製品は、アプリやアドオンなど、ストアで利用できるすべての製品の種類を指します。

ストアの各製品には対応する StoreProduct オブジェクトがあります。 このクラスには、製品のストア ID、ストア登録情報の画像と動画、価格情報などのデータにアクセスするために使用できるプロパティが用意されています。 また、製品を購入するために使用できるメソッドも提供されます。

SKU SKU によって、独自の説明や価格など、製品固有の詳細情報に基づいて特定のバージョンの製品が示されます。 各アプリまたはアドオンには既定の SKU があります。 ほとんどの開発者は、アプリの通常版と試用版を公開している場合を除いて (ストア カタログでは、通常版と試用版は同じアプリの別の SKU になります)、1 つのアプリに複数の SKU を用意することはありません。

一部の発行元は、独自の SKU を定義することができます。 たとえば、大規模なゲームの発行元の場合、赤い血が許可されない市場では緑の血が表示される SKU でゲームをリリースし、それ以外のすべての市場では赤い血が表示される別の SKU でゲームをリリースすることがあります。 または、デジタル ビデオ コンテンツを販売している発行元が、1 つのビデオに対して、高解像度版の SKU と通常解像度版の SKU という、2 つの SKU を公開する場合もあります。

ストアの各 SKU には対応する StoreSku オブジェクトがあります。 すべての StoreProduct には、製品の SKU にアクセスするために使用できる Skus プロパティがあります。

可用性 可用性によって、固有の価格情報に基づいて特定のバージョンの SKU が示されます。 各 SKU には、既定の可用性があります。 一部の発行元は独自の可用性を定義でき、特定の SKU にさまざまな価格オプションを導入できます。

ストアの各可用性には対応する StoreAvailability オブジェクトがあります。 すべての StoreSku には、SKU の可用性にアクセスするために使用できる Availabilities プロパティがあります。 ほとんどの開発者の場合、SKU ごとに 1 つの既定の可用性があります。

ストア ID

アプリやアドオンなど、ストアのすべての製品には関連付けられたストア ID があります (これは製品ストア ID と呼ばれることもあります)。 多くの API は、アプリまたはアドオンで操作を実行するためにストア ID を必要とします。

ストア内の製品のストア ID は 12 文字の英数字文字列です。たとえば、9NBLGGH4R315 のようになります。 ストア内の製品のストア ID は、次のようにさまざまな方法で取得できます。

  • アプリの場合、ストア ID は、デベロッパー センター ダッシュボードの [アプリ ID] ページで取得できます。
  • アドオンの場合、ストア ID はダッシュボードのアドオンの概要ページで取得できます。
  • 製品の場合、その製品を表す StoreProduct オブジェクトの StoreId プロパティを使用するにより、ストア ID をプログラムで取得することもできます。

製品の SKU と可用性の場合は、その SKU と可用性にも形式の異なる固有のストア ID が用意されています。

オブジェクト ストア ID の形式
SKU SKU の場合、ストア ID の形式は <product Store ID>/xxxx のようになります。ここで、xxxx は製品の SKU を識別する 4 文字の英数字文字列です。 たとえば、9NBLGGH4R315/000N と記述します。 この ID は、StoreSku オブジェクトの StoreId プロパティによって返され、SKU ストア ID と呼ばれることもあります。
可用性 可用性の場合、ストア ID の形式は <product Store ID>/xxxx/yyyyyyyyyyyy のようになります。ここで、xxxx は製品の SKU を識別する 4 文字の英数字文字列で、yyyyyyyyyyyy は SKU の可用性を識別する 12 文字の英数字文字列です。 たとえば、9NBLGGH4R315/000N/4KW6QZD2VN6X と記述します。 この ID は、StoreAvailability オブジェクトの StoreId プロパティによって返され、可用性ストア ID と呼ばれることもあります。

コードでアドオンの製品 ID を使用する方法

アプリのコンテキストでユーザーがアドオンを利用できるようにするには、デベロッパー センター ダッシュボードでアドオンの申請を作成するときに、アドオン用の固有の製品 ID を入力しなければなりません。 この製品 ID を使用することでコード内でアドオンを参照できます。ただし、製品 ID を使用できる特定のシナリオは、アプリのアプリ内購入に使用する名前空間によって異なります。

注意

デベロッパー センター ダッシュボードでアドオン用に入力する製品 ID は、アドオンのストア ID とは異なります。 ストア ID はデベロッパー センターによって生成されます。

Windows.Services.Store 名前空間を使うアプリ

アプリで Windows.Services.Store 名前空間を使用している場合、製品 ID を使用することで、アドオンを表す StoreProduct や、アドオンのライセンスを表す StoreLicense を簡単に識別できます。 製品 ID は、StoreProduct.InAppOfferToken プロパティおよび StoreLicense.InAppOfferToken プロパティにより公開されます。

注意

製品 ID はコードでアドオンを識別する便利な方法ですが、Windows.Services.Store 名前空間のほとんどの操作では、製品 ID の代わりにアドオンのストア ID を使用します。 たとえば、アプリの 1 つ以上の既知のアドオンをプログラムで取得するには、アドオンの (製品 ID ではなく) ストア ID を GetStoreProductsAsync メソッドに渡します。 同様に、コンシューマブルなアドオンをフルフィルメント完了として報告するには、アドオンの (製品 ID ではなく) ストア ID を ReportConsumableFulfillmentAsync メソッドに渡します。

Windows.ApplicationModel.Store 名前空間を使うアプリ

アプリで Windows.ApplicationModel.Store 名前空間を使用している場合は、ほとんどの操作に、デベロッパー センター ダッシュボードでアドオンに割り当てた製品 ID を使用する必要があります。 次に、例を示します。