Esta página asume que ya leíste el Resumen de Secure Elements: cubre la emisión de un token de cliente, la carga del SDK y el estilo de los campos, todo lo cual aplica aquí.
Verlo en vivo
La demo emite su propio token y monta el visor automáticamente. Usa Remint token & remount si los botones de revelado dejan de responder, y Reveal, Reveal CVV only o Mask para probar los controles a nivel de campo descritos abajo. Ábrela en su propia pestaña →
Emitir un token de revelado
Llama aPOST /v1/client-token con "purpose": "reveal" y el virtualCardId que quieres mostrar:
clientToken y loadToken que devuelve directamente a createCardViewer abajo.
Crear el visor
fields controla qué partes de la tarjeta se renderizan y en qué orden; si lo omites obtendrás ["pan", "expiry", "cvv"]. Cada entrada es un nombre de campo simple o un objeto { field, individualReveal }; "pan" es una forma abreviada de { field: "pan", individualReveal: true }. pan, expiry y cvv son los únicos nombres de campo válidos: cualquier otro lanza un FluzElementsError (error.code === "INVALID_FIELD") de forma síncrona, desde createCardViewer, antes de que llames a mount().
individualReveal es true por defecto en cada campo. Configurarlo en false impide que ese campo se revele por sí solo; consulta Revelar un solo campo. Es independiente de reveal(), que siempre revela todos los campos sin importar este ajuste.Montarlo
mount() agrega un iframe sandbox por cada campo configurado dentro del elemento contenedor que le pases: tres iframes separados para los fields por defecto, no un solo iframe combinado, y devuelve una promesa que se resuelve cuando cada iframe completa su handshake. Rechaza con un FluzElementsError si:
- el
styleque pasaste acreateCardViewerfalla la validación (error.code === "INVALID_STYLE") — ver Estilo de campos - un iframe no completa su handshake dentro de
mountTimeoutMs(error.code === "MOUNT_TIMEOUT"; por defecto 10 segundos, configurable víacreateCardViewer({ ..., mountTimeoutMs })) - un iframe no carga en absoluto, o este visor ya está montado (
error.code === "MOUNT_FAILED") — cada instancia deCardViewersolo puede montarse una vez; crea una nueva concreateCardViewersi necesitas montar de nuevo
Revelar y enmascarar campos
reveal(field?)— asíncrona. Obtiene el valor real desde Fluz y lo muestra. Sin argumento, obtiene y muestra todos los campos configurados sin importarindividualReveal. Con un nombre de campo, obtiene y muestra solo ese — a menos que ese campo haya sido configurado conindividualReveal: false, en cuyo caso rechaza conerror.code === "INDIVIDUAL_REVEAL_DISABLED". Un visor no montado, o un nombre de campo que no esté enfields, rechaza conMOUNT_FAILED.setMask(field, masked, options?)— síncrona, no asíncrona. Nunca obtiene nada; solo alterna lo que se muestra actualmente:setMask(field, true)vuelve a enmascarar el campo a su marcador, se haya revelado o no.setMask(field, false)lo desenmascara, pero solo muestra el valor real sireveal()ya obtuvo uno para ese campo. Llámalo antes de cualquierreveal()y el campo se quedará en su marcador, ya que aún no hay un valor obtenido que mostrar.setMask(field, true, { hidden: true })deja el campo en blanco por completo (vacío, ni siquiera un marcador) en lugar de mostrar puntos/last4/expiry.hiddensolo tiene efecto mientrasmaskedestrue.- No hay una llamada masiva para “enmascarar todo”; llama a
setMaskuna vez por cada campo enfieldssi necesitas reiniciar todo el visor.
destroy()— desmonta cada iframe y separa el visor. Llama a esto al desmontar para no dejar iframes montados cuando tu componente desaparezca.
Revelar un solo campo
Para revelar solo un campo por sí mismo (por ejemplo, un botón “Mostrar CVV” junto a ese campo), llama areveal(field); cada campo permite esto de forma predeterminada, así que no se necesita configuración para el caso común.
Si un campo no debe revelarse nunca por sí solo, y solo debe aparecer como parte de la llamada reveal() de toda la tarjeta, exclúyelo con { field, individualReveal: false } en fields:
reveal(field) contra un campo excluido rechaza con FluzElementsError (code: "INDIVIDUAL_REVEAL_DISABLED") sin contactar a frame-host. En cualquier caso, reveal() sin argumento siempre revela todos los campos montados; individualReveal no tiene efecto sobre ella.
Esta es una elección de integración del lado del cliente, no una capacidad aplicada por el servidor: controla lo que tu propia UI puede activar, no qué datos puede devolver el grant. No confíes en
individualReveal: false como un límite de seguridad.Manejar eventos
onMount se dispara una vez, después de que cada campo configurado haya renderizado dentro del iframe. onError se dispara por problemas que ocurren dentro de un iframe ya montado — un reveal() fallido o un límite de rate — en lugar de problemas con mount() o createCardViewer() en sí, que en su lugar rechazan o lanzan directamente (ver abajo). Tanto onMount como onError devuelven una función para desuscribirse.
Cada FluzElementsError que esta capacidad puede producir, y dónde aparece:
Ejemplo completo
/mint-reveal-token es tu propia ruta de backend: la que llama a POST /v1/client-token con tu token de acceso OAuth de Fluz, como se describe en Emitir un token de cliente.
Próximos pasos
Resumen de Secure Elements
Emisión de tokens, carga del SDK, estilos y CSP.
Demo en vivo
Revelar, revelar solo CVV y enmascarar, ejecutándose contra staging.
Integraciones de ejemplo
Ejemplos ejecutables en HTML plano y React para revelado con un servidor que emite tokens.