스레드 컨텍스트

Messenger 확장 기능 SDK

이 메서드는 Messenger 확장 기능 SDK의 일부입니다. 사이트에 SDK를 포함하는 데 관한 정보는 Messenger 확장 기능 SDK 추가를 참조하세요.

사용 가능 여부

이 API는 Android의 경우 v113 이상, iOS의 경우 v114 이상의 Messenger 버전에서만 사용할 수 있습니다.

특정 클라이언트에서 사용 가능 여부를 확인하려면 getSupportedFeatures()를 호출하고 응답의 context 속성을 확인하세요.

getContext() 메서드를 사용하면 WebView를 연 사용자 및 스레드에 관한 추가 정보를 검색할 수 있습니다. 이 메서드는 인터랙티브 그룹 환경 및 게임을 만드는 데는 물론 특정 스레드에만 공유되도록 설정된 콘텐츠를 제한하는 데도 유용합니다.

이제 사용 중단된 getUserID() 대신 getContext()를 사용해야 합니다.

스레드 컨텍스트 검색

사용자의 PSID, 스레드 ID 및 대화 유형을 가져오려면 이 함수를 호출하세요. 메서드 매개변수의 전체 리스트를 보려면 getContext() 참고 자료를 확인하세요.

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

응답 형식

success callback에 전달되는 응답은 다음과 같은 형식의 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. 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_atpage_id 필드가 추가됩니다.

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

앱 시크릿 코드를 실수로 누설하지 않기 위해 클라이언트 쪽 코드가 아니라 서버에서 확인해야 합니다.

스레드 ID를 글로벌 페이지와 함께 사용

일부 비즈니스에서는 글로벌 페이지 구조를 하나의 앱 ID 또는 봇과 연결된 여러 페이지와 함께 사용합니다. 이 경우 채팅 확장 기능에서 getContext()에 의해 반환되는 스레드 ID는 여러 국가의 사용자별로 다릅니다.

다음 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가 존재하지 않습니다.