--------------------------------------------------------
※注意:In App Billing ver2のプラグインの記事になります。
最新のver3に対応しているプラグインの記事はこちらになります。
--------------------------------------------------------

UnityでのAndroidアプリ内課金では割とポピュラーな、prime31のAndroid In App Billing Plugin($65)を使用した、アプリ内課金の実装メモです。

iOS版はこちら

prime31
http://www.prime31.com/unity/

こちらもわかりやすいテストシーンが付属してあるので、そのまんまなのですが、メモ。
管理なしアイテムと、ユーザアカウント毎に管理のアイテムで試しました。

導入時のバージョンはUnity3.5.6、プラグインのバージョンは1.2.8です。

--------------------------------------------------------
※注意:ここで紹介しているバージョンは古いので
実装の際は公式で最新のドキュメントを確認することをおすすめします。
--------------------------------------------------------

※前準備として事前に、デベロッパーコンソールにてアプリと課金アイテムを登録し、
 アイテムのみ公開状態にしておく。(アプリが非公開なら、公開されることはない)
 テストアカウントの追加を行ない、端末のメインアカウントをテストアカウントにする。

以下、実装の簡単な流れ

①Android In App Billing Pluginをインポート(※1)した後、
 最初のシーンにIABAndroidManagerプレハブとIABAndroidEventListenerを配置。
 DontDestroyOnLoadで死なないようにしておく。

②まずはIABAndroid.init(publicKey)でBillingServiceを起動します。
 引数にはデベロッパーコンソールで確認できる、自身のパブリックキーを入れます。
 IABAndroidEventListenerbillingSupportedEvent (bool isSupported)
 が非同期で呼ばれ、isSupporedには問題がなければtrueが入ってきます。

IABAndroid.purchaseProduct(productId)で購入リクエストを送信する。
 購入したいアイテムのプロダクトIDを引数に入れる。
 これでマーケットアプリが立ち上がり、アイテムの購入画面が表示される。
IAB01
④購入が正常に終わると、IABAndroidEventListener
 purchaseSucceededEvent (string productId, string developerPayload)
 が呼ばれるので、ここで対応するアイテム等をゴニョゴニョする。

⑤リストアの実装はIABAndroid.restoreTransactions()でリクエスト。
 IABAndroidEventListenertransactionsRestoredEvent()が呼ばれた後に、
 purchaseSignatureVerifiedEvent (Hashtable payload)(※2)と
 購入済みアイテムのpurchaseSucceededEvent (string productId, string developerPayload)が順次呼ばれる。
 purchaseSignatureVerifiedEventにはアイテムのステータスがJSON形式で入ってくる。
 参照の仕方はテストシーンを確認するとわかると思います。

⑥アプリケーションの終了時OnApplicationQuit()等の中で、
 IABAndroid.stopBillingService()でBillingServiceを終了する。

⑦その他のIABAndroidEventListener内イベント
purchaseFailedEvent (string productId, string developerPayload)
   購入エラー
purchaseCancelledEvent (string productId, string developerPayload)
  → 購入キャンセル
purchaseRefundedEvent (string productId, string developerPayload)
  → 購入払い戻し?
confirmationFailedEvent (string productId, string developerPayload)
  → 認証の失敗。googleCheckoutから手動で払い戻しをした時にも呼ばれる。
transactionRestoreFailedEvent (string error)
  → リストアエラー
purchaseSignatureVerificationFailedEvent (Hashtable payload)
  → prime31のドキュメントに載っていない。未使用?

 それぞれエラー対応や、使っているものがあれば対応する。


※1 他のAssetや独自でAndroidManifestをカスタムしている場合には、
 (Plugins→Android配下にAndroidManifest.xmlファイルがある場合)
 上書きされてしまうので、AndroidManifestだけはインポートしないでおき、
 元のAndroidManifestとprime31のAndroidManifestを手動でマージする必要があります。

※2 purchaseSignatureVerifiedEvent (Hashtable payload)は、リストア時以外にも、購入済みアイテムのステータスが変更された後などにも呼ばれたりします。(払い戻し時等)