Meta
Desenvolvedores

Implementando webhooks com a Plataforma do WhatsApp Business

Pessoa de óculos em casa trabalhando no notebook

Com os webhooks, os serviços podem enviar dados facilmente sempre que acontecer algo. Você configura um app ou servidor para receber mensagens e dá o endereço ao serviço. Quando um evento é disparado no serviço, ele pode simplesmente chamar o webhook para enviar a mensagem ao seu app.

A Plataforma do WhatsApp Business oferece diversas opções para diferentes eventos que você pode integrar ao seu app ou serviço, desde que ele ofereça suporte a HTTPS e tenha um certificado SSL válido. Com essa plataforma, você pode automatizar respostas para mensagens do WhatsApp em tempo real.

Neste artigo, veremos como configurar webhooks para que se conectem ao WhatsApp. Também apresentaremos um tutorial sobre como configurar um app que recebe mensagens e as armazena em um banco de dados.

Implementando webhooks

Empresas de todos os tamanhos podem usar o WhatsApp para estabelecer diálogos com os clientes. Os casos de uso se enquadram em duas categorias principais: atendimento ao cliente e marketing.

Os webhooks podem fornecer notificações sobre diversos tipos de eventos. Por exemplo, eventos de mensagens recebidas passam pelo webhook de mensagens. Você pode usar esse webhook para reduzir a carga de trabalho dos agentes de atendimento ao cliente filtrando consultas comuns dos clientes. Mensagens simples são enviadas para um serviço de chatbot para formular uma resposta. As mensagens que não podem ser respondidas imediatamente são encaminhadas para agentes ao vivo.

Os eventos de mensagens recebidas também podem conter mídia, caso os usuários enviem imagens, ou podem conter detalhes da interação, caso eles cliquem em um botão para responder a uma mensagem, em vez de digitar uma resposta.

Agora que já exploramos alguns casos de uso de webhooks do WhatsApp, vamos ver o tutorial. Veremos um caso de uso simples em que os clientes fornecem feedback de avaliação por meio de mensagens do WhatsApp. Mostraremos a você como armazenar essas avaliações em um banco de dados, onde poderão ser examinadas com o intuito de compreender temas comuns ou o sentimento geral em torno de um determinado produto.

Ouvinte de webhook de Node.js com AWS Lambda

Suponhamos que a sua empresa queira usar a Plataforma do WhatsApp Business para entrar em contato com os clientes com uma mensagem pedindo que eles analisem um produto que compraram recentemente. Sua empresa quer permitir que o cliente responda à mensagem com a avaliação e, em seguida, você deseja armazenar essa avaliação em um banco de dados.

Para isso, você criará uma função do AWS Lambda usando Node.js e armazenará os dados no DynamoDB. O uso dessas tecnologias faz com que a pilha toda seja executada sem servidor, o que reduz a carga de trabalho de infraestrutura no desenvolvimento e permite que você aumente ou reduza a escala automaticamente para atender à demanda. Também ajuda a flexibilizar mais o preço, pois você só paga por aquilo que usa.

Configure seu app

Primeiramente, inicialize um novo projeto do Node.js. O Serverless Framework é uma boa opção, pois simplifica a configuração e a implantação das funções do AWS Lambda.

Para inicializar o projeto, insira os comandos a seguir:

npm init serverless create --template aws-nodejs npm install -s express serverless-http serverless-offline

Depois que o projeto for inicializado, você precisará criar um ponto de extremidade que permitirá verificar seu app com a Plataforma do WhatsApp Business. Isso é uma exigência ao criar seu app no Meta for Developers.

Substitua o código padrão no handler.js por este:

const serverless = require('serverless-http') const express = require('express') const app = express() const token = process.env.TOKEN app.get('/webhooks', (req, res) => { if ( req.query['hub.mode'] == 'subscribe' && req.query['hub.verify_token'] == token ) { res.send(req.query['hub.challenge']); } else { res.sendStatus(400); } }) module.exports.handler = serverless(app);

O ponto de extremidade é bem simples: ele retorna o parâmetro hub.challenge, que o sistema de verificação envia como um parâmetro de solicitação.

Em seguida, você precisa configurar seu ponto de extremidade no arquivo Serverless YAML. Esse arquivo YAML define as funções, os pontos de extremidade e os recursos que devem ser criados quando o projeto for implementado no AWS.

Ele ajuda a simplificar o processo de implantação e torna desnecessária configuração manual. Ele agrupa códigos e configurações adicionais de infraestrutura, como definições de criação de recursos ou de permissões.
Substitua o código padrão no serverless.yml pelo seguinte código:

service: whatsapp-webhooks frameworkVersion: '2' provider: name: aws runtime: nodejs14.x lambdaHashingVersion: 20201221 environment: TOKEN: ${env:APP_TOKEN} plugins: - serverless-offline functions: app: handler: handler.handler events: - http: ANY / - http: 'ANY {proxy+}'

A seção Plugins inclui o Serverless Offline, que emula o AWS Lambda e o Gateway da API e permite que você teste o seu ponto de extremidade localmente antes de implementá-lo no AWS.

A seção Functions define a localização do manipulador do ponto de extremidade e define quais eventos HTTP podem acioná-lo. Para simplificar, configure esse manipulador para responder a qualquer evento.

A seção Provider contém a variável de ambiente TOKEN. Este token secreto é necessário para enviar a mensagem de verificação pelo Meta for Developers.

Para definir o token, exporte uma variável de ambiente com o nome “APP_TOKEN” para o seu terminal. Por exemplo, use este comando:

export APP_TOKEN=testtoken

Quando o serviço estiver implementado, a variável TOKEN extrairá o valor da sua variável APP_TOKEN local e a disponibilizará para a função Lambda no AWS.

Teste seu app

Agora que o seu projeto está configurado, teste se a função funciona localmente.

Inicie o projeto no modo offline executando o comando:

serverless offline

Quando seu app estiver funcionando, execute o comando a seguir em outra janela, pois o app terá o controle da janela atual. Não se esqueça de substituir o valor do token pelo valor que você definiu anteriormente:

curl -v "http://localhost:3000/dev/webhooks?hub.mode=subscribe&hub.verify_token=testtoken"

As respostas da saída e do status 204 devem ser semelhantes a esta:

* Trying 127.0.0.1... * TCP_NODELAY set * Connected to localhost (127.0.0.1) port 3000 (#0) > GET /dev/webhooks?hub.mode=subscribe&hub.verify_token=testtoken HTTP/1.1 > Host: localhost:3000 > User-Agent: curl/7.64.1 > Accept: */* > < HTTP/1.1 204 No Content < x-powered-by: Express < content-type: application/json; charset=utf-8 < cache-control: no-cache < Date: Thu, 21 Apr 2022 16:28:24 GMT < Connection: keep-alive < Keep-Alive: timeout=5 < * Connection #0 to host localhost left intact * Closing connection 0

Depois, implemente seu app na AWS executando o seguinte comando:

serverless deploy

O AWS enviará seu ponto de extremidade para o terminal assim que o seu app terminar a implementação.

Configure o webhook

Depois, inicie o processo de verificação criando um app do Facebook.

No Painel de Apps, selecione PRODUTOS. Em seguida, selecione Webhooks nas opções. No menu suspenso, selecione Conta do WhatsApp Business.

Configurar webhooks

Depois, insira a URL de retorno de chamada com o ponto de extremidade fornecido pelo AWS. O token deve ser o mesmo usado no arquivo serverless.yml.

Editar assinatura da Conta do WhatsApp Business

Após a verificação do seu app, você verá todos os campos de objeto nos quais seu webhook pode se inscrever. Todos eles fornecem uma opção de teste e assinatura.

Editar assinatura da Conta do WhatsApp Business

O que nos interessa é o campo de mensagens, que envia mensagens para seu ponto de extremidade quando elas são recebidas. Cada um dos webhooks envia uma solicitação POST para o mesmo URL de retorno de chamada que você forneceu ao verificar o app.

Em seguida, você precisa escrever o código para recuperar as solicitações POST e armazenar os dados no DynamoDB.

Adicione este código ao arquivo handler.js:

const AWS = require('aws-sdk') const dynamoDb = new AWS.DynamoDB.DocumentClient(); app.post('/webhooks', (req, res) => { const body = JSON.parse(req.body) if(body.field !== 'messages">{ // not from the messages webhook so dont process return res.sendStatus(400) } const reviews = body.value.messages.map((message)=>{ const reviewInfo = { TableName: process.env.REVIEW_TABLE, Item: { phonenumber: message.from, review: message.text.body } } return dynamoDb.put(reviewInfo).promise() }) // return 200 code once all reviews have been written to dynamoDB return Promise.all(reviews).then((data) => res.sendStatus(200)); })

Primeiramente, este código instala o pacote npm do SDK do AWS para que você possa usar o cliente de documentos do DynamoDB. A função então verifica se a solicitação foi enviada pelo webhook de mensagens. Se foi, a função cria um item de análise que inclui a análise e o telefone do cliente (fornecido pelo webhook). O webhook envia cada mensagem como uma matriz no campo de mensagens; portanto, ele pode enviar várias de uma vez. A função encaminha as mensagens em loop, criando uma matriz de promises PUT do DynamoDB que poderão ser executadas posteriormente para armazenar os dados.

Configurar o DynamoDB

Este exemplo simples pega os dados e os armazena, no estado em que se encontram, como um registro do DynamoDB. Neste ponto, você pode adicionar a funcionalidade de análise (parse) das mensagens, conforme necessário, para implementar lógica de negócios adicional.

Para que isso funcione, você precisa fornecer alguns detalhes da configuração do DynamoDB à sua configuração de Serverless. O arquivo serverless.yml completo ficará assim:

service: whatsapp-webhooks frameworkVersion: '2' provider: name: aws runtime: nodejs14.x lambdaHashingVersion: 20201221 region: eu-west-1 iamRoleStatements: - Effect: "Allow" Action: - dynamodb:Query - dynamodb:Scan - dynamodb:GetItem - dynamodb:PutItem - dynamodb:UpdateItem - dynamodb:DeleteItem Resource: arn:aws:dynamodb:us-east-1:111111111111:table/${self:provider.environment.REVIEW_TABLE} environment: TOKEN: ${env:APP_TOKEN} REVIEW_TABLE: reviews plugins: - serverless-offline functions: app: handler: handler.handler events: - http: ANY / - http: 'ANY {proxy+}' resources: Resources: ReviewsTable: Type: 'AWS::DynamoDB::Table' Properties: TableName: ${self:provider.environment.REVIEW_TABLE} AttributeDefinitions: - AttributeName: phonenumber AttributeType: S KeySchema: - AttributeName: phonenumber KeyType: HASH ProvisionedThroughput: ReadCapacityUnits: 1 WriteCapacityUnits: 1

Agora, o arquivo tem declarações adicionais de gerenciamento de permissões na seção provider que permitem que a sua função Lambda recupere e grave dados na tabela do DynamoDB. O arquivo também contém uma seção resources que configura a tabela do DynamoDB, a chave da tabela e a taxa de transferência provisionada. Para fins de teste, a provisão de unidades de capacidade é definida com um valor baixo. Mas esse valor pode ser configurado na produção para aumentar ou diminuir conforme a demanda.

Testar seu app

Agora, ao implementar seu aplicativo sem servidor, a tabela do DynamoDB será criada e configurada automaticamente e sua função Lambda terá todas as permissões necessárias para gravar dados na tabela. A capacidade da estrutura Serverless é mais uma vez enfatizada, pois todos os nossos requisitos de infraestrutura são atendidos com uma configuração simples.

Depois da implementação, volte ao Meta for Developers e selecione o botão Testar na linha de campos de mensagens. Ele abrirá uma nova janela de amostra do campo parecida com esta:

Amostra do campo de mensagem

Ela exibe o formato da carga (payload) processada cada vez que uma mensagem é enviada para a conta. Selecione Enviar para meu servidor e navegue até o DynamoDB no console da AWS para ver o novo registro com uma análise contendo o texto de teste:

Mostrando itens devolvidos

Conclusão

Essa foi uma aplicação de teste simples que demonstra a facilidade e simplicidade de configurar um ouvinte de webhook usando a estrutura sem servidor. Ao usar tecnologias sem servidor, como AWS Lambda e DynamoDB, esse app pode ser expandido de um simples protótipo para um serviço pronto para produção capaz de lidar com um grande volume de taxa de transferência de dados.

Você pode usar webhooks na Plataforma do WhatsApp Business para automatizar o gerenciamento e a interação da conta do cliente. A documentação sobre webhooks do WhatsApp oficial fornece informações mais completas sobre assinatura de webhooks para um sistema de produção. A documentação sobre webhooks omite o campo [messages]. Use a Referência sobre webhooks para obter uma lista completa dos campos disponíveis para assinatura.

Ao criar ouvintes para esses webhooks, é importante considerar o custo e a escalabilidade. A solução precisa estar apta a lidar com picos de demanda causados por um volume grande de clientes contatando você simultaneamente via WhatsApp. E nos momentos em que a sua demanda cair pela falta de contato dos clientes (por exemplo, de madrugada), a solução deve se adaptar para reduzir custos. No geral, a solução também deve acompanhar o aumento da sua base de clientes.

Escolher as ferramentas apropriadas é fundamental. Serverless Framework, AWS Lambda e DynamoDB foram apropriados para este ouvinte de webhook, mas você deve considerar as necessidades específicas da sua empresa. A solução neste artigo atende às demandas de escala variável, ajusta-se para manter os custos baixos em períodos de pouca utilização e remove a necessidade de gerenciar a infraestrutura. Isso facilita a implantação e o gerenciamento para os desenvolvedores.

Consulte o guia de configuração oficial de webhooks do WhatsApp para obter informações mais detalhadas sobre como usar webhooks no seu app.

Posts relacionados

Para ajudar a personalizar conteúdo, customizar e mensurar anúncios, e fornecer uma experiência mais segura, nós usamos cookies. Ao clicar ou navegar no site, você concorda em permitir a nossa coleta de informações na Meta e fora dela por meio de cookies. Saiba mais, incluindo sobre os controles disponíveis: [privacidade]