ASP.NET Core
Razor Pages y MVC, con identificación desde los claims del usuario.
Antes de empezar
- Una app ASP.NET Core con Razor Pages o MVC
- El token público del workspace
1. Guardá el token en configuración
El token del Messenger es público, pero conviene tenerlo en appsettings para cambiarlo por entorno.
{ "Tinkay": { "MessengerToken": "pk_live_xxx" }}2. Agregá el script al layout
Va antes del cierre de </body> en _Layout.cshtml, después de tus propios scripts.
@inject IConfiguration Configuration<!-- ... tu contenido ... --> <script> window.TinkaySettings = { token: "@Configuration["Tinkay:MessengerToken"]" }; </script> <script src="https://cdn.tinkay.app/widget.js" async></script></body></html>En Razor Pages el archivo es Pages/Shared/_Layout.cshtml. El resto es idéntico.
3. Identificá al usuario autenticado
Leé los claims y pasalos en visitor. Tinkay asocia la conversación a un contacto real de tu workspace.
@using System.Security.Claims@inject IConfiguration Configuration<script> window.TinkaySettings = { token: "@Configuration["Tinkay:MessengerToken"]"@(User.Identity?.IsAuthenticated == true ? "," : ""), @if (User.Identity?.IsAuthenticated == true) { <text> visitor: { email: "@User.FindFirstValue(ClaimTypes.Email)", name: "@User.FindFirstValue(ClaimTypes.Name)", plan: "@(User.FindFirstValue("plan") ?? "Free")" } </text> } };</script><script src="https://cdn.tinkay.app/widget.js" async></script>Alternativa: Tag Helper reutilizable
Si preferís mantener la vista limpia, encapsulá todo en un Tag Helper y usá <tinkay-messenger /> en el layout.
using System.Security.Claims;using System.Text.Json;using Microsoft.AspNetCore.Http;using Microsoft.AspNetCore.Razor.TagHelpers;namespace MyApp.TagHelpers;[HtmlTargetElement("tinkay-messenger", TagStructure = TagStructure.WithoutEndTag)]public class TinkayMessengerTagHelper : TagHelper{ private readonly IConfiguration _config; private readonly IHttpContextAccessor _http; public TinkayMessengerTagHelper(IConfiguration config, IHttpContextAccessor http) { _config = config; _http = http; } public override void Process(TagHelperContext context, TagHelperOutput output) { var user = _http.HttpContext?.User; var settings = new Dictionary<string, object?> { ["token"] = _config["Tinkay:MessengerToken"] }; if (user?.Identity?.IsAuthenticated == true) { settings["visitor"] = new { email = user.FindFirstValue(ClaimTypes.Email), name = user.FindFirstValue(ClaimTypes.Name), plan = user.FindFirstValue("plan") ?? "Free" }; } var json = JsonSerializer.Serialize(settings); output.TagName = null; output.Content.SetHtmlContent( $"<script>window.TinkaySettings = {json};</script>" + "<script src=\"https://cdn.tinkay.app/widget.js\" async></script>"); }}Content Security Policy
Si tu app define un CSP (por middleware o web.config), habilitá los orígenes de Tinkay.
app.Use(async (context, next) =>{ context.Response.Headers.Append("Content-Security-Policy", "script-src 'self' 'unsafe-inline' https://cdn.tinkay.app; " + "frame-src https://app.tinkay.app; " + "connect-src 'self' https://app.tinkay.app"); await next();});Verificar la instalación
Entrá a Configuración, Instalación en tu workspace, pegá la URL pública del sitio y tocá Probar instalación. Tinkay busca el script y valida que el dominio esté permitido.
- Abrí tu sitio en una pestaña nueva y confirmá que aparece el botón flotante.
- En la consola del navegador, escribí
window.Tinkayy verificá que devuelve un objeto. - Escribí un mensaje de prueba y confirmá que llega al Inbox.
Errores frecuentes
- El widget no aparece: el dominio no está en Configuración, Dominios. Agregalo y recargá.
- Aparece en desarrollo pero no en producción: agregá también el dominio de producción, incluida la variante con
www. - Content Security Policy: permití
https://cdn.tinkay.appenscript-srcyhttps://app.tinkay.appenframe-srcyconnect-src. - Las comillas del email salen escapadas: usá
@Html.Raw(...)o serializá conJsonSerializercomo en el Tag Helper. - No aparece en producción con IIS: confirmá que el dominio real (no el interno) esté en Configuración, Dominios.
Cómo saber que quedó bien
- El botón flotante aparece en todas las vistas que usan el layout.
- Con sesión iniciada, el Inbox muestra el nombre y el email del usuario.
- La consola del navegador no reporta bloqueos de CSP.
