Контекст переписки

SDK расширений Messenger

Этот метод является частью SDK Messenger Extensions. О том, как добавить этот SDK на сайт, см. здесь.

Доступность

Этот API доступен только в Messenger версии 113 на Android и в Messenger версии 114 на iOS и более новых.

Чтобы проверить доступность на определенном клиенте, вызовите getSupportedFeatures() и проверьте наличие свойства context в отклике.

Метод getContext() возвращает дополнительную информацию о человеке и переписку, которая привела к открытию веб-представления. Это может быть полезно при создании интерактивных элементов и игр, а также для ограничения контента, который предполагалось размещать только в определенной переписке.

Следует использовать getContext() вместо упраздненного getUserID().

Получение контекста переписки

Вызовите эту функцию, чтобы получить ID пользователя, ID переписки и тип переписки. Полный список параметров метода см. в справке по getContext().

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

Формат отклика

Отклик, переданный в успешном обратном вызове, будет содержать объект JavaScript в следующем формате:

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

Подтверждение signed_request

Существуют ситуации, когда вы можете захотеть передать информацию, полученную от getContext() на свой сервер и подтвердить ее до выполнения действия, такого как вход или покупка. Это позволяет убедиться в том, что информация действительно поступила от Messenger и не является поддельной.

Параметр signed_request закодирован в base64url и подписан с помощью версии HMAC вашего секрета приложения на базе спецификации OAuth 2.0.

Чтобы подтвердить, следуйте инструкциям ниже:

  1. Разбейте подписанный запрос на две части с помощью символа '.' (например, 238fsdfsd.oijdoifjsidf899)
  2. Декодируйте первую часть — закодированную подпись — из base64url.
  3. Декодируйте вторую часть — полезные данные — из base64url. При необходимо это можно сделать на стороне сервера.
  4. Хэшируйте первоначальные полезные данные с помощью HMAC SHA-256 и секрета приложения и проверьте соответствие закодированной подписи, которая была передана.
  5. Возможно, вы также захотите подтвердить временную метку issued_at в полезных данных, чтобы убедиться в новизне запроса.

Это можно сделать в любом современном языке программирования. Ниже приведен пример в 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, '-_', '+/'));
}

Декодирование полезных данных приведет к созданию объекта с той же информацией, что была возвращена getContext(), но с добавлением полей algorithm, issued_at и page_id:

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

Помните: чтобы избежать случайного раскрытия секрета приложения, это подтверждение вы должны выполнять на своем сервере, а не в коде на стороне клиента.

Использование ID переписки с Глобальными Страницами

Некоторые используют структуру глобальной страницы с несколькими страницами, которые связаны с одним ID приложения или ботом. В этой ситуации ID переписки, возвращенные getContext() в расширении чата, будут отличаться для людей из разных стран.

Воспользуйтесь следующим API, чтобы разрешить ID переписки для страницы в глобальный ID переписки. Этот глобальный ID переписки позволит вам поддерживать состояние переписки с пользователями, которые получают доступ к расширению чата со своих региональных страниц.

Извлеките глобальный ID переписки:

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

Пример отклика:

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

Если глобальной страницы нет, global_tid будет отсутствовать.