# AppleおよびGoogleの外部購入要件への準拠

> AppleとGoogleでの外部購入に関するコンプライアンス責任と、それらを満たすためにUnityが提供するSDKとWebhookツールについて説明します。

外部購入では、Apple や Google のアプリケーション内課金ではなく、独自のウェブアウト (支払いプロバイダーなど) を通じてデジタルコンテンツを販売します。AppleとGoogleは、一部の地域でのみ、また[外部購入プログラム](https://developer.apple.com/documentation/storekit/external-purchase)(Apple)や[外部提供プログラム](https://developer.android.com/google/play/billing/externalcontentlinks)(google play)など、独自のプログラムルールの下でのみ、これを許可しています。適格性、手数料、開示、トランザクション レポートは、プラットフォーム、地域、アプリケーションによって異なります。地域によっては、これらの購入要件がほとんど必要ない場合もあります。

> **Important:**
>
> Unity はお客様に代わってプラットフォームコンプライアンスを実行しません。資格の判断、各プラットフォームのテクニカル要件とポリシー要件の遵守、必要に応じてAppleとGoogleにトランザクションを報告する責任があります。外部購入を出荷する前に、Apple と Google に直接問い合わせ、[プレリリース条件](./_index.md) を確認してください。

独自のコンプライアンスフローのビルドをヘルプするために、Unity は SDK フックと Webhook データを提供します。このページでは、責任の分担、コンプライアンス ステップのビルド順序モデル、実行できる具体的なアクションについて説明します。

このページは、D2C([Integrate Direct-to-コンシューマー](./workflow.md#platform-compliance-for-external-purchases))支払いプロバイダー ワークフローの一部です。ここで説明するコンプライアンス処理を追加する前に、[支払いプロバイダー](./configure-payment-provider.md)と[購入フロー](./purchases-sdk.md)を設定します。

## 責任分担##division-of-responsibilities

Unity は技術的な支援のみを提供します。支払いプロバイダーは、支払い処理、税務、紛争に関する記録商として機能しますが、AppleやGoogleプラットフォームのレポートはハンドルしません。プラットフォーム コンプライアンスはお客様の責任であり、Unity がお客様をプラットフォーム プログラムに登録することはありません。

### Unityの技術的な促進##unity's-technical-facilitation

支払いプロバイダーによる購入が完了すると、Unity がユーザーに代わってチェックアウト URL を開きます。デフォルトでは、デバイスの外部ブラウザーで開きます。アプリケーション内プレゼンテーション (`CheckoutPresentationMode.WebView`) を選択すると、Unity は代わりにそれをアプリケーション ブラウザーで開きます。Unity が注文を処理する仕組みの詳細については、[Unity が注文](#how-unity-creates-and-opens-an-order)を作成し開く方法を参照してください。

Unity は Apple の外部購入通知や Google の外部リンク API を呼び出しません。また、Unity がユーザーの適格性を判断することはありません。これらのプラットフォーム API は、[役割](#your-responsibilities)の説明に従って自分で呼び出します。

### お客様の責任##your-responsibilities

Unity は技術的な支援のみを提供します。以下のタスクを担当します。

* アプリケーションと地域が各プラットフォームの外部購入プログラムの対象となるかどうかを決定します。
* Appleの`ExternalPurchaseClient`とGoogleの`ExternalBillingProgramClient`により、購入の開始前に独自の適格性チェックと開示チェックを実行できます。
* AppleまたはGoogleが必要とするトランザクション トークンを、各プラットフォーム独自のAPIでAcquireおよびレポートします。

## Unity が注文を作成および開始する方法##how-unity-creates-and-opens-an-order

通常、支払いプロバイダーの購入は `PurchaseProduct(catalogListingId)` という 1 回の呼び出しで開始します。`catalogListingId` は[リモートカタログ](./configure-remote-catalog.md)でオファーを示します。購入には 2 つの基本的なステップがあり、最初のステップは自分で実行できます。

* `GenerateURL(catalogListingId, tokens)` はオーダーを作成し、チェックアウト URL をオープンせずに返します。
* `PurchaseProduct(catalogListingId)` によってチェックアウトが開きます。同じリストについてすでに `GenerateURL` を呼び出している場合は、その順序が再利用されます。そうでない場合は、トークンなしで注文自体を作成し、それを開きます。

`GenerateURL`は、URL を正面から必要とする場合（[開示または](#disclose-or-render-the-checkout-url)描画する場合）や、注文に[レポートトークンをアタッチ](#attach-and-report-transaction-tokens)する必要がある場合にだけ必要です。それ以外の場合は、`PurchaseProduct` を直接呼び出します。

## コンプライアンスフローに必要なものを決定する##decide-what-your-compliance-flow-needs

残りのセクションは独立しています。以下の表に、アプリケーションとプラットフォームに適用する手順を示します。

| 必要な場合は                         | これを行います。                                                       | セクション                                                                 |
| :----------------------------- | :------------------------------------------------------------- | :-------------------------------------------------------------------- |
| アプリケーション内での独自の適格性ルールの適用        | 各購入の前に実行されるコンプライアンスコールバックの登録                                   | [コンプライアンスチェックで購入をゲートする](#gate-purchases-with-a-compliance-check)      |
| 購入が開く前にチェックアウト URL を表示または開示する  | `GenerateURL` を呼び出して URL を取得し、`PurchaseProduct` を呼び出して URL を開く | [チェックアウト URL を表示または描画する](#disclose-or-render-the-checkout-url)        |
| AppleまたはGoogleに外部トランザクションをレポート | `GenerateURL`でトークンをアタッチ、設定、添付、オーダーWebhookから読み戻す                | [トランザクショントークンのアタッチ、設定、添付、レポート](#attach-and-report-transaction-tokens) |

## コンプライアンスチェックによる購入のゲート##gate-purchases-with-a-compliance-check

このステップは任意です。アプリケーション内で独自の適格性ルールを適用する場合にのみ追加します。

購入に進む前に、コンプライアンスコールコールバックを登録して独自の適格性ルールを適用します。`PurchaseProduct` (または `Purchase`) を呼び出すと、Unity はまずコールバックを実行し、購入する`Cart`を公開する`PaymentProviderComplianceContext`を渡します。コールバックが`false`を返す (またはスローする) と、購入は`PurchasingUnavailable`で失敗し、注文は作成されません。

1. プレイヤーがコンプライアンス チェックに合格したかどうかを示す`Task<bool>`を返す関数を定義します。

   ```csharp
   Task<bool> RunComplianceCheckAsync(PaymentProviderComplianceContext context)
   {
       const ブーリアン allow = true;
       return Task.FromResult(allow);
   }
   ```

2. Payment Providers 購入サービスに機能を登録し、購入が開始されたときに Unity が機能を呼び出すようにします。

   ```csharp
   m_PurchasingService.PaymentProviders?.SetComplianceCheck(RunComplianceCheckAsync);
   ```

3. チェック内のプラットフォーム クライアントを使用して、各プラットフォームが準拠するために必要な API を呼び出します。

   * **Apple**: `ExternalPurchaseClient`を使用してAppleの外部購入APIにアクセスします。
   * **Google**: `ExternalBillingProgramClient` を使用して Google の外部課金 API にアクセスします。

> **Note:**
>
> コンプライアンス コールバックは、`PurchaseProduct`と`Purchase`に対してのみ実行されます。`GenerateURL`はコールバックによってゲートされず、即座にオーダーを作成します。そのため、開示またはトークンの`GenerateURL`を呼び出す場合は、その呼び出しの前に適格性チェックを実行します。

## チェックアウト URL を表示または描画する##disclose-or-render-the-checkout-url

プラットフォームによっては、プレイヤーが先に進む前に外部購入 URL をディスプレイまたは開示する必要がある場合や、独自のウェブビューでチェックアウトを描画する場合があります。いずれの場合も、`GenerateURL` を呼び出して URL を開かずに取得します。

```csharp
string url = await m_PurchasingService.PaymentProviders.GenerateURL(catalogListingId);
// Display or disclose the URL, then call PurchaseProduct to open the checkout.
```

その後、`PurchaseProduct(catalogListingId)`は複製を作成する代わりに、すでに作成済みの注文`GenerateURL`を再利用します。

> **Note:**
>
> 購入の事前準備のために`GenerateURL`を呼び出さないでください。URL またはトークンが必要ない場合は、`PurchaseProduct` を直接呼び出します。注文を作成して開きます。冗長な`GenerateURL` (特に忘れた`await`) はレースウィンドウを追加するだけです。

## トランザクショントークンのアタッチ、設定、添付とレポート##attach-and-report-transaction-tokens

このステップは、Apple または Google が外部トランザクションのレポートを要求している場合に必要です（これはプログラムと地域によって異なります）。

Apple と Google では、各外部トランザクションをサーバ API を通じてレポートする必要があります。プラットプラットフォームから不透明な透明なトランザクショントークンを取得し、Unity の注文にアタッチ、設定、添付し、ウェブフックで受け取り、レポートを提出できます。トークンは自分で生成します。Appleトークンは`ExternalPurchaseClient`から取得され、Googleトークンは`ExternalBillingProgramClient`から取得されます。

`PurchaseProduct`はトークンを受け付けないため、独自のオーダーを作成する購入にはトークンは添付されません。トークンを注文に取り込むには、まず`GenerateURL(catalogListingId, tokens)`を呼び出します。その後、同じリストに対する後続の`PurchaseProduct`では、そのトークンを持つ順序が使用されます。

```csharp
await m_PurchasingService.PaymentProviders.GenerateURL(catalogListingId, tokenList);
m_PurchasingService.PurchaseProduct(catalogListingId);
```

Unity はトークンを検査や検証を行わずに順序とともに保存し、Webhook の順序でトークンを表示します。Order API 反応では返されません。

> **Note:**
>
> レポート トークンをアタッチ、設定、添付すると、Unity がトークンを返す場所は注文 Webhook のみになります。[購入処理用のWebhookまたはCloud Codeモジュールの設定](./configure-fulfilment.md)を参照してください。

### Webhook ペイロードのトークン##tokens-in-the-webhook-payload

注文 Webhook には、`data` の下に `externalTransactionTokens` 配列が含まれます。各エントリーには、トークンと、それがターゲットとするストアが含まれます。

```json
{
  "eventType": "order.paid",
  "data": {
    "id": "...",
    "playerId": "...",
    "status": "paid",
    "externalTransactionTokens": [
      { "store": "apple", "token": "opaque-apple-transaction-token", "type": "acquisition" },
      { "store": "google", "token": "opaque-google-transaction-token" }
    ]
  }
}
```

**store** (string, required): アプリストアします。`apple`または`google`のいずれか。トランザクションのレポート先を指定します。**token** (string, required): 外部の購入トークンまたはトランザクショントークン。Unity は検査せずにそれを格納および転送します。**type** (string): Apple専用トークンのカテゴリ。`acquisition`、`services`、または `linkOut` のいずれか。Google では省略。

> **Note:**
>
> 1 回の Apple 外部購入で、地域に応じて 2 つのトークンタイプ (EU (`acquisition`トークン) と `linkOut` トークン (日本) など) が必要になる可能性があるため、注文ごとに最大 2 つのトークンを提供できます。関連するプログラムに従って各トークンをレポートします。Unity は `type` には作用しません。

これらのトークンを使用して、各プログラムで必要に応じてAppleの外部Purchase Server APIまたはGoogleの`externalTransactions` APIを通じてトランザクションを自己レポートします。

## 次のステップ##next-steps

このページは、IAPでD2C支払いプロバイダーを設定するワークフローの一部です。このワークフローを続行するには、以下のオプションのいずれかを選択します。

[Integrate D2C payment providers](./workflow.md#platform-compliance-for-external-purchases): Integrate D2C payment provider with IAP ワークフロー (D2C 支払いプロバイダーと IAP ワークフローの統合) ページに戻ります。
[Fulfill purchases through the SDK](./purchases-sdk.md): これらのコンプライアンス ステップでビルドされる法線購入フローを確認します。
[Configure a webhook for fulfillment](./configure-fulfilment.md): 外部トランザクショントークンなどの注文イベントを受信するように Webhook を設定します。
