Webshop を Unity ゲームに統合する
認証されたプレイヤー セッションで Unity ゲームから Webshop を開きます。
読み終わるまでの所要時間 5 分最終更新 8日前
UnityゲームからWebshopを開き、プレイヤーがアプリ内課金(IAP)カタログから製品を購入できるようにします。 Web ショップは、すでに設定した IAP カタログと支払いプロバイダーを使用します。プレイヤーは、ゲーム内のストアで別途購入しなくても、ウェブで購入を完了できます。 ショップを開くには、ボタンなどのゲーム内アクションを追加します。これにより、プレイヤーの認証済みセッションがアタッチされたショップURLが開きます。セッションは Webshop に対してプレイヤーを識別します。
前提条件
開始する前に、以下の前提条件を満たしていることを確認します。- アプリ内課金を統合するUnityプロジェクト。
- プロジェクト内のAuthentication SDK(バージョン3.7.1以降)。
- ターゲット環境内の Webshop。
shop.unity.com/{studio}/game/{slug}ゲームからウェブショップを開く
SDK ヘルパーの使用
Unity Iap SDK には、必要なパラメータとコンプライアンスチェックを使用して Webshop を開くためのRedirectToWebshopIPaymentProvidersExtendedPurchaseServiceRedirectToWebshopcatalogListingId// Open the front page UnityIAPServices.StoreController(PaymentProvider.Name).PaymentProvidersExtendedPurchaseService.RedirectToWebshop();// Open a specific product page UnityIAPServices.StoreController(PaymentProvider.Name).PaymentProvidersExtendedPurchaseService.RedirectToWebshop(catalogListingId: "your-listing-id");
オープン前にコンプライアンス承認が必要
コンプライアンス チェックで Webshop をゲートするには、RedirectToWebshopSetComplianceCheckfalsePurchasingUnavailableStoreController(PaymentProvider.Name).PaymentProvidersExtendedPurchaseService .SetComplianceCheck(async context => await ShowComplianceDialog(context));
Webshop を開く方法をコントロール
デフォルトでは、SDK は外部ブラウザーで Webshop を開きます。これを変更するには、リダイレクトする前に支払いプロバイダーのIPaymentProvidersExtendedPurchaseServiceSetWebshopPresentationMode(CheckoutPresentationMode)SetCheckoutPresentationMode手動での統合
SDK ヘルパーを使用できない場合は、Webshop URL を直接作成して開きます。 ボタンやその他のゲーム内アクションから Webshop を開くには、Webshop サービスからショップ URL を解決し、Application.OpenURLstorefront-linkGETデフォルトでは、サービスは環境の状態に基づいて URL を自動的に返します。https://webshop.services.api.unity.com/v1/projects/{projectId}/environments/{environmentId}/storefront-link
- 公開された本番環境では、公開中のストアフロント URL が返されます。ライブ URL は匿名で解決します。
- 非本番環境または未公開の本番環境では、短期間の下書きプレビュー URL が返されます。
source=draftインテグレーションは以下のAuthentication SDKトークンを使用します。https://webshop.services.api.unity.com/v1/projects/{projectId}/environments/{environmentId}/storefront-link?source=draft
- アクセストークンは、ドラフトプレビューの解決時にリクエストを承認します。
storefront-linkヘッダーでアクセストークンを送信します。Authorization: Bearer - セッショントークンはブラウザーでプレイヤーを認証します。ショップを開く直前に、短期間の、1回限りの使用に制限されたトークンをで除外し、そのセッショントークンを
GenerateRestrictedTokenAsyncクエリパラメーターとして解決済みURLに追加します。sessionToken
ショップを開いた後、URL からこれらのパラメータを削除し、ブラウザーでプレイヤーのセッションを維持します。セッションと持続性の詳細については、ゲームから Webshop を開く を参照してください。using System;using System.Collections;using System.Collections.Generic;using Unity.Services.Authentication;using UnityEngine;using UnityEngine.Networking;public class WebshopLauncher :MonoBehaviour{ // Replace these with the values from your Unity Cloud project and webshop configuration. const string ProjectId = "<your-project-id>"; const 文字列 EnvironmentId = "<your-environment-id>"; // API リクエストパスで使用 const 文字列 EnvironmentName = "production"; // ショップ URL で使用 const string StorefrontLinkEndpoint = "https://webshop.services.api.unity.com/v1/projects/{0}/environments/{1}/storefront-link"; // draftPreview: request source=draft to preview unpublished changes even on a live env. public void OpenShop(string locale, string currency, bool draftPreview = false) { StartCoroutine(OpenShopRoutine(locale, currency, draftPreview)); } IEnumerator OpenShopRoutine(string locale, string currency, bool draftPreview) { var signedIn = AuthenticationService.Instance.IsSignedIn; // The access token is required for draft previews; live storefronts open anonymously // and ignore any token sent.プレイヤーがサインインするたびに送信します。 if (draftPreview && !signedIn) { Debug.LogWarning("WebshopLauncher: draft preview requires the player to be signed in."); yield break; } // 1.Webshop サービスにストアフロント URL を問い合わせます。 var endpoint = string.Format(StorefrontLinkEndpoint, ProjectId, EnvironmentId); if (draftPreview) endpoint += "?source=draft"; using var request = UnityWebRequest.Get(endpoint); request.SetRequestHeader("Accept", "application/json"); if (signedIn) request.SetRequestHeader("Authorization", $"Bearer {AuthenticationService.Instance.AccessToken}"); yield return request.SendWebRequest(); if (request.result != UnityWebRequest.Result.Success) { デバッグ.LogError($"WebshopLauncher: storefront-linkリクエストが失敗しました" + $"({request.responseCode}): {request.error}"); yield break; } var link = JsonUtility.FromJson<StorefrontLinkResponse>(request.downloadHandler.text); if (link == null || string.IsNullOrEmpty(link.storefrontUrl)) { Debug.LogError("WebshopLauncher: storefront-link response did not contain a storefrontUrl."); yield break; } // 2.Webshop リダイレクト用の短期間の、1 回限りの使用制限付きトークンを最小にします。 var tokenOptions = new RestrictedTokenOptions { Services = new リスト<string> { "no-svc" }, // ID トークンは実際のサービスに対して使用できません SingleUse = true、 // 最初の更新時に Webshop によって消費されます TtlSeconds = 60, // リダイレクト直前に発生 }; var tokenTask = AuthenticationService.Instance.GenerateRestrictedTokenAsync(tokenOptions); yield return new WaitUntil() => tokenTask.IsCompleted); if (tokenTask.IsFaulted) { Debug.LogError($"WebshopLauncher: failed to generate restricted token: {tokenTask.Exception}"); yield break; } // 3.店を開けろ var sessionToken = tokenTask.Result.SessionToken; var shopUrl = BuildShopUrl(link.storefrontUrl, sessionToken, locale, currency); Application.OpenURL(shopUrl); } 静的文字列 BuildShopUrl(文字列 storefrontUrl、文字列 sessionToken、文字列ロケール、文字列通貨) { var url = storefrontUrl; url = AppendParam(url, "sessionToken", sessionToken); url = AppendParam(url, "projectId", ProjectId); url = AppendParam(url, "environment", EnvironmentName); url = AppendParam(url, "locale", locale); url = AppendParam(url, "currency", currency); return url; } 静的 文字列 AppendParam(文字列 URL, 文字列 キー, 文字列 value) { if (string.IsNullOrEmpty(value)) return url; var separator = url.Contains("?") ? '&' : '?'; return $"{url}{separator}{key}={UnityWebRequest.EscapeURL(value)}"; } Serializable class StorefrontLinkResponse { public string storefrontUrl; public bool live; }}
渡すロケールまたは通貨がない場合は、これらのパラメーターを省略します。デフォルトでは、IAP カタログはプレイヤーのブラウザーロケールを使用し、デフォルトは米ドル (USD) です。カタログのロケール処理の詳細については、「 カタログと Web ショップでの支払い 」を参照してください。
着信ディープリンクのハンドル
Webshop に Deeplink URL を設定すると、ショップはそのカスタム URL スキームを通じてプレイヤーをゲームに戻します。ショップは、購入後、およびプレイヤーが未認証のランディングページでConnect to game(ゲームに接続)を選択した場合に、返品ディープリンクを使用します。 リターン ディープ リンクを受信するには、デバイスにカスタム URL スキームを登録し、ランタイムに着信リンクをハンドルします。ショップが戻り URL を構築する方法の詳細については、「 ゲームから Webshop を開く 」を参照してください。URL スキームの登録
ダッシュボードの Deeplink URL フィールドで設定したのと同じスキームを宣言します。オペレーティング システムは、このスキームを使用してリンクをゲームにルートします。- iOS と macOS:編集> プロジェクト設定> プレイヤー> その他の設定> サポートされる URL スキーム でスキームを追加します。Unity は、ビルド時にそれをビルドしたアプリケーションの(
Info.plist) に書き込みます。ビルドごとに再生成される生成されたCFBundleURLTypesを手動で編集するよりも優先してください。Info.plist - Androidカスタムのメインマニフェストまたは Gradle マニフェストテンプレートを使用して、エントリーを持つ
<data android:scheme="mygame" />をアクティビティに追加します。intent-filter
ランタイムのリンクのハンドル
ゲームの実行中に到着するリンクのApplication.deepLinkActivatedApplication.absoluteURLショップはvoid Awake(){ // Links that arrive while the game is running. Application.deepLinkActivated += OnReturnFromWebshop; // Cold start: the deep link launched the game. if (!string.IsNullOrEmpty(Application.absoluteURL)) OnReturnFromWebshop(Application.absoluteURL);}void OnReturnFromWebshop(string url){ // Handle the post-purchase return: the shop appends ?status=success // (and playerId when available) after a completed purchase. if (new Uri(url).Query.Contains("status=success")) { // Purchase completed on the web — refresh the player's entitlements. } // The Connect to game sign-in link is reopened by the SDK automatically, // so it needs no handling here.}
status=successテストオープン
公開する前にドラフトプレビューをテストし、公開中のショップに対してテストを繰り返します。ドラフトをテストするには、draftPreview: trueOpenShopsource=draft- モバイルデバイスにゲームをビルドおよびインストールします。
- を呼び出してデバイスのシステムブラウザーを起動するゲーム内ボタンをトリガー。
OpenShop - ブラウザーで解決済みのストアフロントURLが開き、URLにロケールと通貨が入力されていることを確認します。下書きにすると、環境スコープのプレビュー URL が開きます。ライブ ショップがオープンします。
shop.unity.com/{studio}/game/{slug} - ショップが、未認証のランディングページではなく、認証済み製品リストを開くことを確認します。
- サンドボックスの購入を完了します。テスト認証情報については、該当する IAP 支払いプロバイダーのサンドボックスのドキュメントを参照してください。
- ドラフトが期待通りに機能したら、で
draftPreview: falseを呼び出し、公開中のショップに対してテストを繰り返します。OpenShop
sessionTokenprojectId