Webhooks da Meta para a plataforma do Messenger |
Com os Webhooks, você pode receber notificações HTTP em tempo real sobre mudanças em objetos específicos no gráfico social da Meta. Por exemplo, podemos notificar você sempre que uma pessoa enviar uma mensagem para sua Página do Facebook ou conta profissional do Instagram. Essas notificações possibilitam monitorar mensagens recebidas e atualizações no status de mensagens. Elas também ajudam a evitar limites de volume que poderiam ocorrer se você consultasse os pontos de extremidade da plataforma do Messenger para rastrear essas alterações.
Para implementar Webhooks em conversas do Messenger ou do Instagram, você precisará fazer o seguinte:
Execute estas ações antes de começar:
Seu servidor deve processar dois tipos de solicitação HTTPS: solicitações de verificação e notificações de evento. Como as duas solicitações usam HTTPS, o servidor deve ter um certificado TLS ou SSL válido configurado e instalado corretamente. Os certificados autoatribuídos não são suportados.
As seções abaixo explicam o conteúdo de cada tipo de solicitação e como responder a elas.
As amostras de código apresentadas foram retiradas do nosso exemplo de app disponibilizado no GitHub . Visite o GitHub para ver o exemplo completo e as informações sobre a configuração do servidor de webhooks.
Para criar um ponto de extremidade com objetivo de receber notificações de webhooks da plataforma do Messenger, o arquivo app.js
terá aparência semelhante a esta:
// Create the endpoint for your webhook app.post("/webhook", (req, res) => { let body = req.body; console.log(`\u{1F7EA} Received webhook:`); console.dir(body, { depth: null }); ...
Esse código cria um ponto de extremidade do /webhook
que aceita solicitações POST
e verifica se a solicitação é uma notificação de webhook.
200 OK
O ponto de extremidade deve retornar uma resposta 200 OK
, a qual informa à plataforma do Messenger que o evento foi recebido e não precisa ser reenviado. Normalmente, você só envia essa resposta após concluir o processamento da notificação.
Seu ponto de extremidade deve responder a todas as notificações:
200 OK HTTPS
;O código estará em app.post
no seu arquivo app.js
e terá aparência semelhante a esta:
... // Send a 200 OK response if this is a page webhook if (body.object === "page") { // Returns a '200 OK' response to all requests res.status(200).send("EVENT_RECEIVED"); ... // Determine which webhooks were triggered and get sender PSIDs and locale, message content and more. ... } else { // Return a '404 Not Found' if event is not from a page subscription res.sendStatus(404); } });
Enviaremos uma solicitação GET
para a URL do ponto de extremidade sempre que você configurar o produto Webhooks no Painel de Apps. As solicitações de verificação incluirão os seguintes parâmetros da string de consulta, anexados ao final da URL do ponto de extremidade. Elas serão assim:
GET https://www.your-clever-domain-name.com/webhooks? hub.mode=subscribe& hub.verify_token=mytoken& hub.challenge=1158201444
Sempre que seu ponto de extremidade receber uma solicitação de verificação, você deverá:
hub.verify_token
corresponde à string definida no campo Verificar token quando você configura o produto Webhooks no Painel de Apps (você ainda não configurou essa string do token);hub.challenge
.Seu arquivo app.js
terá aparência semelhante a esta:
// Add support for GET requests to our webhook app.get("/messaging-webhook", (req, res) => { // Parse the query params let mode = req.query["hub.mode"]; let token = req.query["hub.verify_token"]; let challenge = req.query["hub.challenge"]; // Check if a token and mode is in the query string of the request if (mode && token) { // Check the mode and token sent is correct if (mode === "subscribe" && token === config.verifyToken) { // Respond with the challenge token from the request console.log("WEBHOOK_VERIFIED"); res.status(200).send(challenge); } else { // Respond with '403 Forbidden' if verify tokens do not match res.sendStatus(403); } } });
Parâmetro | Exemplo de valor | Descrição |
---|---|---|
|
| Esse valor será sempre definido como |
|
| Um |
|
| Uma string obtida no campo Verificar token no Painel de Apps. Você definirá essa string quando concluir as etapas de configuração do Webhooks. |
Observação: o PHP converte pontos (.) em sublinhados (_) nos nomes dos parâmetros .
Se você estiver no Painel de Apps e configurar o produto Webhooks (e isso acionará uma solicitação de verificação), o painel indicará se o ponto de extremidade validou a solicitação corretamente. Se você usar o ponto de extremidade /app/subscriptions
da Graph API para configurar o produto Webhooks, a API responderá com sucesso ou falha.
Na configuração do produto Webhooks, você assinará fields
específicos em um tipo de object
(por exemplo, o campo messages
no objeto page
). Sempre que houver uma mudança em um desses campos, enviaremos uma solicitação POST
ao seu ponto de extremidade com uma carga JSON descrevendo a alteração.
Por exemplo, se você assinar o objeto page
no campo message_reactions
e um dos clientes reagir a uma mensagem enviada pelo seu app, enviaremos a você uma solicitação POST
semelhante a esta:
{
"object":"page",
"entry":[
{
"id":"<PAGE_ID>",
"time":1458692752478,
"messaging":[
{
"sender":{
"id":"<PSID>"
},
"recipient":{
"id":"<PAGE_ID>"
},
...
}
]
}
]
}
As cargas conterão um objeto descrevendo a mudança. Ao configurar o produto Webhooks, você pode indicar se as cargas devem conter somente os nomes dos campos alterados ou se elas devem incluir também os novos valores.
Como formatamos todas as cargas com JSON, é possível analisar a carga usando métodos ou pacotes comuns de análise de JSON.
Não armazenamos dados referentes a notificações de eventos do Webhook enviados a você. Por isso, capture e armazene o conteúdo de todas as cargas que deseja manter.
Assinamos todas as cargas de notificação de eventos com uma assinatura SHA256 e a incluímos no cabeçalho "X-Hub-Signature-256" da solicitação, precedida por "sha256=". A validação de carga não é obrigatória. No entanto, essa é uma prática recomendada.
Para validar a carga:
X-Hub-Signature-256
(tudo que aparece após sha256=
). Se as assinaturas coincidirem, a carga será verdadeira.Geramos a assinatura usando uma versão unicode de escape da carga, com dígitos hexadecimais minúsculos. Se você apenas calcular com base nos bytes decodificados, terminará com uma assinatura diferente. Por exemplo, a string äöå
deve ser seguida pelo caractere de escape \u00e4\u00f6\u00e5
.
O arquivo app.js
terá aparência semelhante a esta:
// Import dependencies and set up http server const express = require("express"), bodyParser = require("body-parser"), { urlencoded, json } = require("body-parser"), app = express().use(bodyParser.json()); ... // Verify that the callback came from Facebook. function verifyRequestSignature(req, res, buf) { var signature = req.headers["x-hub-signature-256"]; if (!signature) { console.warn(`Couldn't find "x-hub-signature-256" in headers.`); } else { var elements = signature.split("="); var signatureHash = elements[1]; var expectedHash = crypto .createHmac("sha256", config.appSecret) .update(buf) .digest("hex"); if (signatureHash != expectedHash) { throw new Error("Couldn't validate the request signature."); } } }
Caso o envio de uma notificação para seu servidor falhe, tentaremos mais algumas vezes. Seu servidor deverá lidar com a desduplicação nesses casos. Se ainda não conseguirmos entregar notificações depois de 15 minutos, um alerta será enviado para sua conta de desenvolvedor.
Caso a entrega de uma notificação siga falhando por uma hora, você receberá um alerta de desativação de webhooks. Além disso, seu app será removido dos webhooks da Página ou da conta profissional do Instagram. Quando você corrigir os problemas, será necessário assinar os Webhooks novamente.
Para testar a verificação do webhook, execute a seguinte solicitação de cURL com seu token de verificação:
curl -X GET "localhost:1337/webhook?hub.verify_token=YOUR-VERIFY-TOKEN&hub.challenge=CHALLENGE_ACCEPTED&hub.mode=subscribe"
Se a verificação do webhook estiver funcionando conforme o esperado, você verá o seguinte:
WEBHOOK_VERIFIED
conectado à linha de comando onde o processo do nó está sendo executado.CHALLENGE_ACCEPTED
conectado à linha de comando de onde você enviou a solicitação de cURL.Para testar o webhook, envie esta solicitação de cURL:
curl -H "Content-Type: application/json" -X POST "localhost:1337/webhook" -d '{"object": "page", "entry": [{"messaging": [{"message": "TEST_MESSAGE"}]}]}'
Se o webhook estiver funcionando conforme o esperado, você verá o seguinte:
TEST_MESSAGE
conectada à linha de comando onde o processo do nó está sendo executado.EVENT RECEIVED
conectado à linha de comando de onde você enviou a solicitação de cURL.Depois que o ponto de extremidade do servidor de webhooks ou o app de exemplo estiver pronto, acesse o Painel de Apps para assinar Webhooks da Meta.
Neste exemplo, usaremos o painel para configurar um webhook e assinar o campo messages
. Sempre que um cliente enviar uma mensagem ao seu app, uma notificação será encaminhada ao ponto de extremidade de webhooks.
Insira a URL do ponto de extremidade no campo URL de retorno de chamada e inclua seu token de verificação no campo Verificar token. Incluiremos essa string em todas as solicitações de verificação. Se você estiver usando um dos nossos apps de exemplo, deverá ser a mesma string usada para a variável de configuração TOKEN
do app.
A última etapa é assinar campos individuais. Assine o campo messages
e envie uma notificação de evento de teste.
Se o ponto de extremidade for configurado corretamente, ele validará a carga e executará o código que você configurou caso a validação seja bem-sucedida. Se você usar o exemplo de app, carregue a URL do app no navegador da web. Ele deve exibir o conteúdo da carga.
É possível alterar as assinaturas, a verificação do token ou a versão da API a qualquer momento usando o Painel de Apps.
Observação: é recomendável usar a versão mais recente da API para receber todas as informações disponíveis para cada webhook.
Isso também pode ser feito de modo programático com o ponto de extremidade /app/subscriptions
.
Evento de webhook | Descrição |
---|---|
| Assina os eventos de Mensagem recebida |
| Assina os eventos de Vinculação de conta |
| |
| Assina os eventos de Mensagem entregue |
| Assina os eventos de Eco de mensagem |
| Assina os eventos de Jogos instantâneos |
| |
| Assina os eventos de Plugin de chamada |
| Assina os eventos de Pagamento |
| Assina os eventos de Imposição de políticas |
| Assina os eventos de Postback recebido |
| |
| Assina os eventos de Mensagem lida |
| Assina os eventos de Referência |
|
É preciso conectar o app Webhooks à sua Página e assinar as notificações que você quer receber.
Conecte o app a uma Página em Meta Business Suite > Todas as ferramentas > Apps de negócios .
Observação: é preciso assinar os webhooks de mensagem para todos os apps de mensagem da empresa.
É necessário assinar sua Página nas notificações do Webhooks que você quer receber.
MODERATE
na Página que está sendo consultada
pages_messaging
e pages_manage_metadata
Para assinar um campo do Webhooks, envie uma solicitação POST
para a borda subscribe_apps da Página usando o token de acesso da Página.
curl -i -X POST "https://graph.facebook.com/PAGE-ID/subscribed_apps ?subscribed_fields=messages &access_token=PAGE-ACCESS-TOKEN"
{ "success": "true" }
Para ver quais apps estão instalados na sua Página, envie uma solicitação GET
:
curl -i -X GET "https://graph.facebook.com/PAGE-ID/subscribed_apps &access_token=PAGE-ACCESS-TOKEN"
{ "data": [ { "category": "Business", "link": "https://my-clever-domain-name.com/app", "name": "My Sample App", "id": "APP-ID" "subscribed_fields": [ "messages" ] } ] }
Se a Página não tiver apps instalados, a API retornará um conjunto de dados vazio.
Você também pode usar o Explorador da Graph API ao enviar a solicitação de assinatura da sua Página a um campo do Webhooks.
pages_manage_metadata
. A ação substituirá o token do app por um token de acesso do usuário com a permissão pages_manage_metadata
concedida.GET
e selecionando POST
.me?fields=id,name
pelo ID da Página seguido por /subscribed_apps
. Depois, envie a consulta. Para receber notificações de pessoas que têm uma função no seu app, como administradores, desenvolvedores ou testadores, basta ter o acesso padrão. Para receber notificações de clientes, ou seja, pessoas que não têm uma função no seu app, é preciso ter o acesso avançado.
Saiba mais sobre os acessos padrão e avançado , os dados que podem ser acessados com cada um e os requisitos para implementação.