Konteks Utas

SDK Ekstensi Messenger

Metode ini adalah bagian dari SDK Ekstensi Messenger. Untuk informasi mengenai penyertaan SDK di situs Anda, buka Tambahkan SDK Ekstensi Messenger.

Ketersediaan

API ini tersedia hanya di Messenger v113+ di Android dan v114+ di iOS.

Untuk memeriksa ketersediaannya untuk klien tertentu, panggil getSupportedFeatures() dan periksa properti context dalam tanggapannya.

Metode getContext() menarik informasi tambahan tentang orang dan utas yang membuka webview. Ini bermanfaat dalam menciptakan pengalaman dan game grup yang interaktif, serta pembatasan konten apa pun yang ditujukan untuk dibagikan hanya dengan utas tertentu.

getContext() yang seharusnya digunakan sebagai ganti dari getUserID(), yang sekarang dihentikan.

Menarik Konteks Utas

Panggil fungsi ini untuk mendapatkan PSID orang, ID utas, dan jenis utas. Untuk daftar lengkap parameter metode, lihat Referensi getContext().

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

Format Tanggapan

Tanggapan yang diluluskan ke callback yang berhasil akan berupa objek JavaScript dalam format berikut:

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

Memvalidasi signed_request

Terdapat beberapa situasi yang mungkin membuat Anda ingin mentransmisikan informasi yang diperoleh dari getContext() ke backend Anda dan memvalidasinya sebelum melakukan tindakan seperti masuk atau pembelian. Dengan ini, Anda dapat memastikan bahwa informasinya benar-benar berasal dari Messenger dan pesan tersebut bukan pesan tipuan.

signed_request adalah base64url yang dikodekan dan ditandatangani dengan versi HMAC dari Kunci Rahasia Aplikasi Anda, berdasarkan spesifikasi OAuth 2.0.

Anda dapat memvalidasinya dengan 4 langkah berikut:

  1. Pisahkan permintaan yang ditandatangani menjadi dua bagian yang dipisahkan oleh karakter '.' (mis. 238fsdfsd.oijdoifjsidf899)
  2. Dekodekan bagian pertama — tanda tangan yang dikodekan — dari pengodean base64url.
  3. Dekodekan bagian kedua — payload — dari pengodean base64url. Ini dapat digunakan di sisi server jika diperlukan.
  4. Urai payload asli menggunakan HMAC SHA-256 dan kunci rahasia aplikasi Anda, dan konfirmasikan bahwa ini sama dengan tanda tangan yang dikodekan yang sebelumnya diluluskan.
  5. Anda mungkin juga ingin memvalidasi capwaktu issued_at di payload untuk memastikan kebaruan permintaan tersebut.

Tindakan ini dapat dilakukan di bahasa pemrograman modern apa pun. Di bawah ini adalah contoh di 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, '-_', '+/'));
}

Mengodekan payload akan menghasilkan objek dengan informasi yang sama seperti informasi yang aslinya dikembalikan dengan getContext(), namun dengan tambahan kolom algorithm, issued_at, dan page_id:

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

Harap diingat, untuk mencegah bocornya kunci rahasia aplikasi Anda secara tidak sengaja, validasi ini harus terjadi di server Anda dan tidak terjadi di kode sisi klien.

Menggunakan ID Utas dengan Halaman Global

Beberapa bisnis menggunakan struktur halaman global dengan beberapa halaman yang berkaitan dengan satu ID aplikasi atau bot. Dalam situasi ini, ID utas dikembalikan oleh getContext() dalam ekstensi obrolan yang akan berbeda-beda untuk orang-orang di berbagai negara.

Gunakan API berikut untuk menghasilkan ID utas khusus halaman negara di ID utas global, dan gunakan ID utas global untuk menjaga status pengguna yang mengakses ekstensi obrolan dari halaman regional mereka masing-masing.

Ambil ID utas global:

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

Contoh tanggapan:

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

Jika tidak ada halaman global, maka global_tid tidak akan ada.