Contexto do tópico

SDK das Extensões do Messenger

Este método faz parte do SDK das Extensões do Messenger. Para obter informações sobre como incluir o SDK no seu site, consulte Adicionar SDK de Extensões do Messenger.

Disponibilidade

Esta API está disponível apenas no Messenger para Android v113 e iOS v114.

Para verificar a disponibilidade em um determinado cliente, chame getSupportedFeatures() e verifique a propriedade context na resposta.

O método getContext() retoma informações adicionais sobre as pessoas e os tópicos abertos na webview. É útil para a criação de experiências de grupo interativas e jogos, além de restringir conteúdo destinado a ser compartilhado apenas em determinado tópico.

getContext() deve ser usado no lugar de getUserID(), que foi descontinuado.

Retomar contexto de tópico

Chame esta função para obter o PSID da pessoa, o número de identificação do tópico e o tipo de tópico. Para uma lista completa de parâmetros do método, veja a Referência getContext().

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

Formato da resposta

A resposta transmitida para o retorno da chamada com êxito será um objeto JavaScript no seguinte formato:

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

Como validar a signed_request

Há situações em que será conveniente transmitir as informações obtidas em getContext() para seu back-end e validá-las antes de realizar ações, como um efetuar um login ou compra. Isso permite garantir que as informações são realmente provenientes do Messenger e não são falsas.

A signed_request é codificado para base64url e assinado com uma versão HMAC de sua Chave Secreta do Aplicativo, com base na especificação OAuth 2.0.

Você pode validá-la seguindo as quatro etapas a seguir:

  1. Divida a solicitação assinada em duas partes delimitadas por um caractere '.' (por exemplo, 238fsdfsd.oijdoifjsidf899)
  2. Decodifique a primeira parte — a assinatura codificada — da codificação de base64url
  3. Decodifique a segunda parte — a carga — da codificação de base64url. Isso pode ser usado no lado do servidor, se necessário.
  4. Codifique em hash a carga original usando HMAC SHA-256 e a chave secreta do aplicativo, e confirme se é similar à assinatura codificada originalmente transmitida.
  5. Procure validar o carimbo de data/hora issued_at na carga, para garantir que a solicitação seja recente.

Isso pode ser feito em qualquer linguagem de programação moderna. Confira abaixo um exemplo em 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, '-_', '+/'));
}

Decodificar a carga renderá um objeto com a mesma informação originalmente retornada por getContext(), mas com a adição dos campos algorithm, issued_at, e page_id:

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

Lembre-se de que, para evitar a divulgação acidental da chave secreta do aplicativo, essa validação deverá ocorrer no seu servidor e nunca no código do cliente.

Como usar os números de identificação do tópico com Páginas globais

Algumas empresas usam uma estrutura de página global com várias páginas associadas com um ID do aplicativo ou bot. Nessa situação, os números de identificação do tópico retornados por getContext() na extensão do bate-papo serão diferentes para pessoas em países diferentes.

Use a seguinte API para transformar o número de identificação do tópico específico para a página de um país em um número de identificação do tópico global. Em seguida, utilize o número de identificação do tópico global para manter o estado entre usuários que acessam a extensão de bate-papo de suas respectivas páginas regionais.

Recuperar o número de identificação do tópico global:

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

Exemplo de resposta:

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

Caso não exista uma página global, global_tid não estará presente.