Configurar o Cloud Pub/Sub

Os agentes do RBM recebem mensagens e eventos por uma relação de publicação/assinatura com o Cloud Pub/Sub. Quando um usuário envia uma mensagem para seu agente ou gera um evento, o app de mensagens dele envia as informações para a assinatura do Pub/Sub do agente, onde o agente pode acessar a mensagem ou o evento. Consulte Receber mensagens.

O usuário envia uma mensagem para o agente.

O tipo de assinatura do Pub/Sub do seu agente determina como seu agente recebe as mensagens. Portanto, você precisa configurar sua assinatura do Pub/Sub antes que o agente possa receber mensagens. Os agentes do RBM são compatíveis com assinaturas pull e push.

Assinatura de pull

Com uma assinatura de pull, seu agente entra em contato com o Cloud Pub/Sub e busca mensagens, eventos e outras solicitações.

Pré-requisitos

Antes de começar, você precisa de um agente do RBM.

Configuração

  1. Abra o Console para desenvolvedores do Business Communications, faça login com sua Conta do Google do RBM e clique no seu agente.
  2. Na navegação à esquerda, clique em Integrações.
  3. Clique em Editar assinatura.
  4. Escolha Pull e clique em Salvar.
  5. Configure seu agente para usar a assinatura de pull:
    • Se você usar um agente de amostra com uma assinatura de pull, siga as instruções no arquivo README da amostra.
    • Se você não usar um agente de amostra, consulte Como receber mensagens usando Pull para o código para permitir que seu agente use a assinatura de pull. Dependendo da sua linguagem de programação, talvez você precise do ID do projeto do seu agente.

Encontrar seu código de projeto

Alguns mecanismos de assinatura de pull exigem que você especifique o ID do projeto do Google Cloud (GCP) do seu agente. O ID do projeto do seu agente é incorporado ao nome da assinatura de pull após project/.

  1. Abra o Console para desenvolvedores do Business Communications, faça login com sua Conta do Google do RBM e clique no seu agente.
  2. Na navegação à esquerda, clique em Integrações.
  3. Encontre o Nome da assinatura do seu agente.
  4. Localize o trecho de texto entre project/ e o seguinte /. Esse é o ID do projeto do agente. Por exemplo, se o nome da assinatura for projects/rbm-growing-tree-bank-nbdjkl6t/subscriptions/rbm-agent-subscription, o ID do projeto do agente será rbm-growing-tree-bank-nbdjkl6t.

C#

private async void InitPullMessages(string projectId, string jsonPath)
{
  GoogleCredential googleCredential = null;
  using (var jsonStream = new FileStream(jsonPath, FileMode.Open,
    FileAccess.Read, FileShare.Read))
  {
    googleCredential = GoogleCredential.FromStream(jsonStream)
      .CreateScoped(SubscriberServiceApiClient.DefaultScopes);
  }

  SubscriptionName subscriptionName = new SubscriptionName(projectId, subscriptionId);
  SubscriberClient subscriber = new SubscriberClientBuilder
  {
    SubscriptionName = subscriptionName,
    GoogleCredential = googleCredential

  }.Build();

  // setup listener for pubsub messages
  await subscriber.StartAsync(
    async (PubsubMessage message, CancellationToken cancel) =>
    {
      string text = System.Text.Encoding.UTF8.GetString(message.Data.ToArray());

      JObject jsonObject = JObject.Parse(jsonAsString);

      string userResponse = GetResponseText(jsonObject);
      string eventType = (string)jsonObject["eventType"];
    
      // check if the message is a user response message
      if ((userResponse.Length > 0) && (eventType == null))
      {
        string messageId = (string)jsonObject["messageId"];
        string msisdn = (string)jsonObject["senderPhoneNumber"];
        // let the user know their message has been read
        kitchenSinkBot.SendReadMessage(messageId, msisdn);
        HandleUserResponse(userResponse, msisdn);
      }
      await Console.Out.WriteLineAsync(
        $"Message {message.MessageId}: {jsonAsString}");
      return SubscriberClient.Reply.Ack;
    });
  }
}
Este código é um trecho de um agente de amostra do RBM (em inglês).

Assinatura de push

Com uma assinatura de push, o Cloud Pub/Sub envia mensagens, eventos e outras solicitações para um URL do webhook que você especificar.

Pré-requisitos

Antes de começar, você precisa do seguinte:

  • Por um agente do RBM
  • Um URL de endpoint do webhook ativo compatível com
    • HTTPS com um certificado SSL válido
    • POST pedidos
    • Capacidade de transmitir um parâmetro em resposta a uma solicitação de validação

Configuração

  1. Abra o Console para desenvolvedores do Business Communications, faça login com sua Conta do Google do RBM e clique no seu agente.
  2. Na navegação à esquerda, clique em Integrações.
  3. Clique em Editar assinatura.
  4. Escolha Enviar.
  5. Em URL do endpoint do webhook, insira o URL do webhook, começando com "https://".
  6. Configure seu webhook para aceitar uma solicitação POST com o parâmetro clientToken especificado e enviar uma resposta 200 OK com o valor do parâmetro secret.

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

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

    Seu webhook precisa confirmar o valor clientToken e, se clientToken estiver correto, retornar uma resposta 200 OK com um corpo de secret: 1234567890.

  7. No console, clique em Verificar.

    Quando a plataforma RBM verifica seu webhook, a caixa de diálogo Configurar seu webhook é fechada.

  8. Clique em Salvar.

  9. Configure seu agente para receber mensagens do webhook:

    • Se você usar um agente de amostra com uma assinatura de push, siga as instruções no arquivo README da amostra.
    • Se você não usar um agente de amostra, configure a infraestrutura para transmitir mensagens do webhook para ele.

Node.js

let requestBody = req.body;

if ((requestBody.hasOwnProperty('clientToken')) && (requestBody.hasOwnProperty('secret'))) {
  console.log('RBM webhook verification request');

  // Confirm that the clientToken is the one we are seeing in the RBM console
  if (requestBody.clientToken == CLIENT_TOKEN) {
    console.log('Tokens match, returning secret');
    res.status(200).send('secret: ' + requestBody.secret);
  }
  else {
    // Client tokens did not match - sending permission denied
    console.log('Tokens do not match');
    res.sendStatus(403);
  }
}

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 confirmar que o Google enviou uma mensagem que você recebeu, siga estas etapas:

  1. Extraia o cabeçalho X-Goog-Signature da mensagem. Essa é uma cópia em hash 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 de cliente do webhook, especificado na configuração da assinatura de push, como chave, crie um HMAC SHA512 dos bytes do payload da mensagem decodificada 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ê vai confirmar que o Google enviou a mensagem.
    • Se os hashes não forem correspondentes, 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 conosco.

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);

Próximas etapas

Depois de configurar sua assinatura e configurar seu agente para se comunicar com o Cloud Pub/Sub, ele pode receber mensagens dos seus dispositivos de teste. Envie uma mensagem para validar sua configuração.