Androidにおいて、Unity IAP を使って課金処理を実装しました。色々なサイトを参考にさせていただいたのですが、実装してみないとわからない点が多くありましたので、複数回に分けて記事にまとめます。
- In App Purchasing
4.1.2 - Unity
2020.3.21.f1 - Android
10/11
この記事ではIAPのセットアップとアプリ内購入の仕組みについてまとめます。 実装や評価については以下の記事をご参照ください。
IAP のセットアップ
プロジェクトの設定
Unityのプロジェクトを立ち上げたら、Window→General→Servicesを選択します。
Unity Project IDの作成が表示されるので、未作成であれば作成します。作成済みであれば、”I already have a Unity Project ID“を選択します。
Unity Project IDを選択し、プロジェクトを選択します。作成済みでなければCreateで自動で生成されます。
このようにプロジェクトとUnity Projectがリンクされます。右上の”Go to Dashboard“からWebの管理画面に飛べばプロジェクトの管理ページを確認することもできます。
IAP の有効化
先ほどのメニューから”In-App Purchasing”を選択します。
Enableを選択して有効化します。
COPPAコンプライアンスの確認がでますので、アプリに合わせて選択してください。チェックを入れるとプライバシーポリシーでの説明が必要になります。
最後にパッケージのinstallとアプリケーションのGoogle Public Keyの入力を求められます。
パッケージが未インストールであればImportボタンでパッケージをインストールします。パッケージの3.0以降がインストールされている場合、このボタンを押すなとWarningが表示されています。
Window→Package Managerからインストールしているバージョンが確認できます。
また、Google Public KeyはIAPを実装したいPlay consoleのアプリのページから確認できます。収益化のセットアップのライセンスにある公開鍵の文字列をコピーします。
コピーした鍵をこのまま貼り付けてVerifyしてもエラーとなるので注意が必要です。
右上の”Go to Dashboard“からWebの管理画面に飛び、Analytics Settingsを選択し一番上のGoogle License Keyに入力し保存します。
保存した後、Unity EditorからVerifyを押すと緑色のチェックマークが表示され、入力完了となります。Webの管理ページと値が同じかどうか比較しているだけのようです。
これでUnity Editorの設定は完了です。
アプリ内購入の仕組み
実装を説明する前にアプリ内購入の仕組みについて簡単に説明します。
購入コンテンツの種類
購入できるアイテムは以下の3つにカテゴライズされています。
- 消費可能アイテム
購入の度に消費され何度も購入できるアイテム。ゲーム内通貨など。 - 消費不可アイテム
一度だけ購入できるアイテム。広告消しやロックコンテンツの解放など。 - 定期購入
定期的に購入が必要なもの。動画視聴のサブスクなど。
ここでは消費可能アイテムを例に説明します。
購入までの流れ
初期化する
UnityPurchasing.Initialize()で初期化します。初期化はネットワークに接続されている場合はStoreに接続して、購入明細(レシート)をアプリ内に保有しているレシートと同期をとります。
もしネットワークに接続されていない場合はアプリが保有しているレシートを使用します。
消費不可アイテムは一度購入するとそのレシートを保持し続け、そのレシートを確認することで購入済みか否かを判断します。
購入する
アプリからユーザー操作で購入が要求されると、InitiatePurchase()で購入を開始します。購入手続きが処理された場合はProcessPurchase()がコールバックされ、失敗した場合はOnPurchaseFailed()がコールバックされます。
ここで、気を付けなければいけないのはProcessPurchase()がコールバックされた段階ではまだ購入が完了していない点です。このコールバックの中で、正しく購入が行われたことを確認するために、受領したレシートの検証が必要です。
レシートを検証する
もしかしたら、実際にお金は支払われておらず、偽物のレシートが送り付けられてきているかもしれません。正しいレシートであることの検証が必要です。
検証は2つの方法があります。アプリ内で検証する方法と自前のサーバーにレシートを送ってそこで検証する方法です。
前者はアプリ内で閉じるので、実装が容易ですが、バイナリパッチやRoot権限を取られている実機などは正しく検証できないリスクが伴います。後者は自前のサーバーの準備やサーバー側の実装が必要となり、手間がかかります。
ビジネスの大きさと天秤にかけてどちらで実装するかを決定する必要があります。
私の場合は趣味レベルなので、アプリ内検証のみを実装しました。
購入を完了する
ProcessPurchase()でPurchaseProcessingResult.Completeをリターンすることで、購入が完了します。消費可能アイテムの場合はPurchaseProcessingResult.Completeをリターンする前にアイテムの追加処理(コインの追加やアイテムの追加など)をしておく必要があります。
シーケンスまとめ
アイテムの購入やアプリの起動のシーケンスをまとめておきます。
アプリ起動(IAP初期化)
アプリ起動時にIAPの初期化を行います。初期化はUnityPurchasing.Initialize()で実施し、ネットワーク接続がある場合はストアのレシートと同期します。ネットワーク接続がない場合はアプリ内部に保有するレシートをそのまま使用します。
消費不可アイテムの返金が発生した場合はこの同期時にレシートが失われる仕組みになっています。
また、Androidはアプリの再インストールや機種変更などによる別デバイスでの起動時、自動でストアのレシートを復旧します。(iOSでは復旧の処理をユーザーに促すUIが必要となります)
アイテム購入シーケンス(アプリ内レシート検証)
CrossPlatformValidatorでアプリ内でレシートの検証を実施します。購入処理が完了したら、ProcessPurchase()をreturn PurchaseProcessingResult.Complete で終了するか、ConfirmPendingPurchase()で購入を完了させるかのどちらかで購入処理が完了したことをStoreへ通知します。
アイテム購入シーケンス(サーバーレシート検証)
サーバーでレシートの検証を実施します。購入処理が完了したら、ProcessPurchase()をreturn PurchaseProcessingResult.Complete で終了するか、ConfirmPendingPurchase()で購入を完了させるかのどちらかで購入処理が完了したことをStoreへ通知します。
おわりに
ここではUnity IAPのセットアップと購入の仕組みについて説明しました。レシートの概念を理解しておくことが大事で、購入アイテム一つにつき一つのレシートが紐づき、消費不可アイテムに関してはレシートがストア、デバイスに残り続けるという点に注意です。
購入処理の実装や実機を用いたテスト方法については別の記事でご紹介します。
コメント