Webhooks

Um webhook é um URL especificado pelo parceiro em que a plataforma RBM publica mensagens e eventos. Esse URL funciona como um endpoint que recebe solicitações POST HTTPS com dados sobre os eventos. Isso significa que os dados são enviados ao seu aplicativo com segurança por HTTPS.

Um URL de webhook pode ser assim: https://[your company name].com/api/rbm-events. Depois de configurar o webhook, você pode começar a receber mensagens e eventos.

Webhooks de parceiros e de agentes

É possível configurar o webhook no nível do parceiro ou do agente.

  • O webhook do parceiro se aplica a todos os agentes que você mantém. Se os agentes tiverem um comportamento semelhante ou se você tiver apenas um agente, use o webhook do parceiro.
  • Os webhooks de agente se aplicam a agentes individuais. Se você opera vários agentes com comportamentos distintos, é possível definir um webhook diferente para cada agente.

Se você tiver configurado um webhook de parceiro e um webhook de agente, o webhook de agente terá precedência no agente específico, enquanto o webhook de parceiro será aplicado a todos os agentes que não tiverem um webhook próprio.

Configurar um webhook do agente

Você recebe mensagens enviadas ao seu agente no webhook do parceiro. Se você quiser que mensagens de um agente específico cheguem a um webhook diferente, defina um webhook do agente.

  1. Abra o Business Communications Developer Console e faça login com sua Conta do Google de parceiro do RBM.
  2. Clique no seu agente.
  3. Clique em Integrations.
  4. Em Webhook, clique em Configurar.
  5. Em URL do endpoint do webhook, insira o URL do webhook começando com "https://".
  6. Anote o valor de clientToken. Você precisa dele para verificar se as mensagens recebidas são do Google.
  7. Configure seu webhook para aceitar uma solicitação POST com o parâmetro clientToken especificado e envie uma resposta 200 OK com o valor de texto simples do parâmetro secret como o corpo da resposta.

    Por exemplo, se o webhook receber uma solicitação POST com o seguinte conteúdo do corpo:

    {
      "clientToken":"SJENCPGJESMGUFPY",
      "secret":"1234567890"
    }
    

    então seu webhook precisa confirmar o valor clientToken e, se clientToken estiver correto, retornar uma resposta 200 OK com 1234567890 como o corpo da resposta:

    // clientToken from Configure
    const myClientToken = "SJENCPGJESMGUFPY";
    
    // Example endpoint
    app.post("/rbm-webhook", (req, res) => {
      const msg = req.body;
      if (msg.clientToken === myClientToken) {
          res.status(200).send(msg.secret);
          return;
      }
      res.send(400);
    });
    
  8. No Developer Console, clique em Verificar. Quando o RBM verifica seu webhook, a caixa de diálogo é fechada.

Verificar mensagens recebidas

Como os webhooks podem receber mensagens de qualquer remetente, verifique se o Google enviou as mensagens recebidas antes de processar o conteúdo delas.

Para verificar se o Google enviou uma mensagem que você recebeu, siga estas etapas:

  1. Extraia o cabeçalho X-Goog-Signature da mensagem. É uma cópia com hash e codificada em base64 do payload do corpo da mensagem.
  2. Decodifique em base64 o payload do RBM no elemento message.body da solicitação.
  3. Usando o token do cliente do webhook (que você especificou ao configurar o webhook) como uma chave, crie um HMAC SHA512 dos bytes do payload da mensagem decodificada em base-64 e codifique o resultado em base64.
  4. Compare o hash X-Goog-Signature com o hash que você criou.
    • Se os hashes forem iguais, você confirmou que o Google enviou a mensagem.
    • Se os hashes não corresponderem, verifique o processo de hash em uma mensagem conhecida.

      Se o processo de hash estiver funcionando corretamente e você receber uma mensagem que acredita ter sido enviada de forma fraudulenta, entre em contato com nossa equipe.

Node.js

  if ((requestBody.hasOwnProperty('message')) && (requestBody.message.hasOwnProperty('data'))) {
    // Validate the received hash to ensure the message came from Google RBM
    let userEventString = Buffer.from(requestBody.message.data, 'base64');
    let hmac = crypto.createHmac('sha512', CLIENT_TOKEN);
    let data = hmac.update(userEventString);
    let genHash = data.digest('base64');
    let headerHash = req.header('X-Goog-Signature');

    if (headerHash === genHash) {
      let userEvent = JSON.parse(userEventString);

      console.log('userEventString: ' + userEventString);
      handleMessage(userEvent);
    } else {
      console.log('hash mismatch - ignoring message');
    }
  }

  res.sendStatus(200);
  

Gerenciamento de mensagens

Retornar qualquer coisa diferente de 200 OK de um webhook é considerado uma falha na entrega.

Os desenvolvedores precisam ter em mente que o envio de mensagens em altas taxas vai gerar notificações de webhook também em altas taxas. Por isso, é necessário projetar o código para processar as notificações na taxa esperada. É importante que os desenvolvedores considerem situações que podem causar respostas de falha, incluindo respostas 500 do contêiner da Web, tempos limite ou falhas upstream. Considere o seguinte:

  • Verifique se as proteções contra DDoS estão configuradas para processar a taxa esperada de notificações de webhook.
  • Confirme se recursos como pools de conexões de banco de dados não estão esgotados e produzem tempos limite ou respostas 500.

Os desenvolvedores precisam projetar os sistemas para que o processamento de eventos do RBM ocorra de forma assíncrona e não impeça o webhook de retornar 200 OK.

Processamento assíncrono de webhook

É importante não processar o evento do RBM no próprio webhook. Qualquer erro ou atraso durante o processamento pode afetar o código de retorno do webhook:

Processamento síncrono de webhook

Comportamento em caso de falha na entrega

O RBM usa um mecanismo de espera e nova tentativa quando recebe uma resposta diferente de 200 OK de uma chamada de webhook. O RBM vai aumentar o tempo de espera entre novas tentativas até um máximo de 600 segundos. As novas tentativas vão continuar por sete dias. Depois disso, a mensagem será descartada.

Implicações dos webhooks no nível do agente

O RBM enfileira mensagens para um parceiro em uma fila. Quando um parceiro usa webhooks no nível do agente, é importante lembrar que a falha de um webhook afeta a entrega para outros webhooks. Os webhooks de outros agentes serão chamados durante o período de espera de uma mensagem com falha. No entanto, à medida que as mensagens com falha são enfileiradas para novas tentativas, as taxas gerais de entrega caem e outros agentes são afetados.

É importante que os desenvolvedores entendam esse modelo e codifiquem de acordo com ele. Na medida do possível, aceite mensagens e coloque-as em fila para processamento, minimizando a oportunidade de retornar uma falha.

Próximas etapas

Depois de configurar o webhook, o agente poderá receber mensagens dos seus dispositivos de teste. Envie uma mensagem para validar sua configuração.