Cloud Pub/Sub einrichten

RBM-Agents empfangen Nachrichten und Ereignisse über eine Publish/Subscribe-Beziehung mit Cloud Pub/Sub. Wenn ein Nutzer eine Nachricht an Ihren Agent sendet oder ein Ereignis generiert, sendet seine Messaging-App die Informationen an das Pub/Sub-Abo des Agents, damit der Agent auf die Nachricht oder das Ereignis zugreifen kann. Siehe Nachrichten empfangen.

Der Nutzer sendet eine Nachricht an den Agent

Der Pub/Sub-Abotyp des Agents bestimmt, wie Ihr Agent Nachrichten empfängt. Daher müssen Sie Ihr Pub/Sub-Abo konfigurieren, bevor der Agent Nachrichten empfangen kann. RBM-Agents unterstützen sowohl pull- als auch push-Abos.

Pull-Abo

Bei einem Pull-Abo kontaktiert Ihr Agent Cloud Pub/Sub und ruft Nachrichten, Ereignisse und andere Anfragen ab.

Voraussetzungen

Bevor Sie beginnen, benötigen Sie einen RBM-Agent.

Einrichtung

  1. Öffne die Business Communications Developer Console, melde dich mit deinem RBM-Google-Konto an und klicke auf deinen Agent.
  2. Klicken Sie im linken Navigationsbereich auf Integrations (Integrationen).
  3. Klicken Sie auf Abo bearbeiten.
  4. Wählen Sie Pull aus und klicken Sie dann auf Speichern.
  5. Konfigurieren Sie Ihren Agent für die Verwendung des Pull-Abos:
    • Wenn Sie einen Beispiel-Agent mit einem Pull-Abo verwenden, folgen Sie der Anleitung in der README-Datei des Beispiels.
    • Wenn Sie keinen Beispiel-Agent verwenden, finden Sie unter Nachrichten mit Pull empfangen Informationen dazu, wie Sie den Agent für die Verwendung des Pull-Abos aktivieren. Je nach Programmiersprache benötigen Sie möglicherweise die Projekt-ID Ihres Agents.

Suchen Sie Ihre Projekt-ID.

Bei einigen Pull-Abo-Mechanismen müssen Sie die Google Cloud-Projekt-ID (GCP) Ihres Agents angeben. Die Projekt-ID des Agents ist in den Namen des Pull-Abos nach project/ eingebettet.

  1. Öffne die Business Communications Developer Console, melde dich mit deinem RBM-Google-Konto an und klicke auf deinen Agent.
  2. Klicken Sie im linken Navigationsbereich auf Integrations (Integrationen).
  3. Suchen Sie den Abonamen des Agents.
  4. Suchen Sie das Textsegment zwischen project/ und dem folgenden /. Dies ist die Projekt-ID Ihres Agents. Wenn der Aboname beispielsweise projects/rbm-growing-tree-bank-nbdjkl6t/subscriptions/rbm-agent-subscription lautet, lautet die Projekt-ID des Agents 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;
    });
  }
}
Dieser Code ist ein Auszug aus einem RBM-Beispiel-Agent.

Push-Abo

Bei einem Push-Abo überträgt Cloud Pub/Sub Nachrichten, Ereignisse und andere Anfragen an eine von Ihnen angegebene Webhook-URL.

Voraussetzungen

Für den Einstieg benötigen Sie Folgendes:

  • Ein RBM-Agent
  • Eine Live-Webhook-Endpunkt-URL, die
    • HTTPS mit einem gültigen SSL-Zertifikat
    • POST Anfragen
    • Die Möglichkeit, einen Parameter als Antwort auf eine Validierungsanfrage zurückzugeben

Einrichtung

  1. Öffne die Business Communications Developer Console, melde dich mit deinem RBM-Google-Konto an und klicke auf deinen Agent.
  2. Klicken Sie im linken Navigationsbereich auf Integrations (Integrationen).
  3. Klicken Sie auf Abo bearbeiten.
  4. Wählen Sie Senden aus.
  5. Geben Sie unter Webhook-Endpunkt-URL die Webhook-URL ein, die mit „https://“ beginnt.
  6. Konfigurieren Sie den Webhook so, dass er eine POST-Anfrage mit dem angegebenen Parameter clientToken akzeptiert und eine 200 OK-Antwort mit dem Wert des Parameters secret sendet.

    Beispiel: Ihr Webhook erhält eine POST-Anfrage mit dem folgenden Textinhalt:

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

    Der Webhook sollte den Wert clientToken bestätigen. Wenn clientToken korrekt ist, gibt er eine 200 OK-Antwort mit dem Text secret: 1234567890 zurück.

  7. Klicken Sie in der Konsole auf Bestätigen.

    Wenn die RBM-Plattform Ihren Webhook überprüft, wird das Dialogfeld Webhook konfigurieren geschlossen.

  8. Klicken Sie auf Speichern.

  9. Konfigurieren Sie den Agent so, dass er Nachrichten von Ihrem Webhook erhält:

    • Wenn Sie einen Beispiel-Agent mit einem Push-Abo verwenden, folgen Sie der Anleitung in der README-Datei des Beispiels.
    • Wenn Sie keinen Beispiel-Agent verwenden, konfigurieren Sie Ihre Infrastruktur so, dass Nachrichten vom Webhook an den Agent weitergeleitet werden.

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

Eingehende Nachrichten überprüfen

Da Webhooks Nachrichten von beliebigen Absendern empfangen können, sollten Sie vor der Verarbeitung des Nachrichteninhalts prüfen, ob Google eingehende Nachrichten gesendet hat.

So überprüfen Sie, ob Google eine Nachricht gesendet hat, die Sie erhalten haben:

  1. Extrahieren Sie den X-Goog-Signature-Header der Nachricht. Dies ist eine base64-codierte, gehashte Kopie der Nutzlast des Nachrichtentexts.
  2. Mit Base64 decodieren Sie die RBM-Nutzlast im message.body-Element der Anfrage.
  3. Verwenden Sie das Clienttoken des Webhooks, das Sie beim Einrichten Ihres Push-Abos angegeben haben, als Schlüssel, um einen SHA512-HMAC der Byte der base64-decodierten Nachrichtennutzlast zu erstellen und das Ergebnis base64 zu codieren.
  4. Vergleichen Sie den Hash X-Goog-Signature mit dem von Ihnen erstellten Hash.
    • Wenn die Hashwerte übereinstimmen, haben Sie bestätigt, dass die Nachricht von Google gesendet wurde.
    • Wenn die Hashwerte nicht übereinstimmen, prüfen Sie Ihren Hash-Vorgang bei einer als fehlerfrei bekannten Nachricht.

      Wenn Ihr Hash-Prozess korrekt funktioniert und Sie eine Nachricht erhalten, die Ihrer Meinung nach in betrügerischer Absicht an Sie gesendet wurde, wenden Sie sich an uns.

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

Nächste Schritte

Sobald Sie Ihr Abo konfiguriert und den Agent für die Kommunikation mit Cloud Pub/Sub eingerichtet haben, kann er von Ihren Testgeräten Nachrichten empfangen. Senden Sie eine Nachricht, um die Einrichtung zu validieren.