Cloud Pub/Sub 설정

RBM 에이전트는 Cloud Pub/Sub와의 게시/구독 관계를 통해 메시지와 이벤트를 수신합니다. 사용자가 에이전트에 메시지를 보내거나 이벤트를 생성하면 메시지 앱은 에이전트의 Pub/Sub 구독으로 정보를 전송하며, 여기에서 에이전트가 메시지 또는 이벤트에 액세스할 수 있습니다. 메시지 수신을 참조하세요.

사용자가 상담사에게 메시지를 보냅니다.

에이전트의 Pub/Sub 구독 유형에 따라 에이전트가 메시지를 수신하는 방법이 결정되므로 에이전트가 메시지를 수신할 수 있으려면 먼저 Pub/Sub 구독을 구성해야 합니다. RBM 상담사는 pullpush 구독을 모두 지원합니다.

풀 구독

가져오기 구독을 사용하면 에이전트가 Cloud Pub/Sub에 연결하여 메시지, 이벤트, 기타 요청을 가져옵니다.

기본 요건

시작하기 전에 RBM 에이전트가 필요합니다.

설정

  1. 비즈니스 커뮤니케이션 개발자 콘솔을 열고 RBM Google 계정으로 로그인한 다음 에이전트를 클릭합니다.
  2. 왼쪽 탐색 메뉴에서 Integrations(통합)를 클릭합니다.
  3. 정기 결제 수정을 클릭합니다.
  4. 가져오기를 선택한 다음 저장을 클릭합니다.
  5. 가져오기 구독을 사용하도록 에이전트를 구성합니다.
    • 가져오기 구독과 함께 샘플 에이전트를 사용하는 경우 샘플 README 파일의 안내를 따르세요.
    • 샘플 에이전트를 사용하지 않는 경우 에이전트가 가져오기 구독을 사용할 수 있도록 하는 코드는 pull을 사용하여 메시지 수신을 참조하세요. 프로그래밍 언어에 따라 에이전트의 프로젝트 ID가 필요할 수 있습니다.

프로젝트 ID 확인

일부 가져오기 구독 메커니즘에서는 에이전트의 Google Cloud 프로젝트 (GCP) 프로젝트 ID를 지정해야 합니다. project/ 다음에 오는 pull 구독 이름에 에이전트의 프로젝트 ID가 삽입됩니다.

  1. 비즈니스 커뮤니케이션 개발자 콘솔을 열고 RBM Google 계정으로 로그인한 다음 에이전트를 클릭합니다.
  2. 왼쪽 탐색 메뉴에서 Integrations(통합)를 클릭합니다.
  3. 에이전트의 구독 이름을 찾습니다.
  4. project/와 다음 / 사이의 텍스트 세그먼트를 찾습니다. 이 ID는 에이전트의 프로젝트 ID입니다. 예를 들어 구독 이름이 projects/rbm-growing-tree-bank-nbdjkl6t/subscriptions/rbm-agent-subscription이면 에이전트의 프로젝트 ID는 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;
    });
  }
}
이 코드는 RBM 샘플 에이전트에서 발췌한 것입니다.

푸시 구독

푸시 구독을 사용하면 Cloud Pub/Sub에서 메시지, 이벤트, 기타 요청을 지정한 웹훅 URL로 푸시합니다.

기본 요건

시작하기 전에 다음이 필요합니다.

  • RBM 상담사
  • 다음을 지원하는 실시간 웹훅 엔드포인트 URL
    • 유효한 SSL 인증서가 있는 HTTPS
    • POST 요청
    • 유효성 검사 요청에 대한 응답으로 매개변수를 에코하는 기능

설정

  1. 비즈니스 커뮤니케이션 개발자 콘솔을 열고 RBM Google 계정으로 로그인한 다음 에이전트를 클릭합니다.
  2. 왼쪽 탐색 메뉴에서 Integrations(통합)를 클릭합니다.
  3. 정기 결제 수정을 클릭합니다.
  4. 푸시를 선택합니다.
  5. 웹훅 엔드포인트 URL에 'https://'로 시작하는 웹훅 URL을 입력합니다.
  6. 지정된 clientToken 매개변수가 있는 POST 요청을 수락하고 secret 매개변수 값이 포함된 200 OK 응답을 보내도록 웹훅을 구성합니다.

    예를 들어 웹훅이 다음과 같은 본문 콘텐츠가 포함된 POST 요청을 수신하는 경우

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

    웹훅에서 clientToken 값을 확인해야 하며, clientToken가 올바르면 본문이 secret: 1234567890200 OK 응답을 반환합니다.

  7. 콘솔에서 확인을 클릭합니다.

    RBM 플랫폼에서 웹훅을 확인하면 Configure your webhook 대화상자가 닫힙니다.

  8. 저장을 클릭합니다.

  9. 웹훅에서 메시지를 수신하도록 에이전트를 구성합니다.

    • 푸시 구독과 함께 샘플 에이전트를 사용하는 경우 샘플 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에서 수신한 메시지를 보냈는지 확인하려면 다음 단계를 따르세요.

  1. 메일의 X-Goog-Signature 헤더를 추출합니다. 메시지 본문 페이로드의 해시 및 base64 인코딩 사본입니다.
  2. 요청의 message.body 요소에서 RBM 페이로드를 Base-64로 디코딩합니다.
  3. 푸시 구독을 설정할 때 지정한 웹훅의 클라이언트 토큰을 키로 사용하여 base-64 디코딩된 메시지 페이로드 바이트의 SHA512 HMAC를 만들고 결과를 base64로 인코딩합니다.
  4. X-Goog-Signature 해시를 직접 만든 해시와 비교합니다.
    • 해시가 일치하면 Google에서 메시지를 보낸 것입니다.
    • 해시가 일치하지 않으면 정상으로 알려진 메시지의 해싱 프로세스를 확인합니다.

      해싱 프로세스가 올바르게 작동하고 있으며 허위로 의심되는 메시지를 받은 경우 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와 통신하도록 에이전트를 설정하면 에이전트가 테스트 기기에서 메시지를 수신할 수 있습니다. 설정을 검증하는 메시지를 전송합니다.