うえすと開発メモ

タグ:アプリ内課金

以前とりあげたUnityでのAndroidアプリ内課金プラグインであるprime31のAndroid In App Billing Pluginですが、
AndroidのIn App Billingがversion3になって色々変わっていて、
プラグインの方も大きく変更されているので、新バージョンでの実装メモになります。

prime31
https://www.prime31.com/

今回も管理なしアイテムと、ユーザアカウント毎に管理のアイテムで試しました。

導入時のバージョンはUnity4.0.1、
プラグインのバージョン(公式サイトでのリリース日)は2013-01-21です。

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

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

※旧バージョンから移行する場合には、最初にPlugins配下の
 InAppBillingAndroid フォルダを削除する必要があります。

以下、実装の簡単な流れ

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

②まずは GoogleIAB.init( publicKey ) で初期化します。
 引数にはデベロッパーコンソールで確認できる、自身のパブリックキーを入れます。
 アプリ内購入が可能である場合には 
 GoogleIABEventListenerbillingSupportedEvent() が非同期で呼ばれ、
 アプリ内購入不可の場合は
 billingNotSupportedEvent( string error ) が呼ばれます。

③詳細なログ出力を行うかどうかを
 GoogleIAB.enableLogging( AndroidDetailLogging ) で設定し、
 署名の認証チェックを自動で行うかどうかを
 GoogleIAB.setAutoVerifySignatures( AndroidAutoVerifySignatures ) で設定します。

④ GoogleIAB.purchaseProduct( productId ) で購入リクエストを送信する。
 購入したいアイテムのプロダクトIDを引数に入れる。
 これでマーケットアプリが立ち上がり、アイテムの購入画面が表示される。
IAB01
⑤購入が正常に終わると、GoogleIABEventListener 
 purchaseSucceededEvent( GooglePurchase purchase ) 
 が呼ばれます。ここで対応するアイテム等をゴニョゴニョする。
 引数の GooglePurchase にはプロダクトIDやオーダーID等、
 購入レシートと同じ情報が含まれています。

⑥In App Billing version3では、消費タイプのアイテムは購入後に消費リクエストを投げないと
 追加購入ができなくなるので、
 GoogleIAB.consumeProduct( googlePurchase.productId ) で消費リクエストを送ります。

⑦正常に通れば、GoogleIABEventListener 
 consumePurchaseSucceededEvent( GooglePurchase purchase ) が呼ばれます。

⑧リストアの実装は GoogleIAB.queryInventory( productIdList.ToArray() )
 の引数にプロダクトIDリストを入れて呼ぶことで、
 queryInventorySucceededEvent( List<GooglePurchase> purchases, List<GoogleSkuInfo> skus )
 が呼ばれ、purchases に購入済みアイテム一覧が入っているので、この情報で復旧できます。

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

⑩その他のGoogleIABEventListener 内イベント
purchaseCompleteAwaitingVerificationEvent( string purchaseData, string signature )
  → 購入時のレシート通知イベント。GooglePurchaseと同じ情報ですが、 
    こちらはJSON形式になっています。(※version2のレシートとは形式が異なります)
purchaseFailedEvent( string error )
   購入エラー。キャンセルでも呼ばれます。
queryInventoryFailedEvent( string error )
  → 購入済アイテムの取得失敗。
consumePurchaseFailedEvent( string error )
  → 消費の失敗。

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

このエントリーをはてなブックマークに追加

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

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

iOS版はこちら

prime31
https://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)は、リストア時以外にも、購入済みアイテムのステータスが変更された後などにも呼ばれたりします。(払い戻し時等)

このエントリーをはてなブックマークに追加

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

Android版はこちら

prime31
https://www.prime31.com/

テストシーンが付属してあるので、そこで使われているソースを見るのが一番わかりやすいです。
ちなみにConsumableとNon-Consumableでしか試していません。
レシートの検証とAppleのHostingContentも使用していないです。
導入時のバージョンはUnity3.5.6、プラグインのバージョンは1.3.3です。

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

※前準備として事前に、itunes connectにてアプリと課金アイテムの登録、
 テストユーザの追加を行ない、端末のAppleIDをログアウトしておく。

以下、実装の簡単な流れ

①iOS StoreKit In App Purchase Pluginをインポートした後、
 最初のシーンにStoreKitManagerプレハブとStoreKitEventListenerプレハブを配置。
 DontDestroyOnLoadで死なないようにしておく。

②アプリ内購入を開始する前にStoreKitBinding.canMakePayments()で、
 アプリ内購入の制限がかかっていないか確認する。
 制限がかかっている場合はダイアログなどで「設定→一般→機能制限→App内での購入」
 をオンにするよう促してあげると親切かも。

StoreKitBinding.requestProductData(string[] productIdentifiers)でアイテムの情報を取得する。
 取得したいアイテムのプロダクトIDを配列で引数に入れる。
 通信は非同期で行われ、問題なければStoreKitEventListener
 productListReceived( List<StoreKitProduct> productList )が呼ばれ、
 アイテム情報が取得できる。

④購入リクエストをStoreKitBinding.purchaseProduct(string productIdentifier, int quantity)で投げる。
 1番目の引数はプロダクトIDを、2番目は個数なので通常は1でよいかと。
 これでネイティブ側のアプリ内購入ダイアログが表示される。
 (初回はログインダイアログがでるので、事前登録したテストユーザでログインする)
写真
⑤購入が正常に終わると、StoreKitEventListener
 purchaseSuccessful( StoreKitTransaction transaction )が呼ばれるので、
 ここで対応するアイテム等をゴニョゴニョする。

⑥リストアの実装はStoreKitBinding.restoreCompletedTransactions()でリクエスト。
 StoreKitEventListenerrestoreTransactionsFinished()が呼ばれた後に、
 購入済みアイテムのpurchaseSuccessful( StoreKitTransaction transaction )が順次呼ばれる。

⑦その他のStoreKitEventListener内イベント
purchaseFailed( string error )
  
 購入エラー
purchaseCancelled( string error )
  
→ 購入キャンセル
productPurchaseAwaitingConfirmationEvent( StoreKitTransaction transaction )
  
→ トランザクションの完了待ち
    ※デフォルトではプラグイン側で終了させてるっぽい
restoreTransactionsFailed( string error )
  
→ リストアエラー
paymentQueueUpdatedDownloadsEvent( List<StoreKitDownload> downloads )
  
→ ホスティングシステムのDL状況
receiptValidationSuccessful()
  
→ レシートの検証完了
receiptValidationRawResponseReceived( string response )
  
→ レシートの検証レスポンス
receiptValidationFailed( string error )
  
→ レシートの検証エラー

このエントリーをはてなブックマークに追加

このページのトップヘ