# Direct to コンシューマー (D2C)支払いプロバイダー ワークフローの統合

> このワークフローに従って、D2C支払いプロバイダーをアプリケーション内課金(IAP)と統合し、ユーザーにIAP製品を提供および販売する方法と場所をコントロールできるようにします。

このガイドでは、D2C 決済プロバイダーを Unity のアプリケーション内課金 (IAP) と統合するための終了ーの概要を説明します。このワークフローでは、Unity Dashboard を使用してストアを設定する方法から、必要なクライアントサイドとサーバーサイドのロジックを実装する方法まで、オフプラットフォームのトランザクションを促進するために必要な基本的な手順について説明します。このシーケンスに従うことで、プレイヤーの一貫した購入体験を確保しながら、Unity Gaming Services (UGS) 環境と選択した支払いゲートウェイ間の安全な通信を維持できます。

このインテグレーションでは、MoR(Commerty of Record)として機能するD2C支払いプロバイダーを使用します。つまり、支払いプロバイダーは、税務コンプライアンス、不正防止、紛争、カスタマー サポートのサポートなど、支払いの処理に関する法的責任を担います。MoRとして支払いプロバイダーを活用することで、オフプラットフォーム トランザクションの運用オーバーヘッドとコンプライアンスの負担を大幅に削減できます。

Unity IAP(アプリケーション内課金)をD2C支払いプロバイダーと統合するには、以下の手順を実行します。

1. [Unity エディターで環境を設定する](#configure-your-environment-in-the-unity-editor)
2. [リモートカタログの作成](#create-your-remote-catalog)
3. [開始シーケンスをハンドルするサービスの初期化](#initialize-services-to-handle-the-start-up-sequence)
4. [リモートカタログの取得](#fetch-your-remote-catalog)
5. [購入処理用のWebhookまたはCloud Codeモジュールの構成(任意)](#configure-a-webhook-or-cloud-code-module-for-purchase-fulfillment-\(optional\))
6. [支払いプロバイダーの設定](#configure-your-payment-provider)
7. [ルーティングルールの設定](#configure-your-routing-rules)
8. [フルフィル購入](#fulfill-purchases)
9. [インテグレーションのテスト](#test-your-integration)

> **Important:**
>
> Apple と Google は、一部の地域で外部ウェブとサードパーティ製のなりま適格性、料金、および技術要件はプラットフォームや地理的市場によって異なるため、各プラットフォームと地域の要件に従う必要があります。

## 前提条件##prerequisites

D2C支払いプロバイダーをIAPと統合するには、以下の要件を満たす必要があります。

* Unityエディター2022.3以降がインストールされている(Unity 6.0以降を推奨)。ターゲット プラットフォーム用のビルド サポート モジュールあり。例えば、
  * Android ビルドサポート
  * iOS ビルドサポート
* [Unity プロジェクトに接続](/iap/get-started.md#enable-and-configure-the-iap-service-for-your-project)されたクラウドプロジェクト。

以下のパッケージがインストールされている必要があります。

* IAP v5.4 をインストールします。
  * 詳細は、「 [IAP バージョン 5](../upgrade-to-iap-v5) へのアップグレード 」を参照してください。
* [Unity Authentication](/authentication.md)をインストールして設定し、プレイヤーIDを管理する。
* [Deployment](https://docs.unity3d.com/Packages/com.unity.services.deployment@latest)パッケージをインストールして、製品カタログを展開します。

> **Important:**
>
> 推奨されるベストプラクティスは、認証メソッドとして匿名ログインを使用しないことです。匿名ログインはセッショントークンが失われた後も購入が保持されないためです。アプリケーションで円滑なプラットフォーム固有のプロバイダーが利用できない場合は、[匿名認証とリンク](/authentication/anonymous-auth-and-linking.md)を参照してください。

## Unity エディターでの環境の設定##configure-your-environment-in-the-unity-editor

Unity エディターで設定した環境は、コードで Unity Gaming Services を初期化した後に Unity Iap を実行する場所を定義します。環境を設定するには、次の手順に従います。

1. Unity エディターで、**編集** (Edit) > **Project Settings** (プロジェクト設定) > **Services (サービス**) > **Environments (環境**) を選択します。
2. IAP を実行するターゲット環境を選択します。**開発**、**ステージング**、または**本番**。

## リモートカタログの作成##create-your-remote-catalog

支払いプロバイダーを使用するには、Unity Iap リモート Catalog サービスに製品カタログをアップロードする必要があります。リモートカタログサービスを使用すると、新しいバージョンをインストールすることなく、ユーザーに最新の製品を提供できます。リモートカタログを作成するには、以下の行います。

1. Unity Iap 製品カタログを作成します。
2. カタログをリモートカタログサービスにアップロードします。

詳細については、[リモートカタログの作成](./configure-remote-catalog.md) を参照してください。

## 開始シーケンスをハンドルするサービスの初期化##initialize-services-to-handle-the-start-up-sequence

IAP の起動シーケンスをハンドルするために Unity Gaming Services（UGS）を初期化するスクリプトを作成します。このスタートアップスクリプトは、UGS を初期化し、Authenticationイベントを処理し、プレイヤーをサインインしてから、IAP 初期化をトリガーします。

詳細とコード例については、「 [サービスの初期化](./initialize-services.md)による開始シーケンスのハンドル 」を参照してください。

## リモートカタログの取得##fetch-your-remote-catalog

`StoreController`に接続して、展開したリモートカタログを明示的にフェッチするスクリプトを作成する必要があります。このスクリプトを[初期化スクリプト](#initialize-services-to-handle-the-start-up-sequence)と同じゲームオブジェクトにアタッチ、設定、添付します。

詳細とコード例については、「 [リモートカタログの取得](./fetch-remote-catalog.md) 」を参照してください。

## 購入処理用のWebhookまたはCloud Codeモジュールの構成(任意)##configure-a-webhook-or-cloud-code-module-for-purchase-fulfillment-(optional)

Unity Iap は、Apple や Google がストアのエンタイトルメントをハンドルする方法と同様に、オフプラットフォームの決済プロバイダーのエンタイトルメントを管理します。バックエンドとの購入の同期やサーバー権限エンタイトルメントの使用が必要な場合は、WebhookまたはCloud Codeモジュールを設定して購入イベントを受け取ることもできます。

詳細については、「[Configure a webhook](./configure-fulfilment.md) or Cloud Code module for purchase fulfillment」モジュールを参照してください。

## 支払いプロバイダーの設定##configure-your-payment-provider

IAPに使用するサポート対象の支払いプロバイダーは、価格モデルやコンテンツ タイプなどのビジネス要件に基づいて選択できます。外部の支払いプロバイダーとの価格設定の管理および合意は、お客様の責任において行ってください。

コンテンツ タイプと制限の詳細については、各支払いプロバイダーのドキュメントを参照してください。

* [ストライプ:禁止および制限されたビジネス](https://stripe.com/en-th/legal/restricted-businesses)
* [Coda：禁止コンテンツ ポリシー](https://www.coda.co/prohibited-content-policy/)

詳細については、「[支払いプロバイダーの設定](./configure-payment-provider.md)」を参照してください。

## ルーティングルールの設定##configure-your-routing-rules

支払いプロバイダーをアクティベートするには、プロバイダーのルーティング ルールを定義する必要があります。ルーティングでは、特定のプレイヤー属性をターゲットにして、各プレイヤーに表示する支払いプロバイダーと、その表示順序を決定できます。

詳細については、「 [Add routing rules](./routing.md) 」を参照してください。

## 購入の履行##fulfill-purchases

プレイヤーが購入を完了すると、Unity Iap は注文を作成し、その履行状態を追跡します。プレイヤーに購入を許可した後で、購入を確定 (履行) する必要があります。

> **Important:**
>
> 独自のバックエンド システムでエンタイトルメントも管理している場合でも、Unity Iap で注文を履行済みとしてマークする必要があります。消費型製品の場合、Unity Iapは、前回の注文が満たされるまでプレイヤーが同じ項目を再度購入することを防止します。

以下の方法で、注文を履行済みとしてマークできます。

| **メソッド**                                                                          | **どのような場合に使用するか**                                                       | **ソリューションの成果**                                                           |
| --------------------------------------------------------------------------------- | ----------------------------------------------------------------------- | ------------------------------------------------------------------------ |
| [SDK を使用](#fulfill-purchases-through-the-sdk)                                     | ゲームはクライアント側にエンタイトルメントを付与し、サーバー権限は優先されません。                               | ゲームクライアントはクライアント側で購入を確認し、IAP サービスを信頼できるソースとして使用します。                      |
| [SDK に沿ったサーバー検証](#fulfill-purchases-with-both-the-sdk-and-server-side-validation) | ゲームではサーバー側の検証が必要ですが、Webhook の管理は避けたい。                                   | バックエンドは、クライアントからの注文 ID を使用して、注文を満たす前に Unity Iap `GET API`から直接購入状態を取得します。 |
| [バックエンド API を使用](#fulfill-purchases-through-the-backend-api)                      | ゲームでサーバーが権限を持つエンタイトルメントを使用している。                                         | バックエンドは Webhook イベントを受信し、システムにエンタイトルメントを付与し、API を呼び出して注文を履行済みとしてマークします。  |
| [Cloud Code モジュールを使用](#use-a-cloud-code-module-to-fulfill-purchases)              | ゲームでは、独自のバックエンドインフラストラクチャを管理することなく、エンタイトルメントとフルフィルメントにサーバー側のロジックを使用します。 | ゲームで Cloud Code モジュールとエンドポイントを使用して、購入イベントをサーバー側でハンドルします。                 |

### SDK を通じた購入の履行##fulfill-purchases-through-the-sdk

Apple および Google での購入と同じメソッドを使用して、ゲームクライアントでの購入を確認します。プレイヤーにエンタイトルメントを付与した後、クライアントコードは各オーダーの `OnPurchasePending` コールバックと呼び出し`ConfirmPurchase`をハンドルする必要があります。これにより、注文が承認されてクローズされます。詳細については、Unity Iap の[購入](./purchases-sdk.md)に関するドキュメントを参照してください。

> **Important:**
>
> 支払いプロバイダーの場合は、`UnityIAPServices`または`StoreController`を呼び出すときにストア名 (`PaymentProvider.Name`) を指定する必要があります。`PaymentProvider.Name` は、ダイレクトツーコンシューマープロバイダーインテグレーションを指定し、プロバイダーのディスプレイ名を返しません。

#### SDK とサーバー側の検証の両方で購入を完了します##fulfill-purchases-with-both-the-sdk-and-server-side-validation

IAP SDK を使用して購入を行う場合でも、バックエンド API を呼び出して購入検証を行い、サーバーが権限を持つワークフローを実現できます。

詳細については、[Use server-side validation](./purchases-sdk.md#use-server-side-validation-alongside-the-sdk) along the SDK を参照してください。

### バックエンドAPIによる購入の履行##fulfill-purchases-through-the-backend-api

ゲームでサーバーが権限を持つエンタイトルメントを使用している場合は、エンタイトルメントを管理して購入を満たすためのバックエンドシステムを実装します。

詳細については、[バックエンドAPI](./implement-backend.md)による購入の完了を参照してください。

### Cloud Codeモジュールを使用して購入を完了##use-a-cloud-code-module-to-fulfill-purchases

ゲームでサーバーが権限を持つエンタイトルメントを使用している場合は、Cloud Code モジュールを使用して、購入イベントの検証、購入の実行、注文 API の呼び出しを行うことができます。

詳細については、「 [Use a Cloud](./cloud-code-fulfillment.md) Code module to fulfill Purchases 」を参照してください。

## インテグレーションのテスト##test-your-integration

インテグレーションをテストして、インテグレーションが機能し、ユーザーによる購入が正常に完了することを確認します。

詳細については、[インテグレーションのテスト](./test-integration.md) を参照してください。

## 外部購入のプラットフォームコンプライアンス##platform-compliance-for-external-purchases

Unity は、お客様に代わって Apple または Google プラットフォームのコンプライアンスを実行しません。外部購入品を出荷する前に、資格を判断し、各プラットフォームの要件を満たす必要があります。Unity は、独自のフローの実装に役立つコンプライアンス コールバック(`SetComplianceCheck`)と Webhook トランザクション トークンを提供します。

詳細については、「 [Comply with Apple and](./external-purchase-compliance.md) Google 外部購入要件 」を参照してください。

## 機能のサポート##feature-support

IAP は現在以下の機能をサポートしていません。

* D2C 決済プロバイダーを通じたサブスクリプション。
* D2CトランザクションのUnity Analyticsサポート。
* AppleおよびGoogleのネイティブ購入のマネージエンタイトルメント。
* ユーザーに対する代替課金の選択肢。
