Widget de chat web
Los dos niveles de integración
Magento admite las dos formas, y conviene decidir cuál necesita el proyecto antes de escribir una línea de código:Nivel 1 — Instalación sin código
Crear el canal Web en MINDO
Pegarlo en el admin de Magento
async y
autocontenido.Limpiar caché y verificar
data-mindo-token mal copiado.Nivel 2 — Identificar clientes logueados
Acá es donde Magento tiene una particularidad que hay que respetar, y es la razón por la que este nivel necesita un módulo.Por qué no se puede hacer de la forma simple
La guía base explica que la identidad viaja en un atributo del<script>:
La solución: private content (customer data sections)
Magento tiene un mecanismo pensado exactamente para esto: datos por cliente sobre páginas cacheadas. El HTML se cachea igual para todos; los datos personales llegan después, por una petición aparte que nunca se cachea.El módulo, archivo por archivo
Todo vive enapp/code/Mindo/ChatWidget/.
Guardar el secreto del canal
.phtml, nunca en un repositorio.La forma limpia es una config encriptada. Declarala en etc/adminhtml/system.xml
con el backend model de Magento para valores encriptados:--lock-env el valor queda en app/etc/env.php, que normalmente está fuera
del repositorio. Es la opción más simple si no querés armar el system.xml.Instalar la librería de JWT
La clase que firma
app/code/Mindo/ChatWidget/CustomerData/MindoIdentity.phpRegistrar la section
app/code/Mindo/ChatWidget/etc/frontend/di.xml — le dice a Magento qué clase
responde por esta section:app/code/Mindo/ChatWidget/etc/frontend/sections.xml — cuándo se invalida:sections.xml la section queda cacheada del lado del cliente y el token no
se refresca al iniciar o cerrar sesión: el chat seguiría mostrando al cliente
anterior hasta que venza el token.El JavaScript que se lo pasa al widget
app/code/Mindo/ChatWidget/view/frontend/web/js/identity.jsview/frontend/templates/identity.phtml:view/frontend/layout/default.xml:Habilitar y verificar
- En la consola del navegador,
window.Mindotiene que existir. - En la pestaña Network, buscá
/customer/section/load/: la respuesta debe traermindo-identitycon unidentityque empiece eneyJ. - En MINDO, escribí un mensaje desde el chat: el contacto tiene que aparecer con nombre real, no como “Visitante ####”.
Preguntas frecuentes
¿Y si el sitio usa Hyvä en vez de Luma?
¿Y si el sitio usa Hyvä en vez de Luma?
di.xml y el sections.xml
no cambian, porque las sections son un mecanismo del backend de Magento, no del
theme.Lo que cambia es el JavaScript: Hyvä no usa Knockout ni el módulo
Magento_Customer/js/customer-data, así que la lectura de la section se hace con su
propio helper sobre Alpine. La lógica es la misma —leer mindo-identity y llamar a
window.Mindo.setUser()— pero confirmá la API contra la versión de Hyvä del
proyecto antes de escribirlo.Como alternativa independiente del theme, Magento dispara el evento
private-content-loaded en el documento cuando las sections se actualizan; podés
engancharte ahí y leer el valor del storage del navegador.¿Funciona en Magento 1?
¿Funciona en Magento 1?
<script> en el layout.El Nivel 2 también es posible, pero no hay sections: habría que exponer un endpoint
propio que devuelva el JWT del cliente logueado y llamarlo desde el front. Tené en
cuenta que Magento 1 está fuera de soporte desde 2020.¿Por qué no firmo el token directamente en el .phtml?
¿Por qué no firmo el token directamente en el .phtml?
¿Qué pasa cuando el cliente cierra sesión?
¿Qué pasa cuando el cliente cierra sesión?
sections.xml invalida mindo-identity en el logout, la section vuelve con
identity: null y el JS llama a window.Mindo.clearUser(). El visitante pasa a
anónimo y el chat sigue funcionando.¿Hace falta que el módulo renderice también el snippet?
¿Hace falta que el módulo renderice también el snippet?
¿Cuánto dura el token y hay que renovarlo?
¿Cuánto dura el token y hay que renovarlo?
exp a más de 7 días: un
token con vencimiento más lejano se considera inválido y el visitante queda anónimo,
sin ningún error visible.Configuré todo y el contacto sigue apareciendo como Visitante
Configuré todo y el contacto sigue apareciendo como Visitante
- Que el secreto sea el del mismo canal que el token del snippet.
- Que
/customer/section/load/devuelvaidentitycon un valor, y nonull. - Que el
expesté en segundos y a menos de 7 días. - Que el claim se llame
suby el algoritmo sea HS256.

