Contexto de la conversación

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 el sitio web, consulta Agregar el SDK de extensiones de Messenger.

Disponibilidad

Esta API solo está disponible en Messenger, a partir de la versión 113 de Android y de la 114 de iOS.

Para comprobar si está disponible para un cliente en particular, llama a getSupportedFeatures() y comprueba que la propiedad context esté en la respuesta.

El método getContext() recupera información adicional sobre la persona y la conversación que abrió la vista web. Es útil para crear experiencias de grupo interactivas y juegos, así como para restringir contenido que estaba pensado para compartirse solo en una conversación específica.

Se deberá usar getContext() en lugar de getUserID(), ya que este ahora quedó obsoleto.

Recuperar contexto de la conversación

Llama a esta función para obtener el PSID de la persona, el identificador de la conversación y el tipo de conversación. Para obtener una lista completa de los parámetros de método, consulta la referencia de getContext().

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

Formato de la respuesta

Si la devolución de llamada es correcta se pasará una respuesta que será un objeto de JavaScript en el formato siguiente:

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

Validar signed_request

Habrá situaciones en las que te será útil transmitir la información que obtuviste de getContext() a tu servidor interno y validarla antes de llevar a cabo alguna acción, como el inicio de sesión o una compra. Esto te permite asegurarte de que la información realmente proviene de Messenger y no se trata de un mensaje falsificado.

De acuerdo con la especificación de OAuth 2.0, signed_request está codificado mediante base64url y firmado con una versión HMAC de la clave secreta de la aplicación.

Puedes realizar la validación mediante los cuatro pasos siguientes:

  1. Divide la solicitud firmada en dos partes, separadas por un carácter '.' (por ejemplo, 238fsdfsd.oijdoifjsidf899).
  2. Decodifica la primera parte, la firma codificada, de la codificación base64url.
  3. Decodifica la segunda parte, la carga, de la codificación base64url. Esta se puede usar del lado del servidor si es necesario.
  4. Cifra la carga original mediante HMAC SHA-256 y tu clave secreta de la aplicación, y confirma que es igual a la firma codificada que se pasó originalmente.
  5. Debes validar también la marca de tiempo issued_at en la carga para asegurarte de que la solicitud es reciente.

Esto se puede realizar en cualquier lenguaje de programación moderno. Este es 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, '-_', '+/'));
}

Decodificar la carga dará como resultado un objeto con la misma información que devolvió originalmente getContext(), pero además contendrá 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 divulgar accidentalmente tu clave secreta de la aplicación, debes realizar esta validación siempre en tu servidor y nunca en el código del lado del cliente.

Usar identificadores de conversación con páginas globales

Algunos negocios usan una estructura global de página con varias páginas asociadas a un identificador de aplicación o bot. Si este es el caso, los identificadores de conversación que devuelva getContext() en la ampliación del chat serán diferentes para las personas en diferentes países.

Usa la API siguiente para convertir el identificador de conversación específico de la página de un país a uno global. Usa ese identificador de conversación global para mantener el estado de los usuarios que acceden a la ampliación del chat desde sus páginas regionales correspondientes.

Recuperar el identificador de conversación global:

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

Ejemplo de respuesta:

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

Si no hay una página global, global_tid no estará presente.