Ngữ cảnh cuộc trò chuyện

SDK tiện ích Messenger

Phương pháp này là một phần của Messenger Extensions SDK. Để biết thông tin về cách đưa SDK vào trang web của bạn, hãy xem Thêm Messenger Extensions SDK.

Tính khả dụng

API này chỉ khả dụng trong Messenger trên v113+ trên Android và v114+ trên iOS.

Để kiểm tra tính khả dụng của API này trên một máy khách nhất định, hãy gọi getSupportedFeatures() và kiểm tra tài sản context trong phản hồi.

Phương thức getContext() truy xuất thêm thông tin về người và cuộc trò chuyện mở ra chế độ xem web. Phương thức này rất hữu ích trong việc tạo ra các trò chơi và trải nghiệm nhóm tương tác cũng như giới hạn bất kỳ nội dung nào chỉ được chia sẻ với một cuộc trò chuyện nhất định.

Nên sử dụng getContext() thay vì getUserID() hiện không được dùng nữa.

Truy xuất ngữ cảnh cuộc trò chuyện

Gọi hàm này để lấy ID trong trang (PSID) của người dùng, ID cuộc trò chuyện và loại cuộc trò chuyện. Để xem danh sách đầy đủ các thông số phương thức, hãy xem Tài liệu tham khảo về getContext().

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

Định dạng phản hồi

Phản hồi đã chuyển đến lệnh gọi lại thành công sẽ là một đối tượng JavaScript ở định dạng sau:

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

Xác thực signed_request

Có nhiều trường hợp mà bạn có thể muốn truyền thông tin thu thập được từ getContext() đến chương trình phụ trợ của mình và xác thực thông tin đó trước khi thực hiện một số hành động như đăng nhập hoặc mua hàng. Điều này cho phép bạn đảm bảo rằng thông tin thực sự đến từ Messenger và không bị giả mạo.

signed_request được mã hóa base64url và đánh dấu bằng một phiên bản HMAC của Khóa bí mật của ứng dụng, dựa trên thông số OAuth 2.0.

Bạn có thể xác thực bằng 4 bước sau:

  1. Tách yêu cầu đã đánh dấu thành 2 phần được phân tách bằng một ký tự '.' (ví dụ: 238fsdfsd.oijdoifjsidf899)
  2. Giải mã phần đầu tiên - chữ ký được mã hóa - từ mã hóa base64url
  3. Giải mã phần thứ hai - phần tải dữ liệu - từ mã hóa base64url. Thông tin này có thể được sử dụng bên phía máy chủ nếu cần.
  4. Mã hóa phần tải dữ liệu gốc bằng cách sử dụng HMAC SHA-256 và khóa bí mật của ứng dụng của bạn đồng thời xác nhận rằng nó bằng với chữ ký đã mã hoá được chuyển ban đầu.
  5. Bạn cũng có thể muốn xác thực nhãn thời gian issued_at trong phần tải dữ liệu để đảm bảo tính gần đây của yêu cầu.

Điều này có thể thực hiện được bằng bất kỳ ngôn ngữ lập trình hiện đại nào. Bên dưới là ví dụ trong 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, '-_', '+/'));
}

Việc giải mã phần tải dữ liệu sẽ mang lại một đối tượng có cùng thông tin như ban đầu getContext() trả về, nhưng bổ sung trường algorithm, issued_atpage_id:

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

Hãy nhớ rằng, để tránh vô tình tiết lộ khóa bí mật của ứng dụng, việc xác thực này nên thực hiện trên máy chủ của bạn và không bao giờ được thực hiện trong mã phía máy khách.

Sử dụng ID cuộc trò chuyện với Trang toàn cầu

Một số doanh nghiệp sử dụng cấu trúc trang toàn cầu với nhiều trang được liên kết với một ID ứng dụng hoặc bot. Trong trường hợp này, ID cuộc trò chuyện được getContext() trả về trong tiện ích trò chuyện sẽ khác đối với những người ở các quốc gia khác nhau.

Sử dụng API sau để chuyển ID cuộc trò chuyện riêng trên trang quốc gia sang ID cuộc trò chuyện toàn cầu và sử dụng ID cuộc trò chuyện toàn cầu đó để duy trì trạng thái giữa những người dùng truy cập tiện ích trò chuyện từ các trang khu vực tương ứng của họ.

Truy xuất ID cuộc trò chuyện toàn cầu:

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

Phản hồi mẫu:

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

Nếu không có trang toàn cầu thì sẽ không có global_tid.