# レシート検証

> 購入レシートの真正性を確認して、詐欺を防止し、安全なトランザクションを確保します。

購入レシートは、アプリストアからの安全なデジタル記録で、トランザクションの成功の証拠となります。ユーザーが購入を完了すると、アプリケーションはこのレシートを受け取ります。

Unity Iap は、詳細なトランザクション データを含むストア固有のペイロードを含む、統一されたレシート構造体を提供します。`OnPurchasePending`から`PendingOrder`を受け取ったら、詐欺を防ぐためにその真正性を確認する必要があります。このプロセスはトランザクション検証と呼ばれます。

## レシート構造体##receipt-structure

Unity Iap は、レシートを異なるストア間で一貫した構造体を持つ JSON オブジェクトにフォーマットします。

以下のキーです。

| キー /Key         | 値                                                          |
| :-------------- | :--------------------------------------------------------- |
| `Store`         | 購入が発生したストアの名前 (`GooglePlay`、`AppleAppStore` など)。           |
| `TransactionID` | このトランザクションの一意の識別子。ストアによって提供されます。                           |
| `Payload`       | ストア固有のRawのレシートデータ。これは最も重要なフィールドで、トランザクション検証に必要な情報が含まれています。 |

## トランザクション検証##transaction-verification

トランザクション検証により、購入が正当なものであることを確認します。これにより、ユーザーは実際に購入したコンテンツにのみアクセスできます。

検証は、以下の一般的なタイプの不正行為からアプリケーションを保護します。

* 偽造されたレシート:悪意のあるユーザーが、支払わずに偽のレシートを作成してコンテンツのロックを解除しようとする可能性があります。
* リプレイ攻撃 /replay attackユーザーは、1つの有効なレシートを複数のアカウントに再使用しようとしたり、同じ非消費型項目を繰り返し請求したりする場合があります。

元のアプリストアでレシートを検証することで、コンテンツへのアクセスを許可する前に、トランザクションが本物で、正しいユーザーと製品に関連付けられていることを確認できます。

## 検証方法##validation-methods

ユーザーのデバイス（ローカル検証）またはコントロールする安全なサーバー（リモート検証）でレシートを検証できます。

* ローカル検証
  * デバイス上で直接検証を実行します。
  * アプリケーションに含まれるコンテンツに適しています (キャラクターのロック解除や特徴の有効化など)。
  * > **Important:**
    >
    > ローカル検証は、悪意のあるユーザーが自身のデバイスでコードを簡単に改ざんしてチェックをバイパスできるため、セキュリティが低くなります。
  * > **Note:**
    >
    > ローカル検証は StoreKit 2 によって自動的に行われます。

* リモート（サーバ側）検証

  * すべてのトランザクションに推奨され、ゲーム内通貨やダウンロード可能なアイテムの付与など、サーバーが提供するコンテンツに不可欠です。
  * アプリケーションがバックエンドサーバーにレシート[`Payload`](https://docs.unity3d.com/Packages/com.unity.purchasing@latest?subfolder=/api/UnityEngine.Purchasing.UnifiedReceipt.html#UnityEngine_Purchasing_UnifiedReceipt_Payload)を送信します。
  * サーバーがアプリストアの検証サービス (Apple や Google 例えば通信し、コンテンツをリリースする前にレシートの信頼性を確認します。

  > **Note:**
  >
  > Unity Iap はビルトインのリモート検証サービスを提供していませんが、独自のソリューションを実装することも、サードパーティ製のソリューションを使用することもできます。
  >
  > * Googleレシート`Payload`はサーバー側の検証に使用します。
  > * Apple -  を追加しました。従来はレシート`Payload`が検証に使用されていましたが、Apple ではこのメソッドは非推奨になりました。ただし、StoreKit 1 ではまだ`Payload`が必要であり、当面は保持する必要があります。
  > * Apple (新しいメソッド):新しい実装の場合は、サーバー側の検証に [`OrderInfo.Apple.jwsRepresentation`](https://docs.unity3d.com/Packages/com.unity.purchasing@latest?subfolder=/api/UnityEngine.Purchasing.IAppleOrderInfo.html#UnityEngine_Purchasing_IAppleOrderInfo_jwsRepresentation) を使用します。

> **Note:**
>
> StoreKit 1 のレシートからできるだけ早く [StoreKit 2 の jwsRepresentation](https://developer.apple.com/documentation/storekit/verificationresult/jwsrepresentation-21vgo) に移行することで、信頼性、セキュリティ、パフォーマンスが向上し、最終的にはユーザー体験が向上します。

> **Note:**
>
> サーバー側の検証に [OrderInfo.Apple.jwsRepresentation](https://docs.unity3d.com/Packages/com.unity.purchasing@latest?subfolder=/api/UnityEngine.Purchasing.IAppleOrderInfo.html#UnityEngine_Purchasing_IAppleOrderInfo_jwsRepresentation) を使用します。
