# 配置 Codeless IAP 按钮

> 设置和使用 Codeless IAP 按钮和 IAP 监听器可在不编写复杂代码的情况下启用应用内购和恢复购买。

Codeless IAP 按钮可以轻松设置应用内购和恢复按钮，只需编写最少的脚本。使用 IAP 按钮可将购买和恢复功能直接添加到 UI 按钮。此方法为用户提供了在应用中购买或恢复商品的简单方法。

## 使用 OnProductFetch 更新商品详细信息##use-onproductfetched-to-update-product-details

Unity IAP 从应用商店检索产品信息时触发 `OnProductFetched` 事件。确保使用此事件更新 UI 中与商品相关的所有文本，例如标题、描述和价格。

`OnProductFetched` 脚本示例：

> **Tip:**
>
> 向 `IAPButton` 添加类似于以下脚本的脚本，以便将不同视图链接到此事件。

```cs
public class IAPButtonView : MonoBehaviour
{
    [SerializeField]
    TMP_Text title;
    [SerializeField]
    TMP_Text price;

    public void OnProductFetched(Product product)
    {
        if (title != null)
        {
            title.text = product.metadata.localizedTitle;
        }

        if (price != null)
        {
            price.text = product.metadata.localizedPriceString;
        }
    }
}
```

## IAP 监听器##iap-listeners

Codeless IAP 通常会将成功和失败的购买事件发送到场景中激活的 IAP 按钮组件。但是，在某些情况下，使用 IAP 按钮不切实际。例如，如果购买履行中断且未完成，Unity IAP 会在下次初始化时再次尝试处理购买（通常在应用程序启动后立即处理，此时 IAP 按钮可能尚未初始化）。在这些情况下，可以使用 IAP Listener 组件。IAP 监听器会接收 IAP 按钮无法处理的任何购买事件，从而确保所有购买都得到正确处理。将 IAP 监听器添加到场景中可自动处理这些事件。

> **Note:**
>
> 要避免重复响应，请确保 IAP 监听器处理的事件不会也由同一商品的 IAP 按钮订阅。

要添加 IAP 监听器，请执行以下步骤：

1. 在 Unity Editor 中，选择 **Services** > **In-App Purchasing** > **Create IAP Listener**。
2. 请遵循将购买履行脚本编写为游戏对象组件的步骤。请参阅[购买履行](./codeless-iap.md#purchase-fulfillment)以了解更多信息。
3. 从 Hierarchy 列表中选择 **IAP Listener**，然后在 Inspector 中找到其 **IAP Listener** 脚本组件。然后选择 **+** 为 **On Purchases Fetch (Orders)** 和 **On Order Pending (PendingOrder)** 添加函数。
   * **On Order Pending** 处理所有新交易，并针对单个`PendingOrder`交易调用。
   * **On Purchases Fetch** 处理所有现有交易，并使用包含所有激活的 Pending、Confirmed 和 Deferred 交易的 `Orders` 对象进行调用。
4. 将带有购买履行脚本的游戏对象拖到组件的 Inspector 中的事件字段上，然后从下拉菜单中选择您的函数。

## Restore 按钮##restore-button

某些应用商店（包括 Apple App Store）要求应用程序具有 **Restore** 按钮。Codeless IAP 提供了一种在应用程序中实现恢复按钮的简单方法。

要添加 **Restore** 按钮，请执行以下步骤：

1. 将 **IAP 按钮**添加到场景中（**Services** > **In-App Purchasing** > **Create IAP Button**）。
2. 选择 **IAP Button** 后，在 Inspector 中找到其 **IAP Button** 组件。
   1. 在 **Button Type** 下拉菜单中，选择 **Restore**。Inspector 窗口更新为仅显示与 Restore 按钮相关的字段。
3. 可选：选择加号 (+) 按钮可将脚本添加到 `On Transactions Restored (Boolean, String)`。
   1. 将带有恢复交易脚本的游戏对象拖到组件的 Inspector 中的事件字段上，然后从下拉选单中选择 函数。

```cs title="OnTransactionsRestored example"
public void OnTransactionsRestored(bool success, string? error)
{
    Debug.Log($"TransactionsRestored: {success} {error}");
}
```

用户在运行时选择此按钮时，会调用当前商店的购买恢复 API。在 Apple App Store 上，这会触发 Apple 的内置还原或同步流程。
在 Google Play 上，恢复是 IAP 初始化的一部分。在运行时进行的其他恢复调用很少会产生结果。

Unity IAP 始终在 **Restore IAP 按钮**上调用 `OnTransactionsRestored` 方法，并在恢复失败时显示结果和相关错误消息。

成功恢复交易后，Unity IAP 会在链接到商品的 **IAP 按钮**上调用 `OnPurchaseFetched` 回调，或在 **IAP Listener** 组件上调用 `OnPurchasesFetched` 回调。

```cs
public void OnOrderPending(PendingOrder order)
{
    foreach（var cartItem in order.CartOrdered.Items()）
    {
        var product = cartItem.Product;
        // grant purchase...
    }
}

public void OnPurchasesFetched(Orders existingOrders)
{
    foreach（在 existingOrders.ConfirmedOrders 中更改顺序）
    {
        foreach（var cartItem in order.CartOrdered.Items()）
        {
            var product = cartItem.Product;
            // grant access...
        }
    }
}
```
