對話串背景資訊

Messenger 擴充功能 SDK

此方法屬於 Messenger 擴充功能 SDK 的一部分。若要瞭解如何將 SDK 加到您的網站,請參閱加入 Messenger 擴充套件 SDK一文。

適用版本

此 API 僅適用於 Android 版 Messenger 113 以上版本,以及 iOS 版 Messenger 114 以上版本。

若要確認特定用戶端是否適用,請呼叫 getSupportedFeatures() 並檢查回應中的 context 屬性。

getContext() 方法可針對開啟 WebView 的用戶和對話串擷取更多相關資訊。這項功能不僅適用於提升群組與遊戲中的互動體驗,也有助於限制任何內容的分享位置,讓內容僅分享在部分對話串中。

getUserID() 已淘汰,請改用 getContext()

擷取對話串背景資訊

呼叫此函式以取得用戶的 PSID、對話串編號和對話串類型。如需完整的方法參數清單,請參閱 getContext() Reference

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

回應格式

傳送給 success 回呼的回應將為下列格式的 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 規格)。

您可以透過下列 4 個步驟驗證資訊:

  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() 最初回傳的資訊,以及 algorithmissued_atpage_id 欄位:

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

請記住,為了避免應用程式密鑰外洩,請務必在您的伺服器上驗證,切勿以用戶端程式碼執行。

在全球粉絲專頁使用對話串編號

部分企業使用全球粉絲專頁架構,同時有多個粉絲專頁連結到一組應用程式編號或 Bot。 這類情況下,聊天擴充功能中的 getContext() 傳回的對話串編號,將因為用戶位於不同國家/地區而有所差異。

請使用下列 API,將國家/地區粉絲專頁特定的對話串編號解析為全球對話串編號,再以該全球對話串編號維持從各區域專頁存取聊天擴充功能的用戶狀態。

擷取全球對話串編號:

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

回應範例:

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

global_tid 不會出現在非全球粉絲專頁中。