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, é possível enviar uma notificação 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:
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.
Os exemplos de código foram retirados do nosso exemplo de app 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 poderá ter a seguinte aparência:
// 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 /webhook que aceita solicitações POST e verifica se a solicitação é uma notificação de webhook.
200 OKO 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 o 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 do 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 your webhook
app.get("/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 recuperada 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.
Observação:: não será possível consultar dados de notificações referentes a eventos históricos de webhook. Por isso, capture e armazene o conteúdo de todas as cargas de webhook que você 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.
Se várias mensagens forem enviadas pelo usuário quando o app falhar, talvez elas não sejam entregues na ordem em que foram enviadas. Para garantir a ordem cronológica da entrega de mensagens, os apps devem sempre usar o campo timestamp incluído no webhook.
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.
TOKEN do app.messages e envie uma notificação de evento de teste.
É 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 usando 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ócio.
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.