Version: 2019.1
Unity IAP Xiaomi インテグレーションガイド
ストアの実装

Unity Channel SDK と API 拡張

Unity Channel API

UnityEngine.Store 名前空間

AppInfo クラス

AppInfo クラスは、クライアントからサーバーへの通信と認証に必要なクライアントと Xiaomi の認証情報を格納します。

キー 説明
appID string Xiaomi App ID
appKey string Xiaomi App Key
clientID string Unity Client ID
clientKey string Unity Client Key
debug bool デバッグモードに切り替え

ILoginListener インターフェース

Mi Game Center でアプリケーションをパブリッシュするには、必ず ILoginListener を通してログインする必要があります。

キー 説明
OnInitialized () void 初期化が成功したときに呼び出されます
OnInitializedFailed (string message) void 初期化が失敗したときに呼び出されます
OnLogin () void ログインが成功したときに呼び出されます
OnLoginFailed (string message) void ログインが失敗したときに呼び出されます

StoreService クラス

Unity IAP は内部で StoreService クラスを使って Unity Channel SDK を初期化します。

キー 説明
static Initialize (AppInfo appInfo, ILoginListener loginListener) void Unity Channel SDK を初期化します
static Login (AppInfo appInfo, ILoginListener loginListener) void Xiaomi アカウントにログインします

UserInfo クラス

Unity Channel に正常にログインすると UserInfo クラスを返します。返されたデータは、情報として使用します。

キー 説明
channel string 使用中のチャンネルを示します (現在 XIAOMI のみ)
userID string Channel の一意のユーザー ID
userLoginToken string ユーザーログインを認証します (Xiaomi IAP インテグレーションガイドのサーバー側の初期化のセクションを参照)

UnityEngine.ChannelPurchase 名前空間

IPurchaseListener インターフェース

Unity IAP は内部的に IPurchaseListener インターフェースを使用し、購入のアクティビティを処理します。

購入フローのさまざまな状態を処理するために IPurchaseListener クラスを実装します。

using UnityEngine.ChannelPurchase;
......
private class ExamplePurchaseListener : IPurchaseListener{
    public void OnPurchase (PurchaseInfo purchaseInfo){
        Debug.Log ("Purchase Succeed: " + purchaseInfo.gameOrderId);
    }
    public void OnPurchaseFailed (string message, PurchaseInfo purchaseInfo){
        Debug.Log ("Purchase Failed: " + message);
    }
    public void OnPurchaseRepeated(string productCode){
        Debug.Log ("Purchase Repeated");
    }
    public void OnReceiptValidate (ReceiptInfo receiptInfo){
        Debug.Log ("Validate Succeed");
    }
    public void OnReceiptValidateFailed (string gameOrderId, string message){
        Debug.Log ("Validate Failed");
    }
    public void OnPurchaseConfirm (string gameOrderId){
        Debug.Log ("Confirm Succeed");
    }
    public void OnPurchaseConfirmFailed (string gameOrderId, string message){
        Debug.Log ("Confirm Failed");
    }
}
キー 説明
OnPurchase () void 購入が成功すると呼び出されます
OnPurchaseFailed (string message, PurchaseInfo purchaseInfo) void 購入が失敗すると呼び出されます
OnPurchaseRepeated (string productCode) void 非消費型のプロダクトが再購入されると呼び出されます
OnReceiptValidation (ReceiptInfo receiptInfo) void PurchaseService.ValidateReceipt (...) が成功すると呼び出されます
OnReceiptValidationFailed (string gameOrderID, string message) void PurchaseService.ValidateReceipt (...) が失敗すると呼び出されます
OnPurchaseConfirm (string gameOrderId) void 非推奨
OnPurchaseConfirm (string gameOrderId, string message) void 非推奨

PurchaseService クラス

Unity IAP は、購入アクティビティを始めるために、最初に PurchaseService クラスを使用します。

PurchaseListener が実装されると、購入トランザクションを実行するために PurchaseService.Purchase メソッドが呼び出されます。

using UnityEngine.ChannelPurchase;
......
    var myPurchaseListener = new ExamplePurchaseListener ();
    PurchaseService.Purchase ("Product ID", "Game Order ID", myPurchaseListener);

Product IDs は Xiaomi Developer Portal に表示されます。アプリケーションをデバッグモードで実行する場合は、Product ID も、 MiGameProductCatalog.prop ファイルにエクスポートされます。Game Order ID は null でも可能です (Unity Channel SDK が UUID を生成します)。

キー 説明
static Purchase (string productCode, string gameOrderId, IPurchaseListener productListener) void プロダクトを購入
static ValidateReceipt (string gameOrderId, IPurchaseListener purchaseListener) void 購入を検証
static ConfirmPurchase () void 非推奨 (代わりに ValidateReceipt (...) を使用してください)

PurchaseInfo クラス

購入後に PurchaseService.ValidateReceipt メソッドを呼び出して検証します。

    PurchaseService.ValidateReceipt(gameOrderId, myPurchaseListener);

gameOrderId が有効である場合は myPurchaseListenersignDatasignature を含む ReceiptInfo を受け取ります。Unity Channel はこれを購入の検証に使用します。

キー 説明
productCode string プロダクトの一意の ID (Xiaomi Developer Portal で直接設定することもできます)
gameOrderId string 注文の購入 ID
orderQueryToken string 購入の検証に使用します

ReceiptInfo クラス

検証は通常ゲームサーバー上で発生します。ただし、signData はクライアント側でも検証できます。

キー 説明
gameOrderId string 注文の購入 ID
signData string 購入の詳細を含む JSON 文字列
signature string signData の署名

レシート検証と拡張 API

このセクションの前に Unity IAP レシート検証 を参照してください。また、UnityEngine.Purchasing Scripting API も参照してください。

UnityEngine.Purchasing 名前空間

IUnityChannelConfigurationIUnityChannelExtensions インターフェースはアプリケーションストアレシートからデータを抽出するための拡張機能を提供します。

購入時に IAP の CrossPlatformValidator クラス (レシート検証 を参照) と IUnityChannelExtensions.ValidateReceipt メソッド (詳細は後述) を使用して、ローカルのレシート検証を実行します。

検証を実装する前に、Xiaomi のレシート難読化を有効にします。

  1. App Store Settings (Xiaomi インテグレーションガイドアプリケーションストアの設定 セクション参照)、または、Unity Client Settings ダッシュボード からアプリケーションの Client RSA Public Key (クライアント RSA 公開鍵) を取得します。
  2. Unity エディターで、Unity Channel キーを Unity IAP Receipt Validation Obfuscator ウィンドウ (Window > Unity IAP > Receipt Validation Obfuscator) に入力します。このウィンドウはレシート検証のために、プロジェクトのパブリックキーの収集、難読化、格納を行います。
  3. Receipt Validation Obfuscator ウィンドウで Obfuscate Unity Channel Public Key をクリックして、その結果生成される UnityChannelTangle データファイルをプロジェクトに保存します。
Receipt Validation Obfuscator ウィンドウ。CrossPlatformValidator で使用するプロジェクトのデータクラスを生成します。
Receipt Validation Obfuscator ウィンドウ。CrossPlatformValidator で使用するプロジェクトのデータクラスを生成します。

IUnityChannelConfiguration インターフェース

購入時に Unity Channel から必要なレシートデータを自動的に取得するには、Unity IAP を初期化するときに IUnityChannelConfiguration.fetchReceiptPayloadOnPurchasetrue に設定します。これにより、正常な購入後 (理想的には PurchaseEventArgspurchasedProduct.receipt フィールドが IStoreListener.ProcessPurchase 成功のコールバックを送信するとき) に IUnityChannelExtensions.ValidateReceipt が内部で呼び出されます。

ノート: fetchReceiptPayloadOnPurchase フラグを true に設定すると、購入が成功した後に暗号化したレシートデータを取得するネットワーク要求が発生します。この 2 番目のネットワーク要求が何らかの理由で失敗した場合、 ProcessPurchase 成功のコールバックは無効なレシートを持つプロダクトを受け取ります。

CrossPlatformValidator.Validate API を通して purchasedProduct.receipt データを渡すと、IPurchaseReceipt が返されます。これは、完全に検証されたレシートです。結果が空の場合、検証は失敗したということです。 以下の例を参照してください。

CrossPlatformValidator validator = new CrossPlatformValidator (GooglePlayTangle.Data(), AppleTangle.Data(), UnityChannelTangle.Data(), Application.identifier);

var result = validator.Validate(purchasedProduct.receipt);
キー 説明
fetchReceiptPayloadOnPurchase bool 購入の際に、自動的に Unity Channel レシートデータを収集します

IUnityChannelExtensions インターフェース

購入を確認しレシートを検証するには IUnityChannelExtensions インターフェースを使用します。上記のメソッドのコールバックは、成功を示すブール値、signData 文字列、signature 文字列を返します ChannelPurchase.ReceiptInfo のセクションを参照)。

ノートValidateReceipt ()中間者攻撃 (man-in-the-middle attacks) に対して脆弱です。セキュリティを強化するためにクライアント RSA 公開鍵を使用します (Xiaomi IAP インテグレーションガイドアプリケーションストアの設定 セクションを参照)。

キー 説明
ConfirmPurchase (string transactionID, Action<bool, string, string>, callback) void 既に行った購入の購入状態を取得します (特に、ゲームの中断やネットワークのタイムアウトが発生した場合に、購入履歴の確認に使用します。)
ValidateReceipt (string transactionID, Action<bool, string, string>, callback) void 指定した transactionID のレシートを検証します

UnifiedReceipt クラス

UnifiedReceipt クラスは、Unity IAP が理解できるストア特有のトランザクションデータを持っています。下の例はひとかたまりのレシートの文字列からデータを抽出する方法を示しています。

var unifiedReceipt = JsonUtility.FromJson<UnifiedReceipt>(purchEvtArg.purchasedProduct.receipt)
キー 説明
Payload string さまざまなストアから異なる形式で返されたレシートのための Unity IAP のラッパー
Store string 購入したストア
TransactionID string 一意のトランザクション ID

UnityChannelPurchaseReceipt インターフェース

データがひとかたまりになったレシートから、Unity Channel レシートにデータを抽出するには UnityChannelPurchaseReceipt を使用します。下の例を参照してください。

var ucReceipt = JsonUtility.FromJson<UnityChannelPurchaseReceipt>(unifiedReceipt.Payload)

この追加 Unity Channel レシートデータは情報を得る目的で使用します。

キー 説明
productID string 購入したプロダクトの一意の ID
transactionID string 一意のトランザクション ID
orderQueryToken string 注文クエリトークン

ランタイムのストア確認

以下のコードスニペットの ブール値を利用して、ゲームのランタイムに Xiaomi アプリストアがアクティブストアになっているかを確認できます。

var module = StandardPurchasingModule.Instance();
bool m_IsUnityChannelSelected =
    Application.platform == RuntimePlatform.Android &&
    module.androidStore == AndroidStore.XiaomiMiPay;
Unity IAP Xiaomi インテグレーションガイド
ストアの実装