แทนที่จะติดตามเหตุการณ์ทั้งหมดในประสบการณ์และคำขอของผู้ใช้ของคุณโดยอัตโนมัติคุณสามารถติดตั้ง webhook เพื่อรับการแจ้งเตือนเวลาจริงบนเครื่องมือการแชทของบุคคลที่สามหรือเครื่องมื
การทำงานของ Webhook
เว็บไซต์ของเราส่งการแจ้งเตือนหรือข้อมูลระหว่างสองแอปหรือบริการที่แตกต่างกันเช่น Roblox และเครื่องมือการแชทของบุคคลที่สาม โดย
เมื่อคุณติดตั้งข้อมูลเรื่องการแจ้งเตือนเว็บแล้ว เมื่อเหตุการณ์เกิดขึ้นใด ๆ ที่เกี่ยวข้องกับเว็บหูฟัง โรบ็อกส่งคำขอไปยัง URL เว็บหูฟังที่คุณให้ไว้ หลั
สนับสนุนตัวเร่ง
Roblox ขณะนี้สนับสนุนเหตุการณ์ต่อไปนี้สำหรับการแจ้งเตือน:
- การสมัครรับการสมัครรับยกเลิกได้ - เมื่อผู้ใช้ยกเลิกการสมัครรับ สมัครรับ และผู้สมัครรับ รวมถึงเหตุผลที่ระบุสำหรับการยกเลิก
- ซื้อสมาชิกรายการสมาชิกแล้ว - เมื่อผู้ใช้ซื้อสมาชิกรายการสมาชิกแล้ว ข้อความจะถูกส่งมาพร้อมกับสมาชิกและผู้สมัคร
- คืนเงินสมาชิกรายเดือน - เมื่อผู้ใช้ได้รับการคืนเงินสำหรับสมาชิกรายเดือน ข้อความจะประกอบด้วยสมาชิกและผู้สมัคร
- การสมัครรับบริการรีเทิร์น - เมื่อผู้ใช้รีเทิร์นการสมัครรับบริการ ข้อความจะปรากฏขึ้น ที่มีสมาชิกและสมาชิก
- การสมัครรับซับของสมาชิกใหม่สมัครรับซับของสมาชิกที่อยู่ในรายชื่อผู้สมัครรับซับของสมาชิก * ข้อความนี้ประกอบด้วยสมาชิกและผู้สมัครรับซับของสมาชิก * เมื่อสมาชิกสมัครรับซับของสมาชิกใหม่สมัครรับซับของส
- "ข้อมูลการลบที่สมควรจะลืม" คำขอการลบข้อมูลภายใต้กฎหมายการคุ้มครองข้อมูลทั่วไป ( GDPR )
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับกิจกรรมสมัครรับข้อมูลและข้อมูลสนับสนุนสมัครรับบริการ โปรดดูที่ คลาวด์ API สมัครรับบริการ อ้างอิง
การกำหนดค่า Webhook บน แดชบอร์ดครีเอเตอร์
เพื่อรับการแจ้งเตือนผ่าน webhook คุณต้องการกำหนด webhook ที่สมัครรับเหตุการณ์บางอย่างเพื่อการแจ้งเตือน สำหรับประสบการณ์ของกลุ่มเท่านั้น เฉพาะเจ้าของกลุ่มเท่านั้นที่สามารถกำหนดและรับการแจ้งเตือน webhook
เพื่อติดตั้งตะขอเว็บ:
- ไปที่ Webhook ส่วนของ Creator Dashboard
- คลิกปุ่ม เพิ่ม Webhook 3. กรอกช่องการกำหนดค่า:
- URL ของ Webhook — ระบุ URL ที่คุณต้องการรับการแจ้งเตือนและยอมรับ URL ของ webhook จากบุคคลที่สาม สำหรับข้อมูลเพิ่มเติมเกี่ยวกับความต้องการให้ดู โปรดดู การตั้งค่า URL ของ Webhook .
- ชื่อ — ใช้ชื่อที่กำหนดเองเพื่อแยกการกำหนดค่าของคุณจากผู้อื่น โดยปกติค่าจะเหมือนกับ URL ของ Webhook
- ลับ (อpcional) — จัดหาความลับหากคุณต้องการตรวจสอบว่าการแจ้งเตือนที่คุณได้รับมาจาก Roblox มาจาก Roblox หรือไม่ สำหรับข้อมูลเพิ่มเติมดูที่ การตรวจสอบความปลอดภัยของ Webhook
- ตัวเร่ง — เลือกหนึ่งหรือมากกว่าตัวเลือกจากรายการ ตัวเร่งที่สนับสนุน ของเหตุการณ์สำหรับการรับการแจ้งเตือน
- คลิกปุ่ม บันทึกการเปลี่ยนแปลง
การติดตั้ง URL ของ Webhook
คุณสามารถติดตั้งเว็บไซต์ HTTP ที่กำหนดเองเป็น URL ของเว็บขอการโทรและตอบสนองความต้องการต่อไปนี้:
- ต้องเปิดให้บริการสาธารณะสำหรับการจัดการคำขอ
- สามารถจัดการคำขอ POST
- มันสามารถตอบสนองคำขอด้วยการตอบกลับ 2XX ภายใน 5 วินาที
- สามารถจัดการคำขอ HTTPS
คำขอ:
- ดึงรายละเอียดที่ต้องการเกี่ยวกับการแจ้งเตือนจากลำดับการโพสต์
- อ่านตัวอักษรของข้อความโพสต์ด้วยรายละเอียดทั่วไปเกี่ยวกับการแจ้งเตือนและรายละเอียดเฉพาะเกี่ยวกับประเภทกิจกรรมในการแจ้งเตือน
สำหรับข้อมูลเพิ่มเติมเกี่ยวกับโครงสร้างของคำขอ POST ที่จะดำเนินการต่อไป, ดู โครงสร้าง Payload .
นโยบายการทดลองใหม่
เมื่อการแจ้งเตือน webhook ไม่สามารถติดต่อไปยัง URL ที่กำหนดไว้ของคุณได้เนื่องจากข้อผิดพลาดเช่นความไม่พร้อมใช้
ความต้องการของบุคคลที่สาม
เครื่องมือของบุคคลที่สามมักจะมีความต้องการของตัวเองสำหรับข้อมูลเว็บที่คุณต้องปฏิบัติตามเมื่อการตั้งค่า URL ของเว็บของคุณ คุณสามารถพบข้อกำหนดเหล่านี้ได้โดยการค้นหาคำว่า "web
การทดสอบ Webhook
คุณสามารถทดสอบว่าระบบที่คุณกำหนดสามารถรับการแจ้งเตือนได้บน แผงควบคุมของผู้สร้าง :
ไปที่หน้าการกำหนดค่า Webhook
เลือก webhook ที่คุณต้องการทดสอบจากรายการของ webhook ที่กำหนด
คลิกไอคอนปากกาข้างเครื่องมือเว็บที่เป้าหมาย
คลิกปุ่ม ตอบกลับการทดสอบ ระบบจัดการติดต่อผู้ใช้แล้วส่งการแจ้งเตือนในรูปแบบ 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>"
เพื่อยืนยันลายเซ็น:
ดึงค่าเวลาและลายเซ็น ลายเซ็นสำหรับ webhook ที่มีความลับทั้งหมดแบ่งปันรูปแบบเดียวกันเป็นสตริง CSV ด้วยค่าเหล่านี้ต่อด้วยตัวอักษร:
- t : มูลค่านาฬิกาที่แนบมาในเวลาที่แจ้งเตือน
- v1 : มูลค่าลายเซ็นที่สร้างขึ้นโดยการใช้ค่าเริ่มต้นที่ให้โดยการกำหนดค่า Dashboard ของผู้สร้าง คุณสามารถสกรีนสองมูลค่านี้ด้วยวิธี split() ซึ่งแยกสตริงตามตัว
สร้างตัวอักษรฐานของ roblox-signature โดยการรวม:
- เวลาที่มีเหตุการณ์เป็นสตริง
- ตัวอักษรระยะเวลา .
- สตริง JSON ของร่างกายคำขอ
คําหมายรหัสข้อความที่พิสูจน์ด้วยแฮช (HMAC) ด้วย función SHA256 ตัวแปรที่คุณกําหนดในขั้นตอนที่ 2 ในขณะที่เป็นสตริงข้อความที่คุณสร้างขึ้นผ่านขั้นตอนที่ 2 ในฐานะสตริงข้อความที่คุณ
เปรียบเทียบมูลค่าตัวลายเซ็นที่สกุลได้รับกับตัวลายเซ็นที่คาดหวัง หากคุณสร้างตัวลายเซ็นได้อย่างถูกต้อง มูลค่าควรเป็นเดียวกัน
(อpcional) เพื่อป้องกันการโจมตีซ้ำ หมายเลขประเภทของการโจมตีที่ผู้โจมตีสัญญาณและส่งข้อมูลใหม่เพื่อรับการเข้าถึงที่ไม่ได้รับอนุญาตหรือดำเนินการการกระทําที่เป็นอ
โครงสร้าง Payload
เมื่อเหตุการณ์เป้าหมายของ webhook ของคุณเรียกใช้มันส่งคำขอไปยัง URL ของ webhook ของคุณรวมถึงข้อมูลเกี่ยวกับเหตุการณ์ใน payload ทั้งหมด ทุกโหลดของคำขอมีสเคมาร์ที่เป็นรูปตัวอักษร
สาขาวิชาระบบการจัดการพื้นโดยสาริกรณ์ของเว็บไซต์ สามารถช่วยให้คุณครอบคลุมความสอดคล้องได้ทุกระดับของคำขอเว็บโฮกทั้งหมด โดยมีสาขาวิชาต่อไปนี้:
- NotificationId , string : รหัสระบุเฉพาะสำหรับแต่ละการแจ้งเตือนที่ส่ง หากได้รับเดียวกัน NotificationId สองครั้ง จะถูกพิจารณาว่าเป็นของซ้ำ
- EventType , string : สตริงระบุชนิดของเหตุการณ์ที่แจ้งเตือนถูกเรียก
- EventTime , timestamp : เวลาที่แน่นอนที่บ่งชี้ว่าเหตุการณ์ถูกเรียกในเวลาใด
สาขาเค้าโครงของตัวแปรผู้ส่งมาตรฐาน webhook ให้ความยืดหยุ่นสำหรับการจัดการกับสถานการณ์ต่างๆ ที่รวมถึง:
- 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')
})