こんにちは。
今回はUnityのフレームワークの一つであるPrime31を使用して、アプリ内課金機能を実装してみました。
Prime31にはStoreKitとGoogle IABの2つのマネージャーが存在します。
それぞれ
#if UNITY_IOS || UNITY_IPHONE
#elif UNITY_ANDROID
#endif
を利用して統合マネージャーを構築した後、同じプロダクトキーを発行して関連商品の購入を制御する方式で進めました。
手順は以下の通りです。
1. Import Prime31 ( android : ver. 2.10 , ios : ver 2.15 )
Prime31の場合、iPhoneとAndroidのプラグインバージョンが異なりました。
2. Test IAP
var listProducts = new string[2]; listProducts[0] = "com.test.crystal100"; listProducts[1] = "com.test.crystal200"; StoreKitManager.productListReceivedEvent += ProductListReceived; //listen for purchase StoreKitManager.purchaseSuccessfulEvent += PurchaseSuccessful; StoreKitManager.purchaseFailedEvent += PurchaseFail; StoreKitManager.purchaseCancelledEvent += PurchaseCancelled; //Request product list StoreKitBinding.requestProductData(listProducts);
ソースを簡単に説明すると、
listProductsはiTunesで登録した製品IDです。該当部分をrequestProductDataすると、チェックを行い、存在するプロダクトかどうかを確認してくれます。
ProductListReceivedコールバックでデータをセットすれば完了です。
Purchase関数の場合は、IABとIAPを統一しました。
3. Test IAB
GoogleIAB.init( key ); GoogleIAB.setAutoVerifySignatures (true); GoogleIABManager.billingSupportedEvent += billingSupportedEvent; GoogleIABManager.billingNotSupportedEvent += billingNotSupportedEvent; GoogleIABManager.queryInventorySucceededEvent += queryInventorySucceededEvent; GoogleIABManager.queryInventoryFailedEvent += queryInventoryFailedEvent; GoogleIABManager.purchaseCompleteAwaitingVerificationEvent += purchaseCompleteAwaitingVerificationEvent; GoogleIABManager.purchaseSucceededEvent += purchaseSucceededEvent; GoogleIABManager.purchaseFailedEvent += purchaseFailedEvent; GoogleIABManager.consumePurchaseSucceededEvent += consumePurchaseSucceededEvent; GoogleIABManager.consumePurchaseFailedEvent += consumePurchaseFailedEvent;
4. New Class IAPManager -> include "GoogleIAB" , "StoreKitManager"
以下のディレクティブを利用して分岐処理を行いました。
#if UNITY_IOS
#elif UNITY_ANDROID
#endif
その後、purchase部分については共通コードで処理しました。
AndroidとiOSのプロダクトIDを合わせると管理が楽になります。
product_idはあまり多く作らず、種類別(ティア別)にいくつかだけ作成して、独自のデータベースで使い回すのがおすすめです。
5. 領収書チェックサーバーの実装
PHPを利用して処理しました。iOSの場合はtransaction IDだけ受け取ればバリデーションが可能ですが、Googleの場合はAPIを使用する必要があるため、client-id、secret-key、tokenが必要です。(準備することが多く、少し時間がかかります。)
5. 結論
進める中で最も時間がかかった部分があるとすれば、
Error
The item you requested is not available for purchase
というエラーです。
queryInventorySucceededEvent内に登録した商品リストは正常に入ってくることから、アプリとDeveloper Console間の接続はうまくいっているようです。しかし、該当エラーがずっと表示されていました。
これを解決するために、次のような対処を試みました。
1. APKのversion code、version nameのチェック(manifest内のversion code、version nameが一致している必要があります。)
2. パーミッション設定。
結局、解決しました。
まずテストしてうまくいかない原因を判断するためには、先にリンクを通じてダウンロードが可能でなければなりません。これはリンクを押したときに404 not foundが表示されてはいけません。(この場合はまだenable状態ではないようです。)私の場合、リンクが有効化されてからはうまく動作しました。リンクの有効化には1日程度かかりました。