本頁假設你已閱讀過安全元件概覽——其中涵蓋了鑄造 client token、載入 SDK 與欄位樣式設計,這些都同樣適用於此。
線上示範
此示範會自行鑄造 token 並自動掛載檢視器。若揭示按鈕停止回應,請使用Remint token & remount,並可透過 Reveal、Reveal CVV only 或 Mask 試用下文介紹的欄位層級控制。在新分頁開啟 →
鑄造揭示用的 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 而言,會是三個獨立的 frame,而非一個合併的 frame——並在每個 frame 完成握手後才回傳 fulfilled 的 promise。若發生以下情況,會以 FluzElementsError 拒絕:
- 你傳給
createCardViewer的style未通過驗證(error.code === "INVALID_STYLE")——請見欄位樣式設計 - 某個 frame 未能在
mountTimeoutMs內完成握手(error.code === "MOUNT_TIMEOUT";預設 10 秒,可透過createCardViewer({ ..., mountTimeoutMs })設定) - 某個 frame 完全無法載入,或此檢視器已經被掛載過(
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僅在masked為true時生效。- 沒有「全部遮罩」的批次操作——若需要重置整個檢視器,請對
fields中的每個欄位分別呼叫setMask。
destroy()— 拆解所有 frame 並卸載檢視器。請在元件卸載時呼叫,以免元件消失後仍遺留已掛載的 frame。
僅揭示單一欄位
若只想單獨揭示某一欄位(例如在該欄位旁的「顯示 CVV」按鈕),請呼叫reveal(field)——預設每個欄位都允許此操作,因此一般情境無需額外設定。
若某欄位應該「絕不」被單獨揭示,且僅能在整卡 reveal() 呼叫時才顯示,請在 fields 中為它設定 { field, individualReveal: false }:
reveal(field),會在未聯絡 frame-host 的情況下以 FluzElementsError(code: "INDIVIDUAL_REVEAL_DISABLED")拒絕。無論如何,不帶參數的 reveal() 一律會揭示每個已掛載的欄位——individualReveal 對其無影響。
這是用戶端整合層級的選擇,而非伺服器強制的能力——它控制你的 UI 允許觸發的行為,而非授權可返回哪些資料。請勿將
individualReveal: false 視為安全邊界。處理事件
onMount 會在所有設定的欄位於 frame 內完成渲染後觸發一次。onError 會針對已掛載的 frame 內部發生的問題觸發——例如失敗的 reveal() 或速率限制——而非 mount() 或 createCardViewer() 本身的問題,後者會直接拒絕或擲出錯誤(如下)。onMount 與 onError 都會回傳取消訂閱函式。
此功能可能產生的每個 FluzElementsError 以及其出現位置:
完整範例
/mint-reveal-token 是你自有的後端路由——它會使用你的 Fluz OAuth access token 呼叫 POST /v1/client-token,如鑄造 client token所述。
後續步驟
安全元件概覽
Token 鑄造、SDK 載入、樣式設計與 CSP。
安全卡片輸入
另一個安全元件能力——用於收集實體卡,而非揭示現有卡片。
即時示範
揭示、僅揭示 CVV 與遮罩,連線至預備環境。
範例整合
可執行的純 HTML 與 React 揭示範例,附帶 token 鑄造伺服器。