Этот метод является частью 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.
Чтобы подтвердить, следуйте инструкциям ниже:
'.'
(например, 238fsdfsd.oijdoifjsidf899
)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 переписки, возвращенные 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
будет отсутствовать.