Thread Context

SDK Messenger Extensions

Cette méthode fait partie du SDK Messenger Extensions. Pour plus d’informations sur l’intégration du SDK dans votre site web, consultez Ajout du SDK Messenger Extensions.

Disponibilité

Cette API est uniquement disponible dans Messenger, version 113 ou ultérieure sur Android et version 114 ou ultérieure sur iOS.

Pour vérifier sa disponibilité pour un client donné, appelez getSupportedFeatures() et recherchez la propriété context dans la réponse.

La méthode getContext() reçoit des informations supplémentaires à propos de la personne et du fil qui a ouvert la Webview. Elle est utile pour la création d’expériences de groupe interactives et de jeux, mais aussi pour restreindre tout contenu créé pour le partage sur un fil précis.

getContext() doit être utilisé au lieu de getUserID(), qui est désormais obsolète.

Récupération du contexte du fil

Appelez cette fonction pour obtenir le PSID de la personne, ainsi que l’ID et le type du fil. Pour une liste complète des paramètres de la méthode, consultez la référence getContext().

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

Format de réponse

La réponse envoyée au rappel de réussite est un objet JavaScript au format suivant :

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

Validation de la signed_request

Vous pouvez être amené à transmettre les informations récupérées par getContext() à votre serveur principal et à les valider avant d’effectuer une action comme une connexion ou un achat. Cela vous garantit que les informations sont bien tirées de Messenger et qu’elles n’ont pas été usurpées.

Le paramètre signed_request est encodé avec base64url et signé avec une version HMAC de votre clé secrète, en fonction de la spécification OAuth 2.0.

Vous pouvez le valider en suivant ces quatre étapes :

  1. Séparez la demande en deux parties, délimitées par un caractère '.' (par exemple, 238fsdfsd.oijdoifjsidf899).
  2. Décodez la première partie (la signature encodée) avec un encodage base64url.
  3. Décodez la deuxième partie (la charge utile) avec un encodage base64url. Ces données peuvent être utilisées côté serveur si besoin.
  4. Hachez la charge utile d’origine avec HMAC SHA-256 et votre clé secrète, puis confirmez son égalité avec la signature encodée d’origine.
  5. Nous vous conseillons également de valider le timestamp issued_at de la charge utile pour que la demande soit récente.

Vous pouvez suivre ces étapes dans n’importe quel langage de programmation moderne. Voici un exemple 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, '-_', '+/'));
}

Le décodage de la charge utile renvoie un objet contenant les mêmes informations que celles renvoyées par getContext(), mais avec en plus les champs algorithm, issued_at et page_id :

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

N’oubliez pas que pour éviter de divulguer accidentellement votre clé secrète, cette validation doit se faire sur votre serveur et jamais avec le code côté client.

Utilisation des ID du fil avec les pages mondiales

Certaines entreprises utilisent une structure de page mondiale avec plusieurs pages associées à un ID d’app ou un bot. Dans ce cas, les ID du fil renvoyés par getContext() dans l’extension de discussion sont différents pour les personnes d’autres pays.

Utilisez l’API suivante pour transformer l’ID du fil par pays en ID mondial, et utilisez-le pour stabiliser les utilisateurs qui accèdent à l’extension de discussion à partir de leur page régionale respective.

Récupérer l’ID du fil mondial :

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

Exemple de réponse :

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

S’il n’y a pas de page mondiale, global_tid n’apparaît pas.