AppInfo
クラスは、クライアントからサーバーへの通信と認証に必要なクライアントと Xiaomi の認証情報を格納します。
キー | 型 | 説明 |
---|---|---|
appID | string | Xiaomi App ID |
appKey | string | Xiaomi App Key |
clientID | string | Unity Client ID |
clientKey | string | Unity Client Key |
debug | bool | デバッグモードに切り替え |
Mi Game Center でアプリケーションをパブリッシュするには、必ず ILoginListener
を通してログインする必要があります。
キー | 型 | 説明 |
---|---|---|
OnInitialized () | void | 初期化が成功したときに呼び出されます |
OnInitializedFailed (string message) | void | 初期化が失敗したときに呼び出されます |
OnLogin () | void | ログインが成功したときに呼び出されます |
OnLoginFailed (string message) | void | ログインが失敗したときに呼び出されます |
Unity IAP は内部で StoreService
クラスを使って Unity Channel SDK を初期化します。
キー | 型 | 説明 |
---|---|---|
static Initialize (AppInfo appInfo, ILoginListener loginListener) | void | Unity Channel SDK を初期化します |
static Login (AppInfo appInfo, ILoginListener loginListener) | void | Xiaomi アカウントにログインします |
Unity Channel に正常にログインすると UserInfo
クラスを返します。返されたデータは、情報として使用します。
キー | 型 | 説明 |
---|---|---|
channel | string | 使用中のチャンネルを示します (現在 XIAOMI のみ) |
userID | string | Channel の一意のユーザー ID |
userLoginToken | string | ユーザーログインを認証します (Xiaomi IAP インテグレーションガイドのサーバー側の初期化のセクションを参照) |
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 | 非推奨 |
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 (...) を使用してください) |
購入後に PurchaseService.ValidateReceipt
メソッドを呼び出して検証します。
PurchaseService.ValidateReceipt(gameOrderId, myPurchaseListener);
gameOrderId
が有効である場合は myPurchaseListener
は signData
と signature
を含む ReceiptInfo
を受け取ります。Unity Channel はこれを購入の検証に使用します。
キー | 型 | 説明 |
---|---|---|
productCode | string | プロダクトの一意の ID (Xiaomi Developer Portal で直接設定することもできます) |
gameOrderId | string | 注文の購入 ID |
orderQueryToken | string | 購入の検証に使用します |
検証は通常ゲームサーバー上で発生します。ただし、signData
はクライアント側でも検証できます。
キー | 型 | 説明 |
---|---|---|
gameOrderId | string | 注文の購入 ID |
signData | string | 購入の詳細を含む JSON 文字列 |
signature | string | signData の署名 |
このセクションの前に Unity IAP レシート検証 を参照してください。また、UnityEngine.Purchasing Scripting API も参照してください。
IUnityChannelConfiguration
と IUnityChannelExtensions
インターフェースはアプリケーションストアレシートからデータを抽出するための拡張機能を提供します。
購入時に IAP の CrossPlatformValidator
クラス (レシート検証 を参照) と IUnityChannelExtensions.ValidateReceipt
メソッド (詳細は後述) を使用して、ローカルのレシート検証を実行します。
検証を実装する前に、Xiaomi のレシート難読化を有効にします。
購入時に Unity Channel から必要なレシートデータを自動的に取得するには、Unity IAP を初期化するときに IUnityChannelConfiguration.fetchReceiptPayloadOnPurchase
を true
に設定します。これにより、正常な購入後 (理想的には PurchaseEventArgs
のpurchasedProduct.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
インターフェースを使用します。上記のメソッドのコールバックは、成功を示すブール値、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
クラスは、Unity IAP が理解できるストア特有のトランザクションデータを持っています。下の例はひとかたまりのレシートの文字列からデータを抽出する方法を示しています。
var unifiedReceipt = JsonUtility.FromJson<UnifiedReceipt>(purchEvtArg.purchasedProduct.receipt)
キー | 型 | 説明 |
---|---|---|
Payload | string | さまざまなストアから異なる形式で返されたレシートのための Unity IAP のラッパー |
Store | string | 購入したストア |
TransactionID | string | 一意のトランザクション ID |
データがひとかたまりになったレシートから、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;