SOOMLA@Unityによる、iOS, Androidでの課金方法


UnityでIAP(アプリ内課金)をやってみたのでメモ。(Store Version 1.8.2)
まず、どんなライブラリがあるのかはこちらが参考になります。
基本的にSOOMLAは課金周りの処理だけではなくて、ユーザーのアイテム管理、ショップ管理までサポートするフレームワークでそこに課金機能もサポートされているという感じ。ユーザーの持ち物をすべてOS側のデータ領域に保存してくれる。
アプリ内でショップ、持ち物の管理ができるので便利だけど、サーバー側でも同じような管理をする場合にはその辺の機能は使わず購入処理だけうまく使う感じになりますが、その場合はprime31なんかを使った方がシンプルかもしれません。(有料 iOS/Androidそれぞれ$70くらい)
今回はサーバーでアイテムを管理するものの、SOOMLAのソースコードやコメントがキレイだったり、アップデートが頻繁だったりSOOMLA側のスタッフやユーザーのコミュニティが活発だったのでSOOMLAを選んでみた。

SOOMLAで(消耗型)課金コンテンツの実装でのメモ。
そもそもアプリ内課金自体が初めてなので、各プラットフォームの下準備。
まずはiOS側の下準備。

iOS下準備

1. App IDの追加

Developer Program > Cerificates, Identifiers & Profilesから、のIdentifiersのApp IDsからApp IDを追加。
この際に、App ServicesのIn-App PurchaseをONに設定。(おそらくOFFにはならない??)

2. Provisioning Profileの追加

同Developer ProgramからProvisioning ProfilesからDevelop用の作成で先ほど作成したApp IDを指定してDL。

3. アプリの追加

iTunes Connectからアプリを追加。
App内課金タブから、Create Newにて「消耗型」を選択。
参照名にiTunes Connectに表示されるわかりやすい名前を設定(公開されない)。
製品IDには商品のIDを設定。この際にBundle Identifierのように me.naochang.productname.itemnameなどと設定するとわかりやすいかも。(Androidの方は小文字しか使えないのでiOSもそれに揃えた方が良い)
この際「配信可能」にし、金額も決めておく。

4. テストユーザーの設定

iTunes Connectのユーザーと役割 > Sandboxテスターから、テストユーザーを設定する。
認証があるので実在するメールアドレスから設定しないといけないかも。
クレジットカードの登録もさせられたけど、iTunesで作ったアカウントへログインしてアカウント情報から削除。

5. iOSにてテストユーザーへのログイン

iOSにていま作ったアカウントへログインしておく

Android下準備

1. Google Play Developer Consoleへログイン
Google Play Developer Consoleへログイン。

2. 登録料$25の支払い

僕は初めての登録だったので支払いをしました。
iOS Developとは違って毎年の支払いはなく最初の登録料だけだそうです。

3. アプリの追加

「新しいアプリを追加」から新規アプリを作成。

4. apkファイルのアップロード

APK ベータ版テストへapkファイルをアップロード。
ベータ版での公開をしないとアプリ内課金テストができないらしい。
ストア(β)からダウンロードしてテストするのではなければ(USBで転送するなど)、実装はきちんとしていなくてもいいのでとにかくapkをアップロード。

5. API KEYの取得

ファイルをアップロードすると、apk > ベータ版テストにアップロードしたバージョンがならぶのでそちらをクリックし、APK ファイル SHA1 ダイジェストという項目を後でUnityのSOOMLAの設定で使うのでメモしておく。

追記)15.09.11
思いっきり自分が間違えてはまったことを書いてしまっていた…
上記ではなく、サービスとAPI => このアプリのライセンス キー というかなり長い文字列のことです。
上記のように間違えるとアプリが落ちます…

6. アプリ内アイテムの追加

いままで消耗型のアイテムはGoogle Playでは「管理対象外のアイテム」として扱われていたが「管理対象のアイテム」となったようなので、こちらでiOSのときと同じくme.naochang.productname.itemnameなどと設定。(大文字はNG)
(管理対象といってもおそらく1度購入後、消費してしまうと管理されないし、購入状態でさらに購入はできないのではないかと思う…???)
また、1度作ったアイテムIDは同じアプリでは2度と使えないので注意。

7. テストユーザーを追加

設定 > アカウントの詳細 > ライセンス テストにテスト用のgoogleアカウントを追加。
Google Play Developer Consoleで使っているアカウントではダメなようで別途アカウントが必要。
また、追加して反映されるまで数分程度時間がかかる。

SOOMLA

1. SOOMLAのインストール

Unityのアセットストアでもありますが、githubはこちら
落としてきたやつを解凍して、
deploy/out/soomla-unity3d-core.unitypackage
deploy/out/soomla-unity3d-store.unitypackage
こちらがインストールパッケージ。(以前はルートディレクトリにあった)
coreの方はSOOMLAの基本ライブラリで、storeの方がストア用のライブラリ。(両方必要)

ここでディレクトリ構造を変えると、設定画面が見えなくなるなど不都合が起きたのでディレクトリ構造は変えない方がよさそう。

2. SOOMLAの設定

インストールが終わると
Window => Soomla => Edit Settings のメニューが現れるので開く。
Soomla Secret を設定。
ここは適当な文字列でOKだけど、データの暗号化の際のキーに使われるものなので1度設定したら変えない。
(変えるとデータがリセットされてしまうと思う。)
Google PlayのAPI Keyは上記「Androidの下準備 5.API KEYの取得」でメモした値を貼り付ける。
Android/iOS共にある、Receipt ValidationについてはSOOMLAで用意しているサーバーでレシートのチェックをするかどうかの設定。(使っていないので分からない)

3. 下準備

UnityのProjectウィンドウにある、Soomla/Prefabs/CoreEvents, StoreEventsの2つをHierarchyに配置。

4. クラス構造

SOOMLAの一部クラス図
クラス図は左側がショップで扱うアイテム周りの構造(の一部)。
Itemというのが商品と通貨を合わせたものをさして、Currencyが通貨、Goodが商品という感じ。
まずは、自分のショップの管理をしなくてはいけなくて、IStoreAssetsのインターフェースを実装したショップを定義。それを
SoomlaStore.Initialize(IStoreAssets store);
という感じで登録。

イベント周りは
StoreEvents.OnSoomlaStoreInitialized
StoreEvents.OnMarketPurchase
などをイベント登録すれば呼ばれる。

StoreInventoryはユーザーの持ち物やショップへのアクセスを簡易的に扱えるようになるヘルパークラスで通常の
アイテム購入 StoreInventory.BuyItem()
アイテム付与 StoreInventory.GiveItem()
アイテム消費 StoreInventory.TakeItem()
などが呼び出せる。

5. レシート番号の取得

アイテムを購入するとAndroid/iOS共にレシート番号がもらえる。
消費系アイテムであればこれをサーバー側に渡し、保存しつつAppleへ適正なレシートかどうかを問い合わせたりする。
AndroidとiOSで取得するキーが違うんですが

/// <summary>
/// レシート番号.
/// </summary>
string signature;

/// <summary>
/// Start.
/// </summary>
void Start() {
	StoreEvents.OnMarketPurchase += this.OnMarketPurchase;
}

/// <summary>
// マーケットにて商品購入後に呼ばれる。
/// </summary>
public void OnMarketPurchase(PurchasableVirtualItem pvi, string payload, Dictionary<string, string> extra) {
	#if UNITY_EDITOR
	this.signature = extra["orderId"];
	#elif UNITY_ANDROID
	this.signature = extra["signature"];
	#elif UNITY_IOS
	this.signature = extra["receiptBase64"];
	#endif
}

こんな感じで取得できる。
取得したレシートは
pixiv inside | iOS/Androidアプリ内課金の不正なレシートによる有料会員登録を防ぐ
こちらを参考に不正を防ぐために利用。
SOOMLA設定画面でReceipt ValidationをチェックするとSOOMLAで用意されているサーバーでレシートの照合を行うかの設定もできる。(使ったことないけど)
購入処理だけでなく、持ち物管理も行われるので購入後持ち物にアイテムの付与が行われた後、StoreEvents.OnItemPurchased()が呼び出される。

サーバー側でアイテムを管理しないのであれば、持ち物やショップの処理もしてくれ、各OSごとのデバイスにデータも保持してくれるのでSOOMLAはとても便利。
ただ持ち物の管理をサーバー側で行いたいなどとなると(特に消費系アイテムなど)ショップや持ち物管理の機能は邪魔に感じてしまうかもしれません。

追記)15.09.12
SOOMLA@Unityによるストアの情報取得(値段とか)

“SOOMLA@Unityによる、iOS, Androidでの課金方法” への1件のフィードバック

  1. […] 下準備は、Soomlaのときと同じ感じで準備して、実装自体はSoomlaよりも簡単。 […]

コメントを残す