# 收据验证

> 验证购买收据的真实性以防止欺诈并确保安全交易。

购买收据是来自应用商店的安全数字记录，可作为成功交易的证明。用户完成购买后，应用程序将收到此收据。

Unity IAP 提供统一的收据结构，其中包含特定于商店的有效负载以及详细的交易数据。收到 `OnPurchasePending` 的`PendingOrder`时，应验证其真实性以防止欺诈。此过程称为交易验证。

## 收据结构##receipt-structure

Unity IAP 将收据格式化为具有不同商店之间一致结构的 JSON 对象。

以下是关键字段：

| 密钥              | 值                                             |
| :-------------- | :-------------------------------------------- |
| `Store`         | 发生购买的商店的名称，例如 `GooglePlay` 或 `AppleAppStore`。 |
| `TransactionID` | 此交易的唯一标识符，由商店提供。                              |
| `Payload`       | 特定于商店的原始收据数据。这是最重要的字段，因为它包含交易验证所需的信息。         |

## 交易验证##transaction-verification

交易验证可确保购买合法。这样可以确保用户只能访问他们实际购买的内容。

验证可以保护您的应用程序免受以下常见类型的欺诈：

* 伪造收据：恶意用户可以尝试创建假收据来解锁内容而无需付费。
* 重放攻击用户可以尝试为多个帐户重复使用单个有效收据，或重复申请同一非消耗品。

通过向原始应用商店验证收据，您可以在授予内容访问权限之前确认交易是否真实并与正确的用户和商品相关联。

## 验证方法##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) 进行服务器端验证。
