对话信息

Messenger 功能插件 SDK

这是 Messenger 功能插件 SDK 提供的一种方法。如需详细了解如何在网站上添加 SDK,请参阅添加 Messenger 功能插件 SDK

可用性

此 API 仅适用于 Android 版 Messenger v113+ 和 iOS 版 Messenger v114+。

要检查此 API 在特定客户端上的可用性,请调用 getSupportedFeatures(),并查看响应中的 context 属性。

getContext() 方法可检索开启了 webview 的用户和对话的更多信息。对于打造互动型团体式体验和游戏,以及将预期分享的任何内容限制于特定的对话,这是非常实用的方法。

应使用 getContext() 来替代 getUserID(),因为后者现已停用。

检索对话信息

调用此函数,获取用户的 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 使用 base64url 编码,并根据 OAuth 2.0 协议使用 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() 最初返回的信息,以及 algorithmissued_atpage_id 字段:

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

请记住,为避免意外泄露您的应用密钥,建议在您的服务器上执行这一验证,切勿使用任何客户端代码进行验证。

结合使用对话编号和全球主页

一些商家使用一个全球主页与多个关联至同一应用编号或智能助手的主页相对应的架构。 在这种情况下,由功能插件中的 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 将不会存在。