[Unity] Prime31 IAP, IABの実装

こんにちは。

今回は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日程度かかりました。

AD