Contexto de la cadena de mensajes

SDK de extensiones de Messenger

Este método forma parte del SDK de extensiones de Messenger. Para obtener información sobre cómo incluir el SDK en tu sitio web, consulta Añadir el SDK de extensiones de Messenger.

Disponibilidad

Esta API solo está disponible en Messenger en la versión 113 y superiores de Android, así como en la versión 114 y posteriores de iOS.

Si quieres verificar su disponibilidad para un cliente concreto, llama al método getSupportedFeatures() y comprueba la propiedad context de la respuesta.

El método getContext() recupera información adicional sobre la persona y la cadena de mensajes que hizo que se abriese la vista web. Puede resultar útil cuando se crean experiencias de grupo y juegos interactivos, así como cuando se quiere limitar cualquier tipo de contenido que únicamente se desea compartir en una cadena de mensajes concreta.

Debería usarse getContext() en lugar de getUserID(), ya que este último es un método obsoleto.

Recuperar el contexto de la cadena de mensajes

Llama a esta función para obtener el identificador de usuario (PSID) de la persona, así como el identificador y el tipo de la cadena de mensajes. Si quieres obtener una lista completa de los parámetros del método, consulta la referencia de “getContext()”.

MessengerExtensions.getContext('YOUR_APP_ID', 
  function success(thread_context){
    // success
  },
  function error(err){
    // error
  }
);

Formato de respuesta

La respuesta que se pasará a la devolución de llamada correcta será un objeto de JavaScript con el siguiente formato:

{
  "thread_type": "GROUP",
  "tid": "1411911565550430",
  "psid": "1293479104029354",
  "signed_request": "5f8i9XXH2hEaykXHKFvu-E5Nr6QRqN002JO7yl-w_9o.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImlzc3VlZF9hdCI6MTUwNDA0NjM4MCwicGFnZV9pZCI6NjgyNDk4MTcxOTQzMTY1LCJwc2lkIjoiMTI1NDQ1OTE1NDY4MjkxOSIsInRocmVhZF90eXBlIjoiVVNFUl9UT19QQUdFIiwidGlkIjoiMTI1NDQ1OTE1NDY4MjkxOSJ9"
}

Validar el parámetro signed_request

En algunas situaciones, es posible que desees transmitir la información que se obtiene de la función getContext() a tu back-end y validarla antes de realizar alguna acción, como iniciar sesión o comprar. De esta forma, puedes asegurarte de que la información proviene realmente de Messenger y no es falsa.

El parámetro signed_request se cifra mediante base64url y se firma con una versión HMAC de la clave secreta de la aplicación, basada en la especificación OAuth 2.0.

Para validarlo, sigue estos cuatro pasos:

  1. Divide la solicitud firmada en dos partes delimitadas por un carácter “'.'” (por ejemplo, 238fsdfsd.oijdoifjsidf899).
  2. Descodifica la primera parte (la firma cifrada) del cifrado base64url.
  3. Descodifica la segunda parte (la carga útil) del cifrado base64url. En caso necesario, se puede utilizar en el servidor.
  4. Crea un identificador para la carga útil original mediante HMAC SHA-256 y la clave secreta de la aplicación, y verifica que es igual a la firma cifrada que se ha pasado originalmente.
  5. También deberías validar la marca de tiempo issued_at en la carga útil para garantizar que la solicitud es reciente.

Estos pasos pueden realizarse en cualquier lenguaje moderno de programación. A continuación figura un ejemplo en PHP:

function parse_signed_request($signed_request) {
  list($encoded_sig, $payload) = explode('.', $signed_request, 2); 

  $secret = "appsecret"; // Use your app secret here

  // Decode the data
  $sig = base64_url_decode($encoded_sig);
  $data = json_decode(base64_url_decode($payload), true);

  // Confirm the signature
  $expected_sig = hash_hmac('sha256', $payload, $secret, $raw = true);
  if ($sig !== $expected_sig) {
    error_log('Bad Signed JSON signature!');
    return null;
  }

  return $data;
}

function base64_url_decode($input) {
  return base64_decode(strtr($input, '-_', '+/'));
}

Al descodificar la carga útil, se proporciona un objeto con la misma información que el método getContext() ha devuelto originalmente, pero se añaden los campos algorithm, issued_at y page_id.

{
  "psid": "1293479104029354", 
  "algorithm": "HMAC-SHA256", 
  "thread_type": "GROUP", 
  "tid": "1411911565550430", 
  "issued_at": 1491351619, 
  "page_id": 167938560376726
}

Recuerda que, para evitar difundir por error tu clave secreta de la aplicación, esta validación debería realizarse en tu servidor, nunca en el código del cliente.

Utilizar identificadores de cadenas de mensajes con páginas globales

Algunas empresas utilizan una estructura de páginas globales con varias de ellas asociadas a un identificador de la aplicación o bot. En este caso, los identificadores de cadenas de mensajes que el método getContext() devuelve en la ampliación del chat son distintos para las personas de diferentes países.

Utiliza la siguiente API para convertir el identificador de la cadena de mensajes de la página específica del país en un identificador de cadena de mensajes global. A continuación, úsalo para mantener el estado entre los usuarios que accedan a la ampliación de chat desde sus respectivas páginas regionales.

Recuperar el identificador de cadena de mensajes global:

curl -X GET "https://graph.facebook.com/v2.6/{thread-id}?access_token=<PAGE_ACCESS_TOKEN>"
    

Respuesta de ejemplo:

    {"tid":1577059318985661,"global_tid":1577059318985661}
  

Si no existe ninguna página global, el objeto global_tid no aparece.