Cómo configurar Cloud Pub/Sub

Los agentes de RBM reciben mensajes y eventos a través de una relación de publicación y suscripción con Cloud Pub/Sub. Cuando un usuario envía un mensaje a tu agente o genera un evento, su app de mensajería envía la información a la suscripción de Pub/Sub de tu agente, donde puede acceder al mensaje o evento. Consulta Recibe mensajes.

El usuario envía un mensaje al agente

El tipo de suscripción de Pub/Sub del agente determina cómo recibe los mensajes, por lo que debes configurar la suscripción a Pub/Sub para que el agente pueda recibir mensajes. Los agentes de RBM admiten las suscripciones pull y push.

Suscripción de extracción

Con una suscripción de extracción, tu agente se comunica con Cloud Pub/Sub y recupera mensajes, eventos y otras solicitudes.

Requisitos previos

Antes de comenzar, necesitas un agente de RBM.

Configuración

  1. Abre Business Communications Developer Console, accede con tu Cuenta de Google de RBM y haz clic en tu agente.
  2. En el panel de navegación izquierdo, haz clic en Integraciones.
  3. Haz clic en Editar suscripción.
  4. Selecciona Extraer y, luego, haz clic en Guardar.
  5. Configura tu agente para usar la suscripción de extracción:
    • Si usas un agente de muestra con una suscripción de extracción, sigue las instrucciones del archivo README de la muestra.
    • Si no usas un agente de muestra, consulta Recibe mensajes con una extracción para obtener un código que permita que tu agente use la suscripción de extracción. Según tu lenguaje de programación, es posible que necesites el ID del proyecto de tu agente.

Encuentra el ID del proyecto

Algunos mecanismos de suscripción de extracción requieren que especifiques el ID del proyecto de Google Cloud Project (GCP) de tu agente. El ID del proyecto de tu agente está incorporado en el nombre de la suscripción de extracción después de project/.

  1. Abre Business Communications Developer Console, accede con tu Cuenta de Google de RBM y haz clic en tu agente.
  2. En el panel de navegación izquierdo, haz clic en Integraciones.
  3. Busca el Nombre de la suscripción del agente.
  4. Ubica el segmento de texto entre project/ y el siguiente /. Este es el ID del proyecto de tu agente. Por ejemplo, si el nombre de la suscripción es projects/rbm-growing-tree-bank-nbdjkl6t/subscriptions/rbm-agent-subscription, el ID del proyecto de tu agente es 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 es un extracto de un agente de muestra de RBM.

Suscripción de envío

Con una suscripción de envío, Cloud Pub/Sub envía mensajes, eventos y otras solicitudes a la URL de webhook que especifiques.

Requisitos previos

Antes de comenzar, necesitarás lo siguiente:

  • Un agente de RBM
  • Una URL de extremo de webhook activa que admite
    • HTTPS con un certificado SSL válido
    • POST solicitudes
    • La capacidad de reproducir un parámetro en respuesta a una solicitud de validación

Configuración

  1. Abre Business Communications Developer Console, accede con tu Cuenta de Google de RBM y haz clic en tu agente.
  2. En el panel de navegación izquierdo, haz clic en Integraciones.
  3. Haz clic en Editar suscripción.
  4. Selecciona Enviar.
  5. En URL de extremo de webhook, ingresa la URL de tu webhook que comience con “https://”.
  6. Configura tu webhook para que acepte una solicitud POST con el parámetro clientToken especificado y envíe una respuesta 200 OK con el valor del parámetro secret.

    Por ejemplo, si tu webhook recibe una solicitud POST con el siguiente contenido del cuerpo

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

    El webhook debe confirmar el valor clientToken y, si clientToken es correcto, mostrar una respuesta 200 OK con un cuerpo de secret: 1234567890.

  7. En la consola, haz clic en Verificar.

    Cuando la plataforma de RBM verifica tu webhook, se cierra el diálogo Configura tu webhook.

  8. Haz clic en Guardar.

  9. Configura tu agente para recibir mensajes de tu webhook:

    • Si usas un agente de muestra con una suscripción de envío, sigue las instrucciones del archivo README de la muestra.
    • Si no usas un agente de muestra, configura la infraestructura para pasar mensajes de tu webhook al agente.

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

Verifica los mensajes entrantes

Debido a que los webhooks pueden recibir mensajes de cualquier remitente, debes verificar que Google haya enviado mensajes entrantes antes de procesar el contenido del mensaje.

Para verificar que Google envió un mensaje que recibiste, sigue estos pasos:

  1. Extrae el encabezado X-Goog-Signature del mensaje. Esta es una copia con hash codificada en base64 de la carga útil del cuerpo del mensaje.
  2. Decodifica en base 64 la carga útil de RBM en el elemento message.body de la solicitud.
  3. Con el token de cliente de tu webhook (que especificaste cuando configuraste tu suscripción de envío) como clave, crea una HMAC SHA512 de los bytes de la carga útil del mensaje decodificado en base64 y codifica en base64 el resultado.
  4. Compara el hash X-Goog-Signature con el hash que creaste.
    • Si los hash coinciden, confirmaste que Google envió el mensaje.
    • Si los hash no coinciden, verifica tu proceso de hash en un mensaje que se considere bueno.

      Si el proceso de generación de hash funciona correctamente y recibes un mensaje que crees que se te envió de forma fraudulenta, comunícate con nosotros.

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óximos pasos

Una vez que configures tu suscripción y configures tu agente para que se comunique con Cloud Pub/Sub, el agente podrá recibir mensajes de tus dispositivos de prueba. Envía un mensaje para validar la configuración.