การแจ้งเตือน Webhook

*เนื้อหานี้แปลโดยใช้ AI (เวอร์ชัน Beta) และอาจมีข้อผิดพลาด หากต้องการดูหน้านี้เป็นภาษาอังกฤษ ให้คลิกที่นี่

แทนที่จะติดตามเหตุการณ์ทั้งหมดในประสบการณ์และคำขอของผู้ใช้ของคุณโดยอัตโนมัติคุณสามารถติดตั้ง webhook เพื่อรับการแจ้งเตือนเวลาจริงบนเครื่องมือการแชทของบุคคลที่สามหรือเครื่องมื

การทำงานของ Webhook

เว็บไซต์ของเราส่งการแจ้งเตือนหรือข้อมูลระหว่างสองแอปหรือบริการที่แตกต่างกันเช่น Roblox และเครื่องมือการแชทของบุคคลที่สาม โดย

เมื่อคุณติดตั้งข้อมูลเรื่องการแจ้งเตือนเว็บแล้ว เมื่อเหตุการณ์เกิดขึ้นใด ๆ ที่เกี่ยวข้องกับเว็บหูฟัง โรบ็อกส่งคำขอไปยัง URL เว็บหูฟังที่คุณให้ไว้ หลั

สนับสนุนตัวเร่ง

Roblox ขณะนี้สนับสนุนเหตุการณ์ต่อไปนี้สำหรับการแจ้งเตือน:

  • การสมัครรับการสมัครรับยกเลิกได้ - เมื่อผู้ใช้ยกเลิกการสมัครรับ สมัครรับ และผู้สมัครรับ รวมถึงเหตุผลที่ระบุสำหรับการยกเลิก
  • ซื้อสมาชิกรายการสมาชิกแล้ว - เมื่อผู้ใช้ซื้อสมาชิกรายการสมาชิกแล้ว ข้อความจะถูกส่งมาพร้อมกับสมาชิกและผู้สมัคร
  • คืนเงินสมาชิกรายเดือน - เมื่อผู้ใช้ได้รับการคืนเงินสำหรับสมาชิกรายเดือน ข้อความจะประกอบด้วยสมาชิกและผู้สมัคร
  • การสมัครรับบริการรีเทิร์น - เมื่อผู้ใช้รีเทิร์นการสมัครรับบริการ ข้อความจะปรากฏขึ้น ที่มีสมาชิกและสมาชิก
  • การสมัครรับซับของสมาชิกใหม่สมัครรับซับของสมาชิกที่อยู่ในรายชื่อผู้สมัครรับซับของสมาชิก * ข้อความนี้ประกอบด้วยสมาชิกและผู้สมัครรับซับของสมาชิก * เมื่อสมาชิกสมัครรับซับของสมาชิกใหม่สมัครรับซับของส
  • "ข้อมูลการลบที่สมควรจะลืม" คำขอการลบข้อมูลภายใต้กฎหมายการคุ้มครองข้อมูลทั่วไป ( GDPR )

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับกิจกรรมสมัครรับข้อมูลและข้อมูลสนับสนุนสมัครรับบริการ โปรดดูที่ คลาวด์ API สมัครรับบริการ อ้างอิง

การกำหนดค่า Webhook บน แดชบอร์ดครีเอเตอร์

เพื่อรับการแจ้งเตือนผ่าน webhook คุณต้องการกำหนด webhook ที่สมัครรับเหตุการณ์บางอย่างเพื่อการแจ้งเตือน สำหรับประสบการณ์ของกลุ่มเท่านั้น เฉพาะเจ้าของกลุ่มเท่านั้นที่สามารถกำหนดและรับการแจ้งเตือน webhook

เพื่อติดตั้งตะขอเว็บ:

  1. ไปที่ Webhook ส่วนของ Creator Dashboard
  2. คลิกปุ่ม เพิ่ม Webhook 3. กรอกช่องการกำหนดค่า:
    1. URL ของ Webhook — ระบุ URL ที่คุณต้องการรับการแจ้งเตือนและยอมรับ URL ของ webhook จากบุคคลที่สาม สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความต้องการให้ดู โปรดดู การตั้งค่า URL ของ Webhook .
    2. ชื่อ — ใช้ชื่อที่กำหนดเองเพื่อแยกการกำหนดค่าของคุณจากผู้อื่น โดยปกติค่าจะเหมือนกับ URL ของ Webhook
    3. ลับ (อpcional) — จัดหาความลับหากคุณต้องการตรวจสอบว่าการแจ้งเตือนที่คุณได้รับมาจาก Roblox มาจาก Roblox หรือไม่ สำหรับข้อมูลเพิ่มเติมดูที่ การตรวจสอบความปลอดภัยของ Webhook
    4. ตัวเร่ง — เลือกหนึ่งหรือมากกว่าตัวเลือกจากรายการ ตัวเร่งที่สนับสนุน ของเหตุการณ์สำหรับการรับการแจ้งเตือน
  3. คลิกปุ่ม บันทึกการเปลี่ยนแปลง

การติดตั้ง URL ของ Webhook

คุณสามารถติดตั้งเว็บไซต์ HTTP ที่กำหนดเองเป็น URL ของเว็บขอการโทรและตอบสนองความต้องการต่อไปนี้:

  • ต้องเปิดให้บริการสาธารณะสำหรับการจัดการคำขอ
  • สามารถจัดการคำขอ POST
  • มันสามารถตอบสนองคำขอด้วยการตอบกลับ 2XX ภายใน 5 วินาที
  • สามารถจัดการคำขอ HTTPS

คำขอ:

  • ดึงรายละเอียดที่ต้องการเกี่ยวกับการแจ้งเตือนจากลำดับการโพสต์
  • อ่านตัวอักษรของข้อความโพสต์ด้วยรายละเอียดทั่วไปเกี่ยวกับการแจ้งเตือนและรายละเอียดเฉพาะเกี่ยวกับประเภทกิจกรรมในการแจ้งเตือน

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโครงสร้างของคำขอ POST ที่จะดำเนินการต่อไป, ดู โครงสร้าง Payload .

นโยบายการทดลองใหม่

เมื่อการแจ้งเตือน webhook ไม่สามารถติดต่อไปยัง URL ที่กำหนดไว้ของคุณได้เนื่องจากข้อผิดพลาดเช่นความไม่พร้อมใช้

ความต้องการของบุคคลที่สาม

เครื่องมือของบุคคลที่สามมักจะมีความต้องการของตัวเองสำหรับข้อมูลเว็บที่คุณต้องปฏิบัติตามเมื่อการตั้งค่า URL ของเว็บของคุณ คุณสามารถพบข้อกำหนดเหล่านี้ได้โดยการค้นหาคำว่า "web

การทดสอบ Webhook

คุณสามารถทดสอบว่าระบบที่คุณกำหนดสามารถรับการแจ้งเตือนได้บน แผงควบคุมของผู้สร้าง :

  1. ไปที่หน้าการกำหนดค่า Webhook

  2. เลือก webhook ที่คุณต้องการทดสอบจากรายการของ webhook ที่กำหนด

  3. คลิกไอคอนปากกาข้างเครื่องมือเว็บที่เป้าหมาย

    The pencil icon next to an example webhook
  4. คลิกปุ่ม ตอบกลับการทดสอบ ระบบจัดการติดต่อผู้ใช้แล้วส่งการแจ้งเตือนในรูปแบบ SampleNotification ซึ่งรวมถึง รหัสผู้ใช้ ของผู้ใช้ที่เรียกใช้การแจ้งเตือนด้วยเช่นที่ภาพตัวอย่างด้านล่างแสดง:

ตัวอย่างการแจ้งเตือน

Body: {
"NotificationId": "string",
"EventType": "SampleNotification",
"EventTime": "2023-12-30T16:24:24.2118874Z", // ชนิด: ISO 8601 เวลาที่แนบมา
"EventPayload": {
"UserId": 1 // ชนิด: ยาว
}
}

หากคุณกำลังผสาน webhook ของคุณกับบริการของบุคคลที่สาม คุณสามารถทดสอบได้โดยใช้ URL ของบุคคลที่สามเพื่อยืนยันว่าบริการสามารถรับการแจ้งเตือนจาก webhook ขอ

การตรวจสอบความปลอดภัยของ Webhook

Robloxมันจะเริ่มฟังสำหรับขนส่งสินค้าใด ๆ ที่ส่งไปยัง

Signature Format with Secret for Custom Endpoints

"roblox-signature": "t=<timestamp>,v1=<signature>"

หากคุณไม่มีความลับสำหรับ webhook ของคุณ ลายเซ็นที่คุณได้รับเฉพาะเวลาที่ส่งการแจ้งเตือน:

Signature Format without Secret for Custom Endpoints

"roblox-signature": "t=<timestamp>"

เพื่อยืนยันลายเซ็น:

  1. ดึงค่าเวลาและลายเซ็น ลายเซ็นสำหรับ webhook ที่มีความลับทั้งหมดแบ่งปันรูปแบบเดียวกันเป็นสตริง CSV ด้วยค่าเหล่านี้ต่อด้วยตัวอักษร:

    • t : มูลค่านาฬิกาที่แนบมาในเวลาที่แจ้งเตือน
    • v1 : มูลค่าลายเซ็นที่สร้างขึ้นโดยการใช้ค่าเริ่มต้นที่ให้โดยการกำหนดค่า Dashboard ของผู้สร้าง คุณสามารถสกรีนสองมูลค่านี้ด้วยวิธี split() ซึ่งแยกสตริงตามตัว
  2. สร้างตัวอักษรฐานของ roblox-signature โดยการรวม:

    1. เวลาที่มีเหตุการณ์เป็นสตริง
    2. ตัวอักษรระยะเวลา .
    3. สตริง JSON ของร่างกายคำขอ
  3. คําหมายรหัสข้อความที่พิสูจน์ด้วยแฮช (HMAC) ด้วย función SHA256 ตัวแปรที่คุณกําหนดในขั้นตอนที่ 2 ในขณะที่เป็นสตริงข้อความที่คุณสร้างขึ้นผ่านขั้นตอนที่ 2 ในฐานะสตริงข้อความที่คุณ

  4. เปรียบเทียบมูลค่าตัวลายเซ็นที่สกุลได้รับกับตัวลายเซ็นที่คาดหวัง หากคุณสร้างตัวลายเซ็นได้อย่างถูกต้อง มูลค่าควรเป็นเดียวกัน

  5. (อpcional) เพื่อป้องกันการโจมตีซ้ำ หมายเลขประเภทของการโจมตีที่ผู้โจมตีสัญญาณและส่งข้อมูลใหม่เพื่อรับการเข้าถึงที่ไม่ได้รับอนุญาตหรือดำเนินการการกระทําที่เป็นอ

โครงสร้าง Payload

เมื่อเหตุการณ์เป้าหมายของ webhook ของคุณเรียกใช้มันส่งคำขอไปยัง URL ของ webhook ของคุณรวมถึงข้อมูลเกี่ยวกับเหตุการณ์ใน payload ทั้งหมด ทุกโหลดของคำขอมีสเคมาร์ที่เป็นรูปตัวอักษร

สาขาวิชาระบบการจัดการพื้นโดยสาริกรณ์ของเว็บไซต์ สามารถช่วยให้คุณครอบคลุมความสอดคล้องได้ทุกระดับของคำขอเว็บโฮกทั้งหมด โดยมีสาขาวิชาต่อไปนี้:

  1. NotificationId , string : รหัสระบุเฉพาะสำหรับแต่ละการแจ้งเตือนที่ส่ง หากได้รับเดียวกัน NotificationId สองครั้ง จะถูกพิจารณาว่าเป็นของซ้ำ
  2. EventType , string : สตริงระบุชนิดของเหตุการณ์ที่แจ้งเตือนถูกเรียก
  3. EventTime , timestamp : เวลาที่แน่นอนที่บ่งชี้ว่าเหตุการณ์ถูกเรียกในเวลาใด

สาขาเค้าโครงของตัวแปรผู้ส่งมาตรฐาน webhook ให้ความยืดหยุ่นสำหรับการจัดการกับสถานการณ์ต่างๆ ที่รวมถึง:

  1. EventPayload , object : มีข้อมูลเฉพาะเกี่ยวกับ EventType ที่เรียกใช้ปุ่มเว็บ สถานะของโครงสร้าง 0> EventPayload0> ตัวอย่างจะแตกต่างไปตามประเภทของเหตุการณ์

ตัวอย่างต่อไปนี้แสดงรูปแบบของโหลดของกิจกรรม ขอร้องลบ ตัวอย่าง:

ตัวอย่าง Schema สำหรับคำขอลบ

Body:{
"NotificationId": "string",
"EventType": "RightToErasureRequest",
"EventTime": "2023-12-30T16:24:24.2118874Z",
"EventPayload": {
"UserId": 1, // ชนิด: ยาว
"GameIds": [ // ชนิด: รายการยาว
1234, 2345
]
}
}

การจัดการการแจ้งเตือน

หากคุณเก็บข้อมูลส่วนบุคคลใด ๆ ของผู้ใช้ของคุณ เช่

หากคุณใช้เว็บไซต์ของคุณเป็นเว็บไซต์ของคุณแทนที่จะใช้เครื่องมือของบุคคลที่สาม Robloxตัวอ

Extracting PII from Payload

const crypto = require('crypto')
const express = require('express');
let app = express();
app.use(express.json());
app.use(express.urlencoded({ extended: true }));
// This is a sample only code
app.all('/*', function (req, res) {
console.log('-------- New Request Seen -------');
// 1. Extract the timestamp and signature
const shared_secret = '<Your secret>' // This can be set as an environment variable
const hmac = crypto.createHmac('sha256', shared_secret)
const roblox_signature_header = req.headers['roblox-signature'].split(',')
// 'roblox-signature' is present in all requests:
// Timestamp(t) is present in all requests, however signature value(v1) is not set unless a secret is shared during the webhook configuration.
// Fetch header component at Index 0 -> 't=' and Index 1 -> 'v1='
const timestamp = roblox_signature_header.find(e => e.startsWith('t=')).substring(2);
const extracted_signature = roblox_signature_header.find(e => e.startsWith('v1='));
// 2. Prevent Replay attack: 300 seconds window
const request_timestamp_ms = timestamp * 1000;
const window_time_ms = 300 * 1000
const oldest_timestamp_allowed = Date.now() - window_time_ms;
if (request_timestamp_ms < oldest_timestamp_allowed) {
res.status(403).send('Expired Request')
}
// 3. Validate Signature
if (extracted_signature !== undefined) {
const signature_v1 = extracted_signature.substring(3);
const message = `${timestamp}.${JSON.stringify(req.body)}`
const base64_signature = hmac.update(message).digest('base64')
if (signature_v1 !== base64_signature) {
res.status(401).send('Unauthorized Request')
}
}
// 4. Your logic to handle payload
const payloadBody = req.body
const eventType = payloadBody['EventType']
if (eventType === 'RightToErasureRequest'){
const userId = payloadBody['EventPayload']['UserId']
const gameIds = payloadBody['EventPayload']['GameIds']
const gameIdString = gameIds.toString()
console.log(`The payload: UserId=${userId} and GameIds=${gameIdString}`)
// If you store PII in data stores, use the UserId and GameIds to make a data store call to delete the information.
}
// 5. Return Response
res.json({ message: 'Processed the message Successfully' });
})
app.listen(8080, function () {
console.log('This is a Sample application')
})