บริบทของเธรด

SDK ส่วนขยายของ Messenger

วิธีการนี้เป็นส่วนหนึ่งของ SDK ส่วนขยายของ Messenger สำหรับข้อมูลเกี่ยวกับการรวม SDK ไว้ในไซต์ของเรา โปรดดู “เพิ่ม SDK ส่วนขยายของ Messenger

ความพร้อมใช้งาน

API ใช้งานได้เฉพาะใน Messenger เวอร์ชัน 113 ขึ้นไปบน Android และเวอร์ชัน 114 ขึ้นไปบน iOS

หากต้องการตรวจสอบความพร้อมใช้งานในแต่ละไคลเอ็นต์ ลองเรียก getSupportedFeatures() แล้วตรวจหาทรัพย์สิน “context” ในข้อความตอบกลับ

วิธี getContext() จะเรียกข้อมูลเพิ่มเติมเกี่ยวกับบุคคลและเธรดที่เปิดมุมมองเว็บ ข้อมูลเหล่านี้มีประโยชนต่อการสร้างประสบการณ์กลุ่มและเกมแบบอินเทอร์แอคทีฟ รวมถึงการจำกัดเนื้อหาที่มีจุดประสงค์สำหรับแชร์เฉพาะในบางเธรด

ควรใช้ “getContext()” แทน “getUserID()” ซึ่งในปัจจุบันไม่มีการสนับสนุนแล้ว

การเรียกบริบทของเธรด

เรียกฟังก์ชันนี้เพื่อรับ PSID ของบุคคล, ID ของเธรด และประเภทของเธรด สำหรับรายการแบบสมบูรณ์ของพารามิเตอร์วิธีการ โปรดดูที่เอกสารอ้างอิง getContext()

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 คือ 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() ส่งคืนมาในตอนแรก แต่จะมีช่องข้อมูล algorithm, issued_at และ page_id เพิ่มเข้ามา ดังนี้

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

โปรดทราบว่า การตรวจสอบข้อมูลนี้ควรเกิดขึ้นที่เซิร์ฟเวอร์และต้องไม่เป็นรหัสฝั่งไคลเอ็นต์ เพื่อป้องกันการเปิดเผยข้อมูลลับของแอพโดยไม่ตั้งใจ

การใช้ ID ของเธรดกับเพจทั่วโลก

บางธุรกิจใช้โครงสร้างเพจทั่วโลก ซึ่ง ID ของแอพหรือบอทหนึ่งรายการจะเชื่อมโยงเข้ากับหลายเพจ ในกรณีนี้ ID ของเธรดที่ getContext() ส่งคืนในส่วนขยายแชทจะแตกต่างกันไปสำหรับผู้คนในแต่ละประเทศ

ใช้ 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 จะไม่ปรากฏ