---
title: "在 Flutter SDK 中实现 web 付费墙"
description: "设置 web 付费墙，无需支付 App Store 费用和审核即可获得收入。"
---

:::important
在开始之前，请确保您已[在看板中配置了 web 付费墙](web-paywall)，并安装了 Adapty SDK 3.6.1 或更高版本。
:::

如果您使用的是自行开发的付费墙，则需要使用 SDK 方法处理 web 付费墙。`.openWebPaywall` 方法：
1. 生成唯一 URL，使 Adapty 能够将向特定用户展示的付费墙与他们被重定向到的网页关联起来。
2. 跟踪用户何时返回应用，然后以短时间间隔请求 `.getProfile`，以确定用户画像的访问权限是否已更新。

这样，如果付款成功且访问权限已更新，订阅几乎会立即在应用中激活。

```dart showLineNumbers title="Flutter"
try {
  await Adapty().openWebPaywall(product: <YOUR_PRODUCT>);
  // The web paywall will be opened
} on AdaptyError catch (adaptyError) {
  // handle the error
} catch (e) {
  // handle other errors
}
```

:::note
`openWebPaywall` 方法有两个版本：
1. `openWebPaywall(product)` 根据付费墙生成 URL，并将产品数据附加到 URL 中。
2. `openWebPaywall(paywall)` 根据付费墙生成 URL，但不附加产品数据。当 Adapty 付费墙中的产品与网页付费墙中的产品不同时，请使用此版本。
在 SDK v4 中，`paywall` 参数接受 `AdaptyFlowPaywall`——即获取到的 flow 的付费墙变体。在对其进行索引之前，请先检查 `flow.paywalls` 不为空，例如 `flow.paywalls[0]`。
:::

#### 处理错误 \{#handle-errors\}
| 错误                                    | 描述                              | 建议操作                                          |
|-----------------------------------------|-----------------------------------|---------------------------------------------------|
| AdaptyError.paywallWithoutPurchaseUrl   | 付费墙未配置 web 购买 URL         | 检查付费墙是否已在 Adapty 看板中正确配置          |
| AdaptyError.productWithoutPurchaseUrl   | 产品没有 web 购买 URL             | 在 Adapty 看板中验证产品配置                      |
| AdaptyError.failedOpeningWebPaywallUrl  | 无法在浏览器中打开 URL            | 检查设备设置或提供其他购买方式                    |
| AdaptyError.failedDecodingWebPaywallUrl | 无法正确编码 URL 中的参数         | 验证 URL 参数是否有效且格式正确                   |

## 在应用内浏览器中打开网页付费墙 \{#open-web-paywalls-in-an-in-app-browser\}

:::important
从 Adapty SDK v3.15 开始支持在应用内浏览器中打开网页付费墙。
:::

默认情况下，网页付费墙会在外部浏览器中打开。

为了提供流畅的用户体验，你可以在应用内浏览器中打开网页付费墙。这样，网页购买页面会直接显示在你的应用内，用户无需切换应用即可完成交易。

要启用此功能，请将 `in` 参数设置为 `.inAppBrowser`：
```dart showLineNumbers
try {
  await Adapty().openWebPaywall(
    product: <YOUR_PRODUCT>,
    openIn: AdaptyWebPresentation.inAppBrowser,
  );
  // The web paywall will be opened in the in-app browser
} on AdaptyError catch (adaptyError) {
  // handle the error
} catch (e) {
  // handle other errors
}

```