开始之前: 你的服务器必须为每个会话生成一个
patToken 并将其提供给你的页面。参见设置你的服务器。1. 加载小部件脚本
将此加载器添加到你的页面。它会注入小部件脚本,并在FluzEmbedded 就绪时才解析,这样其余代码不会在小部件存在之前运行。
2. 初始化小部件
脚本加载完成后,使用你的 API key、交易详情以及来自服务器的patToken 调用 init()。
init() 接受蛇形命名(snake case)的 transaction_type。签名的 patToken 内部声明为 transactionType。二者必须描述同一笔交易。3. 打开小部件
选择用户如何启动小部件。两种方式都在init() 之后运行。
- 使用你自己的按钮
- 使用 Fluz 按钮
将
open() 绑定到页面上已存在的按钮。初始化选项
init() 只检查脚本自身所需内容:apiKey、patToken、transaction_type,以及可解析的 container。其他内容会根据你签名的令牌进行校验,因此错误的 transaction_type 或缺失的 amount 会通过 onError 反馈给你,而不会以你的代码看不到的控制台消息出现。方法
处理结果
onOpen 和 onClose 只表明小部件出现和消失,并不表示用户是否完成。要了解流程如何结束,传入 onSuccess 和 onError。两者均为可选;即使都不传,小部件仍然可用,只是你收不到结果。
回调的行为方式
onSuccess是最终态。 它最多触发一次,之后不会再有结果回调,因此已完成的流程不会再报告错误。onError报告的是一次尝试,而非最终裁定。 身份验证失败或付款被拒的用户仍在小部件内且可以重试。onError在一个会话中可能触发多次,之后仍可能出现一次onSuccess。- 两个回调都不会关闭小部件。 用户会停留在界面,直至其自行关闭,此时触发
onClose。
onSuccess 触发或用户关闭小部件时,将会话视为结束。
回调接收的内容
在可用时,两个回调都会包含将会话与你的记录关联的 id,以及运行该会话的 Fluz 账户的联系方式。Fluz 在服务器端根据你签名的令牌和用户会话填充这些值,因此这些是 Fluz 记录下的值,而非页面组装的内容。
分别读取每个字段;不要假设集合是完整的。
externalReferenceId来自你的令牌,因此它能在用户登录前发生的失败中幸存。- 其余四个来自 Fluz 账户,只有当会话进展到那一步时才会出现。
- 在你的令牌验证之前发生的失败(令牌过期、应用权限缺失)不携带任何内容。
onError仅接收code和message。
email 和 phoneNumber 描述的是用户登录的 Fluz 账户,可能与您在 patToken 中传入的值不同。
这些字段用于标识会话;它们不是发生事件的记录。使用 externalReferenceId 在你的系统中定位正确的行,然后在采取行动前通过 Webhook 或 API 调用确认结果。
错误代码
onError 会接收用于分支的稳定 code,以及用于记录的人类可读 message。US-0005 和 G-0004 表示用户可以重试的失败;其他任何代码都表示会话无法继续。
将任何未识别的代码视为
G-0001。新代码会随时间推出而不构成破坏性变更。
内联渲染小部件(仅限 staging)
默认情况下,小部件会在你的页面上挂载一个固定的、覆盖整个视口的遮罩层。传入container 后,它会在你自行定位和设定尺寸的元素内渲染,不包含遮罩、滚动锁定或页面接管。
尺寸
小部件会以 100% 宽高填充你的容器,并且从不改变容器大小。超出容器高度的内容会在小部件内滚动,而不是你的页面滚动。- 在 CSS 中为容器设置显式宽高。 没有高度时,小部件会回退到浏览器的默认 iframe 高度 150px,这是此类集成中最常见的错误。若打开时容器过小,脚本会在控制台记录警告。
- 最小支持尺寸为 320 × 480 像素。 包括文档采集、双重验证(2FA)和 PIN 输入在内的每个界面都支持该尺寸。更小的布局不受支持。
- 无上限。 宽容器会获得桌面布局(含交易摘要面板);窄容器会获得移动端布局。
与模态的差异
注意最后一行:当用户关闭内联小部件时,会触发
onClose 且你的容器被清空,因此请在 onClose 中渲染其替代内容。
容器错误
如果容器无法使用,将不会渲染,onOpen 不会触发,脚本会记录错误:
- 在
init()时:container既不是元素也不是非空字符串。小部件保持未配置状态,随后调用open()将被拒绝。 - 在
open()时: 选择器未匹配任何元素、不是有效 CSS,或元素未附加到文档。
container 选择器会在调用 open() 时解析,而不是在 init() 时解析,因此在元素尚不存在前调用 init() 是可以的。