ตั้งค่า Cloud Pub/Sub

ตัวแทน RBM จะได้รับข้อความและเหตุการณ์ผ่านความสัมพันธ์การเผยแพร่/การสมัครใช้บริการกับ Cloud Pub/Sub เมื่อผู้ใช้ส่งข้อความถึงตัวแทนหรือสร้าง เหตุการณ์ แอปรับส่งข้อความของตัวแทนจะส่งข้อมูลไปยังการสมัครใช้บริการ Pub/Sub ของตัวแทน ซึ่งตัวแทนจะเข้าถึงข้อความหรือกิจกรรมได้ โปรดดูหัวข้อรับข้อความ

ผู้ใช้ส่งข้อความถึงตัวแทน

ประเภทการสมัครใช้บริการ Pub/Sub ของตัวแทนจะกำหนดวิธีที่ตัวแทนรับข้อความ คุณจึงต้องกำหนดค่าการสมัครใช้บริการ Pub/Sub ก่อนที่ตัวแทนจะรับข้อความได้ ตัวแทน RBM รองรับทั้งการสมัครใช้บริการแบบ pull และ push

การสมัครใช้บริการแบบพุล

ด้วยการสมัครใช้บริการแบบพุล ตัวแทนจะติดต่อ Cloud Pub/Sub เพื่อดึงข้อมูลข้อความ เหตุการณ์ และคำขออื่นๆ

ข้อกำหนดเบื้องต้น

ก่อนเริ่มต้น คุณต้องมีตัวแทน RBM

ตั้งค่า

  1. เปิด Business Communications Developer Console ลงชื่อเข้าใช้ด้วยบัญชี RBM ของ Google แล้วคลิกตัวแทน
  2. คลิกการผสานที่การนำทางด้านซ้าย
  3. คลิกแก้ไขการสมัครใช้บริการ
  4. เลือกพุล แล้วคลิกบันทึก
  5. กำหนดค่า Agent ให้ใช้การสมัครใช้บริการพุล ดังนี้
    • หากคุณใช้ sample Agent ที่มีการสมัครใช้บริการแบบพุล ให้ทำตามวิธีการในไฟล์ README ของตัวอย่าง
    • หากคุณไม่ได้ใช้ Agent ตัวอย่าง โปรดดูการรับข้อความโดยใช้ พุล สำหรับโค้ด เพื่อให้ตัวแทนใช้การสมัครใช้บริการแบบพุลได้ คุณอาจต้องใช้รหัสโปรเจ็กต์ของตัวแทน ทั้งนี้ขึ้นอยู่กับภาษาโปรแกรม

ค้นหารหัสโปรเจ็กต์

กลไกการสมัครใช้บริการพุลบางอย่างกำหนดให้คุณต้องระบุรหัสโปรเจ็กต์ Google Cloud Project (GCP) ของตัวแทน รหัสโปรเจ็กต์ของ Agent ฝังอยู่ในชื่อการสมัครใช้บริการพุลที่ตามหลัง project/

  1. เปิด Business Communications Developer Console ลงชื่อเข้าใช้ด้วยบัญชี RBM ของ Google แล้วคลิกตัวแทน
  2. คลิกการผสานที่การนำทางด้านซ้าย
  3. ค้นหาชื่อการสมัครใช้บริการของตัวแทน
  4. หาส่วนของข้อความระหว่าง project/ ถึง / ต่อไปนี้ นี่คือรหัสโปรเจ็กต์ของ Agent ตัวอย่างเช่น หากชื่อการสมัครใช้บริการคือ projects/rbm-growing-tree-bank-nbdjkl6t/subscriptions/rbm-agent-subscription รหัสโปรเจ็กต์ของ Agent จะเป็น 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 ปลายทางของเว็บฮุคแบบสดที่รองรับ
    • HTTPS ที่มีใบรับรอง SSL ที่ถูกต้อง
    • คำขอ POST รายการ
    • ความสามารถในการสะท้อนพารามิเตอร์ตามคำขอการตรวจสอบ

ตั้งค่า

  1. เปิด Business Communications Developer Console ลงชื่อเข้าใช้ด้วยบัญชี RBM ของ Google แล้วคลิกตัวแทน
  2. คลิกการผสานที่การนำทางด้านซ้าย
  3. คลิกแก้ไขการสมัครใช้บริการ
  4. เลือกพุช
  5. สำหรับ URL ปลายทางของเว็บฮุค ให้ป้อน URL ของเว็บฮุคที่ขึ้นต้นด้วย "https://"
  6. กำหนดค่าเว็บฮุคให้ยอมรับคำขอ POST ที่มีพารามิเตอร์ clientToken ที่ระบุ และส่งการตอบกลับ 200 OK ที่มีค่าของพารามิเตอร์ secret

    ตัวอย่างเช่น หากเว็บฮุคได้รับคำขอ POST ที่มีเนื้อหาส่วนเนื้อหาต่อไปนี้

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

    เว็บฮุคควรยืนยันค่า clientToken และหาก clientToken ถูกต้อง ให้แสดงผลเป็น 200 OK โดยระบุเนื้อหาเป็น secret: 1234567890

  7. คลิกยืนยันในคอนโซล

    เมื่อแพลตฟอร์ม RBM ยืนยันเว็บฮุคของคุณแล้ว กล่องโต้ตอบกำหนดค่าเว็บฮุคจะปิดลง

  8. คลิกบันทึก

  9. กําหนดค่าตัวแทนให้รับข้อความจากเว็บฮุค ดังนี้

    • หากคุณใช้ตัวอย่าง Agent กับการสมัครใช้บริการแบบพุช ให้ทำตามคำแนะนำในไฟล์ README ของตัวอย่าง
    • หากคุณไม่ได้ใช้ Agent ตัวอย่าง ให้กำหนดค่าโครงสร้างพื้นฐานเพื่อให้ส่งข้อความจากเว็บฮุคไปยัง Agent ของคุณ

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 ของข้อความ นี่คือสำเนาเพย์โหลดเนื้อหาข้อความที่เข้ารหัสฐาน 64
  2. Base-64-ถอดรหัสของเพย์โหลด RBM ในองค์ประกอบ message.body ของคำขอ
  3. ใช้โทเค็นไคลเอ็นต์ของเว็บฮุค (ซึ่งคุณระบุเมื่อตั้งค่าการสมัครใช้บริการพุช) เป็นคีย์ ให้สร้าง SHA512 HMAC จำนวนไบต์ของเพย์โหลดข้อความที่ถอดรหัสฐาน 64 และเข้ารหัสผลลัพธ์ base64
  4. เปรียบเทียบแฮช 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);

ขั้นตอนถัดไป

เมื่อคุณกำหนดค่าการสมัครใช้บริการและตั้งค่า Agent ให้สื่อสารกับ Cloud Pub/Sub แล้ว ตัวแทนจะรับข้อความจากอุปกรณ์ทดสอบได้ ส่งข้อความ เพื่อตรวจสอบการตั้งค่า