本页假设你已阅读 Secure Elements 概览 —— 其中涵盖了铸造 client token、加载 SDK 及样式化字段,以上内容同样适用于本功能。
在线预览
该演示会自行铸造令牌并自动挂载查看器。若显示按钮无响应,请使用 Remint token & remount;并通过 Reveal、Reveal CVV only 或 Mask 试用下文介绍的字段级控制。在新标签页打开 →
铸造 reveal token
调用POST /v1/client-token,传入 "purpose": "reveal" 以及你想展示的 virtualCardId:
clientToken 与 loadToken 直接传给下方的 createCardViewer。
创建查看器
fields 控制渲染哪些卡片字段及其顺序——若省略,则默认为 ["pan", "expiry", "cvv"]。每个条目要么是字段名字符串,要么是 { field, individualReveal } 对象;"pan" 等价于 { field: "pan", individualReveal: true }。仅支持 pan、expiry、cvv 这三个字段名——其他任何值都会在调用 createCardViewer 时同步抛出 FluzElementsError(error.code === "INVALID_FIELD"),在你调用 mount() 之前就会报错。
所有字段的
individualReveal 默认均为 true。将其设为 false 可阻止该字段被单独揭示——见仅揭示单个字段。这与 reveal() 相互独立;后者始终会揭示所有字段,不受此设置影响。挂载
mount() 会按配置的每个字段向你传入的容器元素追加一个沙盒 iframe——对于默认 fields,是 3 个相互独立的 iframe,而非一个合并的 iframe——并在每个 iframe 完成握手后返回已完成的 Promise。若发生以下情况会以 FluzElementsError 拒绝:
- 传给
createCardViewer的style未通过校验(error.code === "INVALID_STYLE")——见字段样式化 - 某个 iframe 未在
mountTimeoutMs内完成握手(error.code === "MOUNT_TIMEOUT";默认 10 秒,可通过createCardViewer({ ..., mountTimeoutMs })配置) - 某个 iframe 加载失败,或该查看器已被挂载过(
error.code === "MOUNT_FAILED")——每个CardViewer实例只能挂载一次;若需再次挂载,请用createCardViewer新建实例
揭示与掩码字段
reveal(field?)—— 异步。从 Fluz 拉取真实值并显示。不传参数时,会忽略individualReveal设置,获取并显示所有配置字段。传入字段名时,仅获取并显示该字段——若该字段在配置中设为individualReveal: false,则以error.code === "INDIVIDUAL_REVEAL_DISABLED"拒绝。未挂载的查看器,或不在fields中的字段名,均以MOUNT_FAILED拒绝。setMask(field, masked, options?)—— 同步、非异步。它从不发起拉取——只切换当前显示状态:setMask(field, true)将字段重新切回占位符,无论之前是否揭示过。setMask(field, false)取消掩码——仅当该字段已通过reveal()拉取到真实值时才会显示真实值。若先于任何reveal()调用,它会继续停留在占位符,因为还没有可显示的真实值。setMask(field, true, { hidden: true })会将字段完全清空(留空,不显示点、last4 或有效期),而非显示占位符。hidden仅在masked为true时生效。- 不提供批量“全量掩码”方法——如需复位整个查看器,请对
fields中的每个字段分别调用一次setMask。
destroy()—— 卸载所有 iframe 并分离查看器。组件卸载时调用它,避免遗留已挂载的 iframe。
仅揭示单个字段
若只想单独揭示某个字段(例如在该字段旁边放一个“显示 CVV”按钮),调用reveal(field) 即可——所有字段默认允许此操作,因此常见场景无需额外配置。
若某字段应当永不单独揭示,只能作为整卡 reveal() 的一部分出现,可在 fields 中为其配置 { field, individualReveal: false } 以选择退出:
reveal(field) 会在未联系 frame-host 的情况下直接以 FluzElementsError(code: "INDIVIDUAL_REVEAL_DISABLED")拒绝。无论如何,不带参数的 reveal() 始终会揭示每个已挂载字段——individualReveal 对其无影响。
这是一种客户端集成策略,而非服务器强制的能力限制——它约束的是你的 UI 允许触发的行为,而非 grant 能返回的数据。请不要将
individualReveal: false 视作安全边界。处理事件
onMount 在所有配置字段均已在 iframe 内渲染完成后触发一次。onError 用于接收已挂载 iframe 内部发生的问题——例如 reveal() 失败或被限流——而非 mount() 或 createCardViewer() 本身的问题;后者会直接 reject 或抛错(见下文)。onMount 与 onError 均返回用于取消订阅的函数。
本功能可能产生的每种 FluzElementsError,及其出现位置如下:
完整示例
/mint-reveal-token 是你自有的后端路由——它会使用你的 Fluz OAuth access token 调用 POST /v1/client-token,详见铸造 client token。
下一步
Secure Elements 概览
令牌铸造、SDK 加载、样式化与 CSP。
Secure Card Input
另一项 Secure Elements 能力——采集实体卡信息,而非显示已存在的卡片。
在线演示
揭示、仅揭示 CVV 与掩码,运行于 staging。
示例集成
可运行的纯 HTML 与 React 揭示示例,包含令牌铸造服务端。