このメソッドは、MessengerエクステンションSDKの一部です。サイトにSDKを実装する方法については、こちらのMessengerエクステンションSDKの追加に関するページをご覧ください。
利用の条件
このAPIは、Androidの場合はv113以降のMessenger、iOSの場合はv114以降のMessengerでのみご利用いただけます。
所定のクライアントで利用可能かを確認するには、getSupportedFeatures()
を呼び出し、応答の中にcontext
プロパティがあるか確認します。
getContext()
メソッドは、利用者とウェブビューを開いたスレッドに関する追加情報を取得します。インタラクティブなグループエクスペリエンスやゲームを開発したり、コンテンツを制限して特定のスレッドのみにシェアしたりする際に便利です。
getUserID()
は現在廃止されているため、代わりにgetContext()
を使用する必要があります。
この関数を呼び出すと、利用者のPSID、スレッドID、スレッドのタイプを取得できます。すべてのメソッドパラメーターのリストについては、「getContext() リファレンス」をご覧ください。
MessengerExtensions.getContext('YOUR_APP_ID',
function success(thread_context){
// success
},
function error(err){
// error
}
);
success callbackに渡される応答は、以下の形式のJavaScriptオブジェクトになります。
{
"thread_type": "GROUP",
"tid": "1411911565550430",
"psid": "1293479104029354",
"signed_request": "5f8i9XXH2hEaykXHKFvu-E5Nr6QRqN002JO7yl-w_9o.eyJhbGdvcml0aG0iOiJITUFDLVNIQTI1NiIsImlzc3VlZF9hdCI6MTUwNDA0NjM4MCwicGFnZV9pZCI6NjgyNDk4MTcxOTQzMTY1LCJwc2lkIjoiMTI1NDQ1OTE1NDY4MjkxOSIsInRocmVhZF90eXBlIjoiVVNFUl9UT19QQUdFIiwidGlkIjoiMTI1NDQ1OTE1NDY4MjkxOSJ9"
}
signed_request
を検証するログインや購入などのアクションを実行する前に、getContext()
から取得した情報をバックエンドに転送し、検証したい場合もあります。これで、その情報が本当にMessengerから得られたもので、偽装ではないことを確かめられます。
signed_request
はbase64urlでエンコードされており、OAuth 2.0の仕様に基づいてApp SecretのHMACバージョンで署名されています。
次の4つのステップで検証できます。
'.'
」文字で表区切られる2つの部分に分けます(例: 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 }
app secretを誤って開示するのを避けるために、この検証は自分のサーバーで実施し、クライアント側のコードでは行わないようにする必要があります。
一部のビジネスは、1つのアプリIDやボットに関連付けられた複数のページを持つグローバルページ構造を使っています。 この場合、チャットエクステンションでgetContext()
により返されるスレッドIDは、利用者の国によって異なります。
以下の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
は存在しません。