SDK を通じた購入の履行
プレイヤーが購入した製品の購入情報を取得し、購入状態を判別します。
読み終わるまでの所要時間 2 分最終更新 8日前
Unity Iap はストアから購入情報を取得するため、アプリケーションはプレイヤーが購入したものを認識し、処理できます。これにより、ユーザーがアプリケーション外や別のデバイスでアイテムを購入した場合でも、購入履歴に基づいてゲームからユーザーにコンテンツやエンタイトルメントを配信できます。
購入は
OrderOrder購入の取得
ユーザーによる購入はストアから取得できます。ただし、消費型製品は、消費後にアプリケーションによって追跡される必要があります。これは、すでに満たされた消耗品はストアから返却されないためです。非消費型製品およびサブスクリプションの場合、ストアはFetchPurchasesCheckEntitlement購入状態の確認
購入の状態は、次の 2 つの方法で確認できます。- を使用して、
OrderがOrder、PendingOrder、ConfirmedOrder、DeferredOrderのいずれであるかを判別します。FailedOrder - を受け取るには
EntitlementStatusを使用します。CheckEntitlement、EntitledButNotFinished、EntitledUntilConsumed、FullyEntitled、またはNotEntitledを返します。Unknown
購入属性
属性 | 説明 |
|---|---|
| 購入の一意の識別子。 |
| 購入したプロダクト |
| 購入した製品の数量。 |
| ストアでの購入を検証するためのレシートデータ。 |
購入の状態
State | 説明 |
|---|---|
| 購入は支払われましたが、まだ履行されていません。 |
| 購入が完了し、承認されました。 |
| エラーにより購入が失敗しました。 |
| 購入は支払いを待っています。 |
購入の処理
OnPurchasePendingOnPurchasePendingOnPurchasePending// Handle restore on initializationprivate async void Start(){ // Setup, e.g. add listeners to your StoreController... m_StoreController.OnPurchasePending += OnPurchasePending; m_StoreController.OnPurchasesFetched += OnPurchasesFetched; await m_StoreController.Connect(); // Fetch previous purchases (includes confirmed orders) m_StoreController.FetchPurchases();}// Handle new purchases and pending transactionsprivate void OnPurchasePending(PendingOrder order){ ProcessPurchase(order);}// Handle fetched purchases (includes previously confirmed orders)private void OnPurchasesFetched(オーダーオーダー){ Foreach (var confirmedOrder in orders.ConfirmedOrders) { if (confirmedOrder.CartOrdered.Items().FirstOrDefault()?.Product.definition.type != ProductType.Consumable) { // Mark non-consumable and subscription products as entitled on fetch, as they only need to be granted once MarkAsEntitled(confirmedOrder.CartOrdered.Items().FirstOrDefault().Product); } }}// Your ProcessPurchase logicprivate void ProcessPurchase(PendingOrder order){ Foreach (var product in order.CartOrdered.Items()) { // Grant product GrantProduct(product); } // Confirm the order to finalize the transaction m_StoreController.ConfirmPurchase(order);}
購入確認と信頼性
Unity Iap では、ネットワークの停止やアプリケーションのクラッシュが発生した場合でも確実に購入が履行されるように、購入を明示的に確認する必要があります。課金は行われたが履行されなかった場合、Unity Iap は次回の初期化時にアプリケーションに課金を配信します。このプロセスにより、購入フローが中断されたとき、またはアプリケーションがオフラインの間に購入が完了したときに、購入が失われるのを防ぎます。 購入を正常に完了したら、関連するPendingOrderConfirmPurchase購入がクラウドに永続化されたことを確認する
消費型購入をクラウドに保存する場合は、購入が正常に維持されたときにConfirmPurchasePending購入の復元
ユーザーがアプリケーションを再インストールしたりデバイスを切り替えたりしたときに、以前に所有していた製品やサブスクリプションへのアクセスを回復できるようにします。IAP がエンタイトルメントのレコードを取得し、アクセスを付与する方法を理解します。- ユーザーがアプリケーションを再インストールすると、Unity Iap は最初の呼び出し時に所有する製品を復元します。
StoreController.FetchPurchases() - IAP は、すべての購入(すべての状態)を含む オブジェクトで
Ordersリスナーを起動します。OnPurchasesFetched - 設定が
PurchaseService.ProcessPendingOrdersOnPurchasesFetchedに設定されている場合、IAP は満たされない購入ごとにtrueリスナーを呼び出します。OnPurchasePending - 同じセッションでの後続の呼び出しは、同じセッションですでに確認済みの注文の
FetchPurchases()をトリガーしません。OnPurchasePending
SDK でのサーバーサイド検証の使用
Unity IAP(アプリケーション内課金)SDKの使用中にバックエンドAPIを呼び出すことができます。このハイブリッド アプローチでは、プレイヤーに報酬を与える前に、Unityの記録に対してトランザクションを直接検証することで、サーバーが権限の役割を果たすことができます。標準のバックエンド API メソッドとは異なり、これはウェブフックのパブリックエンドポイントを公開する必要がないため、攻撃対象領域を減らし、サーバーインフラストラクチャを簡素化できます。クライアントサイドの実装
購入が開始されると、SDK はPendingOrderOrderInfo.TransactionIdバックエンド認証
サービスアカウントのキー ID と秘密鍵を使用して、トークン交換を実行し、ステートレス Bearer トークンを受け取ります。詳細については、「 ステートレストークンを使用した API の認証方法 」を参照してください。
以下のトークン交換エンドポイントを参照してください。
POST https://services.api.unity.com/auth/v1/token-exchange?projectId={projectId}&environmentId={envId}
注文の検証
バックエンドが Bearer トークンを取得したら、以下のリクエストで Unity Iap Order サービスをクエリします。このGET https://iap.services.api.unity.com/v1/projects/{projectId}/environments/{envId}/orders/{orderId}
orderIdTransactionId- アイテムを許可する前に、は
statusである必要があります。paid - には、基礎となるストライプチェックアウトセッション ID が含まれます (ストライプダッシュボードで相互リファレンスが必要な場合)。
paymentProviderResourceId
注文の履行と完了
以下のワークフローを参照して、サーバー権限で注文を完了します。- 状態が有料であることと、productSKUが予期される項目と一致することを確認します。
- プレイヤーのデータベースを新しいエンタイトルメントで更新。
- バックエンドが成功コードをクライアントに返したら、以下のいずれかの方法を使用して Unity Iap システムでトランザクションを完了します。
- APIによる注文の直接更新
- クライアント呼び出しをします。
m_StoreController.ConfirmPurchase(order)