patToken, se lo entregas al widget, y el usuario se va — o tu propio sistema cancela la orden un minuto después. El token permanece válido hasta el exp con el que lo firmaste, así que sin una forma de revocarlo el usuario podría volver más tarde y completar un pago que ya no quieres.
terminateWidgetSession finaliza la sesión del lado del servidor. Al usuario se le niega el acceso la próxima vez que navegue dentro del widget, y cualquier intento de pago contra esa sesión es rechazado.
Requisitos previos: la API Key de tu aplicación para autenticación Basic, y ya sea el operator token que emitiste o su
jti.Autenticación
Esta mutación se autentica con las credenciales de tu aplicación, no con un access token de usuario — el mismo encabezadoBasic que ya usas para generateUserAccessToken:
app_id:apiSecret que verifica el servidor. Usa la key de la misma aplicación cuyo apiSecret firmó el operator token.
Solo puedes terminar sesiones que pertenezcan a la aplicación con la que te autenticas. Un jti emitido por una aplicación diferente no se ve afectado por tu llamada — obtendrás una respuesta exitosa con wasActive: false, y la sesión de esa aplicación seguirá en ejecución.
La autenticación Basic no está disponible para aplicaciones con estado PERSONAL.
Identificar la sesión
Proporciona ya sea el operator token o sujti. Se requiere al menos uno.
- Por token (preferido)
- Por jti
Pasa el mismo
patToken que entregaste al widget. Se verifica contra el secreto de tu aplicación, por lo que un token que no es tuyo se rechaza de inmediato.Un token ya expirado igualmente es aceptado — terminar una sesión expirada es inofensivo, y significa que no tienes que rastrear la expiración antes de llamar.El propio exp del token también limita cuánto tiempo se recuerda la terminación, por lo que esta es la mejor opción cuando aún lo tienes.jti se trata como una afirmación sobre este — un jti que no coincida con el propio del token se rechaza en lugar de ignorarse silenciosamente, por lo que una confusión no puede terminar la sesión equivocada.
Argumentos
input(TerminateWidgetSessionInput!): identifica la sesión a terminar.
Campos de TerminateWidgetSessionInput
Mutación de ejemplo
Ejemplo con cURL
Respuesta de ejemplo
Campos de la respuesta
wasActive: false es un éxito, no un fallo. Es la respuesta normal cuando el usuario nunca abrió el widget — que también es el momento más seguro para cancelar. Terminar una sesión que nunca se abrió está completamente soportado y es la forma recomendada de abortar un pago que ya entregaste.Cuando se rechaza la terminación
La terminación es idempotente — terminar una sesión ya terminada tiene éxito. Se rechaza en exactamente dos casos, cada uno significando que la cuestión del dinero ya está resuelta:
Otros errores que puedes ver:
Lo que ve el usuario
La terminación entra en vigor en la próxima navegación o actualización del usuario dentro del widget. No cierra una pantalla que ya está renderizada. Cuando vuelva a moverse, verá un mensaje de “Sesión finalizada” que nombra tu aplicación y le indica cerrar la ventana e iniciar de nuevo desde tu producto. Si llega hasta confirmar un pago, esa confirmación se rechaza con el mismo mensaje, y el pago se rechaza del lado del servidor conWidgetSessionTerminated (WIDGET-005, 410).
Cuánto tiempo se recuerda una terminación
Una sesión terminada se rechaza durante tanto tiempo como de otro modo podría haberse usado:- Terminada por token — hasta el propio
expdel token, y nunca menos de una hora. - Terminada solo por
jti— por 30 días. Nada limita por cuánto tiempo puedes firmar un operator token, así que sin unexpque leer la terminación se conserva muy por encima de cualquier vida útil plausible de la sesión.
Próximos pasos
Configura tu servidor
Genera el
patToken y el jti que toma esta mutación.Integra el widget
Etiqueta de script, llamada de init, vinculación del botón.
Resumen de Widgets embebidos
Cómo encajan las sesiones del widget, grants de OAuth y tokens de transacción preaprobados.
Idempotencia
Por qué cada llamada que mueve dinero necesita un
jti único.