Skip to main content
本页假定你已阅读安全元素概览——其中涵盖了铸造客户端令牌、加载 SDK 和样式化字段,这些内容在此同样适用。

在线查看

该演示会自行铸造令牌并自动挂载查看器。若展示按钮无响应,可使用Remint token & remount,并通过RevealReveal CVV onlyMask尝试下文介绍的字段级控制。在单独标签页中打开 →

铸造展示令牌

调用POST /v1/client-token,传入"purpose": "reveal"以及你想展示的virtualCardId
将返回的clientTokenloadToken直接传递给下方的createCardViewer

创建查看器

fields控制按顺序渲染卡片的哪些部分——若省略,你将获得["pan", "expiry", "cvv"]。每一项要么是字段名本身,要么是一个{ field, individualReveal }对象;"pan"{ field: "pan", individualReveal: true }的简写。仅支持panexpirycvv这三个字段名——其他任何值都会在调用createCardViewer时同步抛出FluzElementsErrorerror.code === "INVALID_FIELD"),在你调用mount()之前就会报错。
individualReveal在每个字段上默认为true。将其设为false可阻止单独展示该字段——参见仅展示单个字段。它与reveal()相互独立,后者无论如何都会一次性展示所有字段。

挂载

mount()会将每个已配置字段各自作为一个受沙盒限制的 iframe 追加到你传入的容器元素中——默认fields会生成三个独立的 iframe,而非一个合并的 iframe——并返回一个在所有 iframe 完成握手后才会 resolve 的 Promise。若出现以下情况会以FluzElementsError拒绝:
  • 你传给createCardViewerstyle未通过校验(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 })会将字段完全清空(空白,连占位符也不显示),而非显示圆点/后四位/有效期。hidden仅在maskedtrue时生效。
    • 不提供批量“全部掩码”的方法——若需重置整个查看器,请对fields中的每个字段分别调用setMask
  • destroy()——销毁所有 iframe 并分离查看器。组件卸载时调用,以免在组件消失后仍遗留已挂载的 iframe。

仅展示单个字段

若只需单独展示某个字段(例如该字段旁边的“显示 CVV”按钮),调用reveal(field)即可——默认每个字段都允许此操作,因此常见场景无需额外配置。 如果某个字段应当“绝不”单独展示,只能随整卡reveal()一同出现,可在fields中为其设置{ field, individualReveal: false }以选择退出:
针对选择退出的字段调用reveal(field)会在不联系frame-host的情况下以FluzElementsErrorcode: "INDIVIDUAL_REVEAL_DISABLED")拒绝。无论如何,不带参数的reveal()总是会展示所有已挂载字段——individualReveal对其不起作用。
这是前端集成层面的选择,而非服务器强制的能力限制——它控制的是你的 UI 允许触发的行为,而不是授权可返回的数据范围。不要将individualReveal: false当作安全边界依赖。

处理事件

onMount在每个已配置字段都在 iframe 内完成渲染后触发一次。onError用于接收已经挂载的 iframe 内部发生的问题——如reveal()失败或触发限流——而mount()createCardViewer()本身的问题则会直接以拒绝或抛错的形式呈现(见下文)。onMountonError均返回一个取消订阅函数。 此能力可能产生的每个FluzElementsError及其出现位置:

完整示例

/mint-reveal-token是你自有的后端路由——它会使用你的 Fluz OAuth 访问令牌调用POST /v1/client-token,详见铸造客户端令牌

后续步骤

安全元素概览

令牌铸造、SDK 加载、样式化与 CSP。

在线演示

展示、仅展示 CVV 与掩码,运行于 staging。

示例集成

可运行的纯 HTML 与 React 展示示例,含令牌铸造服务器。