使い切り型のアプリ内販売(=コンシューマブルなアプリ内購入)を利用したシステムを設計/実装することは、入門レベルをはるかに超えた困難な作業だ。そのため、概要だけを説明しておく(別途公開しているサンプルコードには、概略の実装が入れてある)。
このアプリ内販売では、Windowsストアはエンドユーザーに課金するためのトランザクションをサポートするだけだ。有効期間などのライセンス管理はアプリ側で行わなければならない。トランザクションは、エンドユーザーによる購入UIでの購入操作をWindowsストアが受け付けたときに始まり、アプリが購入処理の完了を報告した後、Windowsストアが課金処理を終えたときに完了する(次の図)。
上の図は正常にトランザクションが完了する場合であり、実際には、アプリ側の登録処理やストアへの報告処理、あるいは、Windowsストア側の課金処理などの途中でエラーが発生してトランザクションが未完了のままになることもあり得る。そのような状態のトランザクションは「未完了の使い切り型トランザクション」(MSDNでは「フルフィルメントが完了していないコンシューマブルトランザクション(unfulfilled consumable transactions)」)と呼ばれ、Windowsストア側で保持される。未完了のトランザクションが残っていると、エンドユーザーは購入したつもりなのに、アプリに反映されていなかったり、ストアでの課金が発生していなかったりという状態になっている。そこで、アプリは定期的に(例えば起動時などに)、未完了のトランザクションをチェックし、存在した場合は、アプリ内で購入したものを重複することなく登録し直し、完了をWindowsストアに報告しなければならない。
未完了のトランザクションがなければ、新しい購入処理を行える。上の図のように、エンドユーザーの意志に基づいて購入UIを出し、Windowストアから返されたProductIdとTransactionIDに基づいてアプリ内で購入したものを登録し、Windowsストアに完了報告を行う。ただし、「アプリ内で購入したものを登録」と書いたが、複数のPCで利用するエンドユーザーのことを考えると、実際には独自のWebサービスを立ち上げてライセンス管理をすることになるだろう。
なお、アプリをWindowsストアに提出する際に情報を記入する場所は次の画像のようになっている。
さらに、使い切り型のアプリ内販売では、アプリ側で独自に定義した「OfferId」文字列を利用して、1つのProductIdで複数の商品を販売することも可能である。その場合には、購入UIを出すときに3引数のRequestProductPurchaseAsyncメソッドを使う。「Official Windows SDK Sample」の「Trial app and in-app purchase sample」にサンプルコードが入っている。
Copyright© Digital Advantage Corp. All Rights Reserved.