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;
Did you find this page useful? Please give it a rating:
Thanks for rating this page!
What kind of problem would you like to report?
Thanks for letting us know! This page has been marked for review based on your feedback.
If you have time, you can provide more information to help us fix the problem faster.
Provide more information
You've told us this page needs code samples. If you'd like to help us further, you could provide a code sample, or tell us about what kind of code sample you'd like to see:
You've told us there are code samples on this page which don't work. If you know how to fix it, or have something better we could use instead, please let us know:
You've told us there is information missing from this page. Please tell us more about what's missing:
You've told us there is incorrect information on this page. If you know what we should change to make it correct, please tell us:
You've told us this page has unclear or confusing information. Please tell us more about what you found unclear or confusing, or let us know how we could make it clearer:
You've told us there is a spelling or grammar error on this page. Please tell us what's wrong:
You've told us this page has a problem. Please tell us more about what's wrong:
Thank you for helping to make the Unity documentation better!
Your feedback has been submitted as a ticket for our documentation team to review.
We are not able to reply to every ticket submitted.