對話串內容

Messenger 擴充功能 SDK

此方法屬於 Messenger 擴充功能 SDK 的一部分。若要瞭解在網站中加入 SDK 的相關資訊,請參閱新增 Messenger 擴充功能 SDK

可用性

這個 API 僅適用 Messenger 113 版 (Android0) 和 114 版 (iOS) 中使用。

若要確認這個 API 在特定用戶端上的可用性,請調用 getSupportedFeatures() 並在回應中找出 context 屬性。

getContext() 方法會針對開啟了 Webview 的用戶和對話串擷取額外相關資訊。這個方法很適合用來建立互動式群組體驗和遊戲,以及限制任何只供分享至特定對話串的內容。

請放棄 getUserID() 改用 getContext(),前者已經停用。

擷取對話串內容

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

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 是根據 OAuth 2.0 規格以 base64url 編碼,並且簽署了 HMAC 版本的應用程式密鑰

您可以透過下列 4 個步驟進行驗證:

  1. 使用 '.' 字元(例如:238fsdfsd.oijdoifjsidf899)將簽署要求隔成 2 個部分
  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