> ## Documentation Index
> Fetch the complete documentation index at: https://docs.fluz.app/llms.txt
> Use this file to discover all available pages before exploring further.

# 注册组件

> ENROLLMENT 组件类型：在 OAuth 之后立即引导用户完成账户设置，并由你选择用户会看到哪些步骤——身份验证、资金来源，以及 PIN。

`ENROLLMENT` 组件类型会在用户授权你的应用后，立即引导其完成账户设置。它与其他组件类型的结构一致——用户在授权后会被直接重定向到一个任务——但有一点不同：**你可以选择用户会看到哪些设置步骤。**

与打款和收款类型不同，此组件不涉及资金流动。没有需要确认的金额，也没有需要批准的交易。

<Note>
  `ENROLLMENT` 目前仅在 **staging** 可用。生产环境支持即将推出；在此之前，带有 `transactionType: "ENROLLMENT"` 的生产令牌会被拒绝。
</Note>

<Info>
  **前置条件**

  * 一个已配置 OAuth 设置的小部件应用。参见 [配置 App 小部件](/developers/configure-app-widget)。任何应用类型都可以运行此组件，包括仅权限的 `OAuth Integration` 应用。
  * 用户必须已授予你的应用所需的 scopes。Scopes 针对应用整体进行检查，而非按步骤分别检查。如果缺少任何 scope，组件会在第一步之前将用户引导至 OAuth 同意页面，与其他组件类型相同。不会因为 scope 缺失而跳过或判定某一步失败。
  * 一个 OAuth 用户以及一个 access token，与其他组件类型相同。
</Info>

## 选择步骤

在预先批准的交易令牌中，连同 `transactionType: "ENROLLMENT"` 一起传入一个有序的 `steps` 数组：

```javascript theme={null}
import jwt from 'jsonwebtoken';

const generatedToken = jwt.sign(
  {
    apiKey: '', // Your apiKey
    transactionType: 'ENROLLMENT',
    externalId: '', // Your unique identifier for the user
    steps: ['KYC', 'FUNDING_SOURCE', 'PIN'],
    jti: uuidv4(),
  },
  secret, // Your apiSecret
  { expiresIn: '1 day' }
);
```

此组件类型不需要 `amount`。令牌的其他部分均不变——参见 [设置你的服务器](/developers/setting-up-your-server)。

### 支持的步骤

| 步骤               | 用户需要做什么                                                         |
| :--------------- | :-------------------------------------------------------------- |
| `KYC`            | 完成个人身份验证，必要时会升级到证件采集。参见[通过组件进行验证](/verify-customers-by-widget)。 |
| `FUNDING_SOURCE` | 关联一个或多个资金来源——通过 Plaid 的银行账户、银行卡，或 PayPal。                       |
| `PIN`            | 设置其 Fluz 交易 PIN。                                                |

<Note>
  此组件仅执行**个人**身份验证。企业验证（KYB）不在其步骤中——请使用专用的 KYB 组件类型。参见[企业注册](/docs/business-registration)。
</Note>

### 顺序

步骤会按照你列出的顺序运行。Fluz 不会重新排序，且不存在无效组合——这三个步骤彼此之间没有前置依赖关系，所以 `["PIN", "FUNDING_SOURCE", "KYC"]` 与 `["KYC", "FUNDING_SOURCE", "PIN"]` 一样有效。

请按最符合你产品逻辑的顺序列出步骤。

## 跳过行为

用户已满足的步骤会被静默跳过——他们不会看到该步骤的界面。

| 步骤               | 何时跳过      |
| :--------------- | :-------- |
| `KYC`            | 用户已通过身份验证 |
| `PIN`            | 用户已设置 PIN |
| `FUNDING_SOURCE` | **从不**    |

资金来源步骤永不跳过，因为已经有一个来源的用户可能还想添加另一个。该步骤总会呈现，何时继续由用户决定。

如果你请求的每个步骤都已满足，组件会立即完成，而不会渲染任何步骤界面。

<Info>
  由于 `FUNDING_SOURCE` 永不自动跳过，包含该步骤的 `steps` 列表始终会至少显示一个界面。如果你希望实现“无事可做，立即完成”的结果，只请求 `KYC` 和 `PIN`。
</Info>

## 资金来源步骤

此步骤有意设计为开放式。用户在一次访问内可以添加任意多个资金来源——界面会列出他们已添加的来源，并提供明确的**继续**控件，因此前进是他们的决定，而不是在首次链接成功后自动发生。

不想添加任何来源的用户也可以继续而不添加来源。

资金来源的变更目前尚不会触发 webhook。相关事件正在开发中。在该事件推出之前，请在流程完成后，通过 `getWallet` 查询读取用户的资金来源。参见[资金来源](/features/funding-sources)。

## 完成

当最后一步完成后，组件会显示完成界面。如果你提供了 `callbackUrl`，它会带有一个返回你应用的按钮；否则会提供一个关闭组件的**完成**控件。

<Warning>
  不要根据组件被关闭来推断成功——用户可以在任意时刻关闭它。请依赖 `onSuccess` 和 `onError` 回调，以及各步骤的 webhooks：身份验证事件独立于组件触发。参见 [Webhooks](/fluz-dashboard/webhooks)。
</Warning>

## 被拒绝的令牌

`steps` 字段会在会话开启时进行校验。以下情况会拒绝会话，而不是退化为部分流程：

| 问题                                            | 结果                       |
| :-------------------------------------------- | :----------------------- |
| 完全缺少 `steps`                                  | 缺少参数错误                   |
| `steps` 不是数组，或为空                              | 无效参数错误                   |
| `steps` 包含非 `KYC`、`FUNDING_SOURCE`、或 `PIN` 的值 | 无效参数错误，会指明不受支持的值并列出受支持的值 |
| `steps` 中同一步骤出现两次                             | 无效参数错误，会指明重复项            |

用户会看到一个通用的“无效的小部件链接”界面——不会向他们展示具体原因，因为格式错误的令牌属于集成问题，不是他们可以处理的事项。请检查你的令牌生成器，并查看传递给 `onError` 回调的错误详情。

## 后续步骤

<CardGroup cols={2}>
  <Card title="设置你的服务器" icon="server" href="/developers/setting-up-your-server">
    用你的语言生成预先批准的交易令牌。
  </Card>

  <Card title="嵌入组件" icon="code" href="/developers/adding-the-js-widget-to-your-page">
    脚本标签、初始化调用、回调。
  </Card>

  <Card title="通过组件进行验证" icon="circle-check-big" href="/verify-customers-by-widget">
    用户在 KYC 步骤中的体验。
  </Card>

  <Card title="资金来源" icon="coins" href="/features/funding-sources">
    关联成功后你可以对资金来源执行的操作。
  </Card>
</CardGroup>
