Агенты RBM получают сообщения и события через отношения публикации/подписки с Cloud Pub/Sub . Когда пользователь отправляет сообщение вашему агенту или создает событие , его приложение для обмена сообщениями отправляет информацию в подписку Pub/Sub вашего агента, где ваш агент может получить доступ к сообщению или событию. См. Получение сообщений .
Тип подписки Pub/Sub вашего агента определяет, как ваш агент получает сообщения, поэтому вам необходимо настроить подписку Pub/Sub, прежде чем ваш агент сможет получать сообщения . Агенты RBM поддерживают как подписку по запросу , так и по принуждению .
Подписка по запросу
При подписке по запросу ваш агент связывается с Cloud Pub/Sub и получает сообщения, события и другие запросы.
Предварительные условия
Прежде чем приступить к работе, вам понадобится агент RBM.
Настраивать
- Откройте консоль разработчика Business Communications , войдите в свою учетную запись Google RBM и выберите своего агента.
- На панели навигации слева нажмите «Интеграции» .
- Нажмите Изменить подписку .
- Выберите «Вытянуть» , затем нажмите « Сохранить» .
- Настройте свой агент для использования подписки по запросу:
- Если вы используете образец агента с подпиской по запросу, следуйте инструкциям в файле README образца.
- Если вы не используете образец агента, см. раздел Получение сообщений с использованием запроса по запросу, чтобы разрешить вашему агенту использовать подписку по запросу. В зависимости от вашего языка программирования вам может потребоваться идентификатор проекта вашего агента.
Найдите идентификатор своего проекта
Некоторые механизмы подписки по запросу требуют, чтобы вы указали идентификатор проекта Google Cloud Project (GCP) вашего агента. Идентификатор проекта вашего агента встроен в имя подписки по запросу после project/
.
- Откройте консоль разработчика Business Communications , войдите в свою учетную запись Google RBM и выберите своего агента.
- На панели навигации слева нажмите «Интеграции» .
- Найдите название подписки вашего агента.
- Найдите текстовый сегмент между
project/
и следующим/
. Это идентификатор проекта вашего агента. Например, если имя подписки —projects/rbm-growing-tree-bank-nbdjkl6t/subscriptions/rbm-agent-subscription
, идентификатор проекта вашего агента —rbm-growing-tree-bank-nbdjkl6t
.
С#
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; }); } }Этот код представляет собой отрывок из примера агента RBM .
Принудительная подписка
При принудительной подписке Cloud Pub/Sub отправляет сообщения, события и другие запросы на указанный вами URL-адрес веб-перехватчика.
Предварительные условия
Прежде чем приступить к работе, вам необходимо следующее:
- Агент РБМ
- URL-адрес конечной точки веб-перехватчика, который поддерживает
- HTTPS с действительным сертификатом SSL
-
POST
запросы - Возможность отображать параметр в ответ на запрос проверки.
Настраивать
- Откройте консоль разработчика Business Communications , войдите в свою учетную запись Google RBM и выберите своего агента.
- На панели навигации слева нажмите «Интеграции» .
- Нажмите Изменить подписку .
- Выберите «Нажать» .
- В поле URL-адрес конечной точки веб-перехватчика введите URL-адрес веб-перехватчика, начиная с https://.
Настройте свой веб-перехватчик так, чтобы он принимал запрос
POST
с указанным параметромclientToken
и отправлял ответ200 OK
со значениемsecret
параметра.Например, если ваш вебхук получает запрос POST со следующим содержимым тела
{ "clientToken":"SJENCPGJESMGUFPY", "secret":"1234567890" }
ваш вебхук должен подтвердить значение
clientToken
и, еслиclientToken
верен, вернуть ответ200 OK
с теломsecret: 1234567890
.В консоли нажмите «Проверить» .
Когда платформа RBM проверит ваш веб-перехватчик, диалоговое окно «Настроить веб-перехватчик» закроется.
Нажмите Сохранить .
Настройте свой агент для получения сообщений от вашего веб-перехватчика:
- Если вы используете образец агента с принудительной подпиской, следуйте инструкциям в файле README образца.
- Если вы не используете образец агента, настройте свою инфраструктуру для передачи сообщений от вашего веб-перехватчика к вашему агенту.
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); } }
Проверка входящих сообщений
Поскольку веб-перехватчики могут получать сообщения от любых отправителей, вам следует убедиться, что Google отправил входящие сообщения, прежде чем обрабатывать их содержимое.
Чтобы убедиться, что Google отправил полученное вами сообщение, выполните следующие действия:
- Извлеките заголовок
X-Goog-Signature
сообщения. Это хешированная копия полезных данных тела сообщения в кодировке Base64. - Base-64-декодирует полезную нагрузку RBM в элементе
message.body
запроса. - Используя клиентский токен веб-перехватчика (который вы указали при настройке принудительной подписки ) в качестве ключа, создайте SHA512 HMAC из байтов полезной нагрузки сообщения, декодированного в формате Base64, и закодируйте результат в формате Base64.
- Сравните хэш
X-Goog-Signature
с созданным вами хешем.- Если хеши совпадают, вы подтверждаете, что сообщение отправлено Google.
Если хэши не совпадают, проверьте процесс хеширования на заведомо исправном сообщении.
Если ваш процесс хеширования работает правильно и вы получили сообщение, которое, по вашему мнению, было отправлено вам обманным путем, свяжитесь с нами .
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);
Следующие шаги
После того как вы настроите подписку и настроите агента для связи с Cloud Pub/Sub, ваш агент сможет получать сообщения с ваших тестовых устройств . Отправьте сообщение, чтобы подтвердить настройку.