Skonfiguruj Cloud Pub/Sub

Agenty RBM otrzymują wiadomości i zdarzenia w ramach relacji publikacji/subskrypcji z Cloud Pub/Sub. Gdy użytkownik wysyła wiadomość do agenta lub generuje zdarzenie, jego aplikacja do obsługi wiadomości wysyła informacje do subskrypcji Pub/Sub agenta, gdzie agent może uzyskać dostęp do wiadomości lub zdarzenia. Zobacz Otrzymywanie wiadomości.

Użytkownik wysyła wiadomość do agenta.

Typ subskrypcji Pub/Sub agenta określa, jak agent odbiera wiadomości, dlatego musisz skonfigurować subskrypcję Pub/Sub, zanim agent będzie mógł odbierać wiadomości. Agenty RBM obsługują zarówno subskrypcje pull, jak i push.

Pobierz subskrypcję

W ramach subskrypcji pull agent kontaktuje się z Cloud Pub/Sub i pobiera wiadomości, zdarzenia i inne żądania.

Wymagania wstępne

Zanim zaczniesz, potrzebujesz agenta RBM.

Konfiguracja

  1. Otwórz konsolę programisty w komunikacji biznesowej, zaloguj się na konto Google RBM i kliknij agenta.
  2. W menu nawigacyjnym po lewej stronie kliknij Integracje.
  3. Kliknij Edytuj subskrypcję.
  4. Kliknij kolejno Pobierz i Zapisz.
  5. Skonfiguruj agenta do korzystania z subskrypcji pull:

Znajdowanie identyfikatora projektu

Niektóre mechanizmy subskrypcji pull wymagają podania identyfikatora projektu Google Cloud (GCP) agenta. Identyfikator projektu agenta jest umieszczony w nazwie subskrypcji pull po elemencie project/.

  1. Otwórz konsolę programisty w komunikacji biznesowej, zaloguj się na konto Google RBM i kliknij agenta.
  2. W menu nawigacyjnym po lewej stronie kliknij Integracje.
  3. Znajdź nazwę subskrypcji agenta.
  4. Znajdź segment tekstowy między project/ a /. Jest to identyfikator projektu agenta. Jeśli na przykład nazwa subskrypcji to projects/rbm-growing-tree-bank-nbdjkl6t/subscriptions/rbm-agent-subscription, identyfikator projektu agenta to 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;
    });
  }
}
Ten kod jest fragmentem przykładowego agenta RBM.

Subskrypcja push

Dzięki subskrypcji push Cloud Pub/Sub przekazuje wiadomości, zdarzenia i inne żądania na podany przez Ciebie adres URL webhooka.

Wymagania wstępne

Potrzebujesz tych elementów:

  • agent RBM,
  • aktywny adres URL punktu końcowego webhooka, który obsługuje:
    • HTTPS z ważnym certyfikatem SSL
    • Prośby: POST
    • Możliwość powtórzenia parametru w odpowiedzi na żądanie weryfikacji

Konfiguracja

  1. Otwórz konsolę programisty w komunikacji biznesowej, zaloguj się na konto Google RBM i kliknij agenta.
  2. W menu nawigacyjnym po lewej stronie kliknij Integracje.
  3. Kliknij Edytuj subskrypcję.
  4. Wybierz Wypchnij.
  5. W polu Adres URL punktu końcowego webhooka wpisz adres URL webhooka zaczynający się od „https://”.
  6. Skonfiguruj webhooka, aby akceptował żądanie POST z określonym parametrem clientToken i wysyłał odpowiedź 200 OK z wartością parametru secret.

    Jeśli na przykład webhook otrzyma żądanie POST z tą treścią:

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

    webhook powinien potwierdzić wartość clientToken i – jeśli clientToken jest prawidłowy – zwrócić odpowiedź 200 OK z treścią secret: 1234567890.

  7. W konsoli kliknij Zweryfikuj.

    Gdy platforma RBM zweryfikuje webhooka, okno Skonfiguruj webhooka zostanie zamknięte.

  8. Kliknij Zapisz.

  9. Skonfiguruj agenta, aby odbierał wiadomości z webhooka:

    • Jeśli używasz przykładowego agenta z subskrypcją push, postępuj zgodnie z instrukcjami w pliku README tego przykładu.
    • Jeśli nie używasz przykładowego agenta, skonfiguruj infrastrukturę pod kątem przekazywania wiadomości z webhooka do agenta.

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

Weryfikowanie wiadomości przychodzących

Webhooki mogą odbierać wiadomości od dowolnych nadawców, dlatego przed przetworzeniem ich treści musisz sprawdzić, czy Google wysłał wiadomości przychodzące.

Aby sprawdzić, czy otrzymana wiadomość została wysłana przez Google, wykonaj te czynności:

  1. Wyodrębnij nagłówek X-Goog-Signature wiadomości. Jest to zaszyfrowana kopia ładunku treści wiadomości zakodowana w formacie base64.
  2. Dekodowanie ładunku RBM w standardzie Base-64 w elemencie message.body żądania.
  3. Korzystając z tokena klienta webhooka (określonego podczas konfigurowania subskrypcji push) jako klucza utwórz SHA512 HMAC bajtów ładunku wiadomości zdekodowanego w standardzie base-64 i zakoduj wynik w standardzie base64.
  4. Porównaj hasz funkcji X-Goog-Signature z utworzonym przez siebie haszem.
    • Jeśli hasze są zgodne, oznacza to, że wiadomość została wysłana przez Google.
    • Jeśli hasze nie są zgodne, sprawdź swój proces haszowania w przypadku dobrze znanej wiadomości.

      Jeśli proces szyfrowania działa prawidłowo i otrzymujesz wiadomość, która Twoim zdaniem została wysłana w wyniku oszustwa, skontaktuj się z nami.

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

Dalsze kroki

Gdy skonfigurujesz subskrypcję i skonfigurujesz agenta do komunikacji z Cloud Pub/Sub, agent będzie mógł odbierać wiadomości z Twoich urządzeń testowych. Wyślij wiadomość, aby sprawdzić konfigurację.