Unityでアイテムの課金処理よろしく、と言われた人向け事前知識

概要

突然開発中のiOS,AndroidマルチプラットフォームUnityアプリでアイテム課金を任された場合に知っておいた方が後々楽できそうな知識をまとめておきます。嘘ついてたら教えてください。
また、ステージ買い切りとかサーバプログラマ無しでのインディーゲームなどは考慮しません。
その場合は普通にUnityIAP sampleを使うのが良い気がします。
普通のUnityIAPはちょっと古いけどこのサンプルプロジェクトが参考になると思います。
https://github.com/unity3d-jp/UnityChanBallRoll

Unityアイテム課金のための各ストアへのアイテム登録

  • AppStoreおよびGooglePlaystoreのアプリ登録を済ませておく(地味に住所入れ忘れとか、アプリ概要欄が「あ」だけだったせいでスパムと思われて登録が完了しないなどのトラップがある)
  • AppStoreおよびGooglePlaystoreにアイテムと価格を登録する。本当に重要なのはproductIDと価格だけです。このときに 100_coin_androidや100_coin_iosの様に各プラットフォーム識別が出来る形でアイテム名を登録しましょう。後で購入問い合わせ来るときに有ると無いで全然違う…

購入処理を書く

上に挙げたUnityChanBallRollサンプルみたいなアイテムの課金処理を書いて運用するとどうなるかというと、チートされる余地が結構あったり、ユーザさんから購入失敗問い合わせが来た時にめっちゃつらい目に遭います。

これは何故かというと各ストア(AppStore,GooglePlayStore)に対してUnityIAPのメソッドを叩いて購入処理すると、直接ストアに購入処理が入ってしまうためです。
この記事を読んでいるような人が作るアプリだと

  • ユーザ識別子がほしい
  • 「購入ボタンを押した」ごとに一意の取引識別子がほしい
  • 購入失敗時もその原因込みで情報が欲しい
  • それら情報を自社サーバに貯めておきたい

と言う事になりがちです。それは先のサンプルには入っていないので自前で実装する必要があります。つらいっすよね…

どうすると良いの

Autoya使いましょう。

https://github.com/sassembla/Autoya

AutoyaのPurchaseモジュールが上に挙げたような諸々の処理を含んでいて、後は以下のドキュメントを見ながら作ればクライアントサイドは何とかなります。

サーバサイドは誰かに任せましょう。

https://sassembla.github.io/Autoya/docs/en/purchase0.html

チート対策やお問い合わせ対応をする上で欲しい情報や、処理を書き込む口がちゃんと用意されている素敵フレームワークです。

Autoya Purchaseモジュール補足

上にあるAutoya Purchaseモジュールのドキュメントは詳しく書いてある+実運用上の知見も詰まっていますが、いくつか(課金処理を初めて触る人向けの)補足説明があった方が読み解きやすいかもしれません。ここで説明します。

Remote PurchaseとLocal Purchaseはどっちを選ぶの?

アイテムの課金があったら現実的にチート、問い合わせ対応が必要になるので サーバ有り Remote Purchase を使いましょう。
Local Purchaseを使うのはサーバエンジニアが居なくて、クライアントエンジニアがチート対策を分かっているかチートを諦める場合だけです。

なので、上のAutoyaドキュメントのRemote部分だけを読みましょう。
問い合わせ件数はLocalでもRemoteでも変わりませんが、解決するまでのコストを考えるとRemoteを選ぶべきです。

ProductInfoって何を書くの

AutoyaFramework.Purchase.ProductInfoですが
productIDを100_coinみたいな名前で、platformProductIdが100_coin_androidみたいな識別子を付けた名前が来ることを前提としています。
また、

Autoya.Purchaseに入れる商品名の引数は
100_coinのような、_androidや_iosを入れていない方の名前が来ることを前提にしています。

//こんな感じ!
Autoya.Purchase(
                purchaseId,
                "100_coin",
                pId =>
                {

Autoyaの課金処理を使うときは他のUnity用IAP周りの何か設定しなくて良いの?IAP ButtonとかIAP catalogで商品名作ったりとか…

そういうのは、やらなくて良いです 。サーバ側でそういうロジックは作っちゃうのでクライアント側はAPI呼ぶのと返事を処理する口を作るのが大切です。その辺はAutoya Documentを読んでください。

IAB-DPTLエラーが出て買えない

Android+Autoya で購入時IAB-DPTLエラーが出て買えない→payloadが長すぎるかも。
OverridePoint.csのprivate IEnumerator OnBootAuthResponse 内で

   var isValidResponse = true;
            if (isValidResponse)
            {
                data = "sample_auth";//ここを追加
                Autoya.Persist_Update(AuthSettings.AUTH_STORED_FRAMEWORK_DOMAIN, AuthSettings.AUTH_STORED_TOKEN_FILENAME, data);
            }
            else
            {
                bootAuthFailed(-1, "failed to boot validation.");
            }
            yield break;

こんな感じの追加が必要かも。
https://stackoverflow.com/questions/10194120/android-in-app-billing-error-this-item-could-no-be-purchased-error-code-iab

無言で購入失敗する

https://forum.unity.com/threads/solved-unity-iap-is-not-worked-for-android-device.501881/

クローズドアルファテストしているとき、開発者アカウントじゃなくてテストアカウントを追加して課金できるかを確認しましょう。僕はこれで半日潰しました。