คำอธิบายการตั้งค่าการเรียกกลับ
ส่วนนี้จะอธิบายวิธีตั้งค่าที่อยู่การเรียกกลับ (callback) ของ EngageLab OTP รวมถึงกลไกการตรวจสอบความปลอดภัยที่เกี่ยวข้อง เพื่อให้มั่นใจในความน่าเชื่อถือและความปลอดภัยของข้อมูลการเรียกกลับ
การตั้งค่าและการตรวจสอบที่อยู่การเรียกกลับ
หลังจากตั้งค่าที่อยู่การเรียกกลับแล้ว EngageLab OTP จะส่งคำขอ HTTP POST ไปยังที่อยู่ดังกล่าวโดยอัตโนมัติหนึ่งครั้ง เพื่อตรวจสอบความพร้อมใช้งานของอินเทอร์เฟซ บริการของคุณต้องคืนสถานะ HTTP 200 ภายใน 3 วินาที มิฉะนั้นระบบจะถือว่าที่อยู่ดังกล่าวไม่สามารถใช้งานได้
หมายเหตุ:
เพื่อให้สามารถรับข้อมูลการเรียกกลับได้ตามปกติ โปรดเพิ่ม 119.8.170.74 และ 114.119.180.30 เข้าในรายการที่อนุญาต (whitelist) ของไฟร์วอลล์เซิร์ฟเวอร์ของคุณ
ตัวอย่างคำขอ
สมมติว่าที่อยู่การเรียกกลับของคุณคือ https://example.engagelabotp.callback.com ระบบจะส่งคำขอดังต่อไปนี้:
curl -X POST https://example.engagelabotp.callback.com -d '{}'
ข้อกำหนดของการตอบกลับ
บริการของคุณเพียงคืนสถานะ HTTP 200 เท่านั้น โดยไม่จำเป็นต้องคืนเนื้อหาใด ๆ ตัวอย่างเช่น:
HTTP/1.1 200 OK
Content-Length: 0
หมายเหตุ:
การตรวจสอบที่อยู่การเรียกกลับจะพิจารณาเฉพาะสถานะ HTTP เท่านั้น ไม่ต้องการให้คืนเนื้อหาข้อความเฉพาะเจาะจง โปรดตรวจสอบให้แน่ใจว่าอินเทอร์เฟซบริการของคุณสามารถตอบกลับสถานะ 200 ได้อย่างถูกต้องภายใน 3 วินาที
กลไกความปลอดภัยของการเรียกกลับ
เพื่อรับประกันความปลอดภัยของข้อมูลการเรียกกลับและความน่าเชื่อถือของแหล่งที่มา EngageLab OTP รองรับวิธีการตรวจสอบความปลอดภัยหลายแบบ
การตรวจสอบชื่อผู้ใช้และคีย์ลับ (ไม่บังคับ)
- เป็นการตั้งค่าที่ไม่บังคับ หากตั้งค่าชื่อผู้ใช้ จะต้องตั้งค่าคีย์ลับพร้อมกันด้วย
- เมื่อตั้งค่าแล้ว EngageLab จะเพิ่มฟิลด์
X-CALLBACK-IDใน HTTP Header ของทุกคำขอการเรียกกลับ โดยมีรูปแบบดังนี้:
X-CALLBACK-ID: timestamp={timestamp};nonce={nonce};username={username};signature={signature}
- โดยที่:
timestamp: เวลาที่ส่งการเรียกกลับ (timestamp)nonce: ค่าสุ่มusername: ชื่อผู้ใช้ที่คุณตั้งค่าไว้signature: ข้อมูลลายเซ็น วิธีการคำนวณมีดังนี้
วิธีการคำนวณลายเซ็น (ตัวอย่าง Python)
import hashlib, hmac
def verify(username, secret, timestamp, nonce, signature):
return signature == hmac.new(
key=secret.encode(),
msg=f'{timestamp}{nonce}{username}'.encode(),
digestmod=hashlib.sha256
).hexdigest()
- ฝั่งเซิร์ฟเวอร์สามารถใช้วิธีข้างต้นเพื่อตรวจสอบความถูกต้องของคำขอการเรียกกลับได้
การยืนยันตัวตนด้วย Authorization (ไม่บังคับ)
- หากอินเทอร์เฟซการเรียกกลับของคุณต้องการการยืนยันตัวตน (เช่น Basic Auth, Bearer Token เป็นต้น) คุณสามารถกรอกข้อมูล Authorization ขณะตั้งค่าได้
- EngageLab จะแนบฟิลด์ Authorization ดังกล่าวไปกับคำขอโดยอัตโนมัติ เพื่อให้บริการของคุณตรวจสอบตัวตนของคำขอได้
คำอธิบายเหตุการณ์การเรียกกลับ
สถานะข้อความ
สถานะข้อความใช้สำหรับติดตามการเปลี่ยนแปลงสถานะของแต่ละข้อความตลอดวงจรชีวิต เพื่อให้เข้าใจความคืบหน้าของข้อความในแต่ละขั้นตอน เช่น การส่ง การนำส่ง และการตรวจสอบแบบเรียลไทม์ ช่วยให้สะดวกต่อการวิเคราะห์เชิงสถิติ การจัดการความผิดปกติ และการปรับปรุงประสบการณ์ผู้ใช้
| ตัวระบุเหตุการณ์ | คำอธิบาย |
|---|---|
| plan | ข้อความถูกวางแผนส่ง เข้าสู่คิวรอการส่ง |
| target_valid | หมายเลขปลายทางถูกต้อง |
| target_invalid | หมายเลขปลายทางไม่ถูกต้อง |
| sent | ส่งข้อความสำเร็จ |
| sent_failed | ส่งข้อความล้มเหลว |
| delivered | ข้อความนำส่งถึงอุปกรณ์ของผู้ใช้ |
| delivered_failed | ส่งข้อความแล้ว แต่ไม่สามารถนำส่งถึงอุปกรณ์ของผู้ใช้ได้ |
| verified | ผู้ใช้ตรวจสอบ OTP สำเร็จแล้ว |
| verified_failed | ผู้ใช้ตรวจสอบล้มเหลว |
| verified_timeout | ผู้ใช้ไม่ได้ตรวจสอบภายในเวลาที่กำหนด หมดเวลาแล้ว |
โครงสร้างข้อมูลการเรียกกลับ
โครงสร้างชั้นนอก
{
"total": 1,
"rows": [
{
// ReportLifecycle 对象
}
]
}
| ชื่อฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| total | int | จำนวนข้อมูลที่รวมอยู่ในการเรียกกลับครั้งนี้ |
| rows | array | อาเรย์ข้อมูลสถานะวงจรชีวิต |
ออบเจ็กต์ ReportLifecycle
| ชื่อฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| message_id | string | ID เฉพาะของข้อความ |
| to | string | หมายเลขผู้รับ |
| server | string | ประเภทบริการ (เช่น otp) |
| channel | string | ประเภทช่องทาง |
| itime | int64 | timestamp ของการเรียกกลับ (วินาที) |
| custom_args | object | พารามิเตอร์ที่กำหนดเอง (จะส่งกลับมาหากมีการส่งเข้ามา) |
| status | object | ออบเจ็กต์รายละเอียดสถานะ |
ออบเจ็กต์ status
| ชื่อฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| message_status | string | สถานะปัจจุบันของข้อความ (ดูตารางด้านล่าง) |
| status_data | object | ออบเจ็กต์ข้อมูลสถานะ |
| billing | object | ออบเจ็กต์ข้อมูลการเรียกเก็บเงิน (คืนค่าเมื่อมีการเรียกเก็บเงิน) |
| error_code | int | รหัสข้อผิดพลาด 0 หมายถึงไม่มีข้อผิดพลาด |
| error_detail | object | รายละเอียดข้อผิดพลาด (คืนค่าเมื่อเกิดข้อผิดพลาด) |
ออบเจ็กต์ status_data
| ชื่อฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| msg_time | int64 | timestamp การสร้างข้อความ (วินาที) |
| message_id | string | ID ข้อความ |
| current_send_channel | string | ชื่อช่องทางที่ใช้ส่งปัจจุบัน |
| template_key | string | Key การตั้งค่าเทมเพลต |
| business_id | string | ID ธุรกิจ |
ออบเจ็กต์ billing (คืนค่าเมื่อมีการเรียกเก็บเงิน)
| ชื่อฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| cost | float64 | จำนวนค่าใช้จ่าย |
| currency | string | สกุลเงิน คงที่เป็น "USD" |
โดยทั่วไปเฉพาะข้อความในขั้น sent เท่านั้นที่จะมีข้อมูลการเรียกเก็บเงิน
ออบเจ็กต์ error_detail (คืนค่าเมื่อเกิดข้อผิดพลาด)
| ชื่อฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| message | string | คำอธิบายข้อความข้อผิดพลาด |
ตัวอย่าง: ส่งข้อความสำเร็จ
{
"total": 1,
"rows": [
{
"message_id": "123456789",
"to": "+6598765432",
"server": "sms",
"channel": "sms",
"itime": 1701234567,
"custom_args": {
"order_id": "ORDER123",
"user_id": "USER456"
},
"status": {
"message_status": "sent",
"status_data": {
"msg_time": 1701234560,
"message_id": "123456789",
"current_send_channel": "CHANNEL_A",
"template_key": "verify_code",
"business_id": "1001"
},
"billing": {
"cost": 0.005,
"currency": "USD"
},
"error_code": 0
}
}
]
}
ตัวอย่าง: ส่งข้อความล้มเหลว
{
"total": 1,
"rows": [
{
"message_id": "123456790",
"to": "+6598765433",
"server": "sms",
"channel": "sms",
"itime": 1701234568,
"status": {
"message_status": "sent_fail",
"status_data": {
"msg_time": 1701234561,
"message_id": "123456790",
"current_send_channel": "CHANNEL_B",
"template_key": "verify_code",
"business_id": "1001"
},
"error_code": 4001,
"error_detail": {
"message": "Invalid phone number"
}
}
}
]
}
การแจ้งเตือนข้อความ
การแจ้งเตือนข้อความหมายถึงเหตุการณ์ทางธุรกิจหรือการแจ้งเตือนในระดับระบบ ใช้สำหรับเตือนฝ่ายธุรกิจให้ใส่ใจข้อมูลสำคัญ เช่น สถานะการทำงานของบริการ ยอดคงเหลือ และผลการตรวจสอบเทมเพลต เพื่อให้สามารถจัดการและเตือนความเสี่ยงได้อย่างทันท่วงที
| ตัวระบุเหตุการณ์ | คำอธิบาย |
|---|---|
| insufficient_verification_rate | อัตราการตรวจสอบต่ำกว่าเกณฑ์ที่กำหนด |
| insufficient_balance | ยอดคงเหลือในบัญชีไม่เพียงพอ |
| template_audit_result | การแจ้งเตือนผลการตรวจสอบเทมเพลต |
ตัวอย่าง
{
"total": 1,
"rows": [{
"server": "otp",
"itime": 1712458844,
"notification": {
"event": "insufficient_balance",
"notification_data": {
"business_id": "1744569418236633088",
"remain_balance": -0.005, // 当前余额;
"balance_threshold": 2 // 告警阈值;
}
}
}]
}
การตอบกลับข้อความ
การตอบกลับข้อความหมายถึงเหตุการณ์การเรียกกลับเมื่อมีการโต้ตอบกับผู้ใช้หรือระบบภายนอกเป็นหลัก
| ตัวระบุเหตุการณ์ | คำอธิบาย |
|---|---|
| uplink_message | เนื้อหาข้อความขาขึ้นที่ผู้ใช้ตอบกลับผ่านช่องทางต่าง ๆ เช่น SMS |
ตัวอย่าง
{
"total": 1,
"rows": [
{
"server": "otp",
"itime": 1741083306,
"message_id": "0",
"business_id": "0",
"response": {
"event": "uplink_message",
"response_data": {
"message_sid": "SM1234567890",
"account_sid": "AC1234567890",
"from": "+1234567890",
"to": "+0987654321",
"body": "Hello, it's time to struggle!"
}
}
}
]
}
เหตุการณ์ของระบบ
เหตุการณ์ของระบบครอบคลุมการดำเนินการที่เกี่ยวข้องกับบัญชี เทมเพลต การเรียกใช้ API เป็นต้น ช่วยให้สามารถตรวจสอบ ตรวจประเมิน และประมวลผลอัตโนมัติสำหรับการดำเนินการสำคัญ เช่น การเข้าสู่ระบบบัญชี การเปลี่ยนคีย์ลับ และการเรียกใช้ API
| ตัวระบุเหตุการณ์ | คำอธิบาย |
|---|---|
| account_login | การแจ้งเตือนการดำเนินการที่เกี่ยวข้องกับการเข้าสู่ระบบบัญชี |
| key_manage | การแจ้งเตือนการดำเนินการที่เกี่ยวข้องกับการเปลี่ยนแปลงและจัดการคีย์ลับ |
| msg_history | การแจ้งเตือนการดำเนินการที่เกี่ยวข้องกับการสืบค้นประวัติข้อความ |
| template_manage | การแจ้งเตือนการดำเนินการ เช่น การเพิ่ม แก้ไข ลบเทมเพลต |
| api_call | การแจ้งเตือนการดำเนินการที่เกี่ยวข้องกับการเรียกใช้อินเทอร์เฟซ API |
โครงสร้างข้อมูลการเรียกกลับ
โครงสร้างชั้นนอก
{
"total": 1,
"rows": [
{
// 系统事件对象
}
]
}
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| total | int64 | จำนวนเหตุการณ์ทั้งหมดที่รวมอยู่ในการเรียกกลับครั้งนี้ |
| rows | array | อาเรย์ออบเจ็กต์เหตุการณ์ของระบบ |
ออบเจ็กต์เหตุการณ์ของระบบ
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| server | string | คงที่เป็น "otp" |
| itime | int64 | timestamp ที่เกิดเหตุการณ์ (วินาที) |
| system_event | object | เนื้อหาเหตุการณ์ของระบบ |
ออบเจ็กต์ system_event
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| event | string | ประเภทเหตุการณ์ |
| data | object | ข้อมูลเหตุการณ์ |
ออบเจ็กต์ data
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| business_id | string | ID ธุรกิจ |
| org_id | string | ID องค์กร |
| operator | object | ข้อมูลผู้ดำเนินการ |
ออบเจ็กต์ operator
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| string | อีเมลของผู้ดำเนินการ (หากมี) | |
| api_key | string | API Key (หากมี) |
| ip_address | string | IP ที่ดำเนินการ |
โครงสร้างคำขอ
{
"total": 1,
"rows": [
{
"server": "otp",
"itime": 1694012345,
"system_event": {
"event": "account_login",
"data": {
"business_id": "123",
"org_id": "org-abc",
"operator": {
"email": "foo@example.com",
"api_key": "api-xxxx",
"ip_address": "1.2.3.4"
},
"account_login": {
"action": "login_success"
}
}
}
}
]
}
เหตุการณ์การเข้าสู่ระบบบัญชี
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| action | string | เข้าสู่ระบบสำเร็จ / เข้าสู่ระบบล้มเหลว / ออกจากระบบ |
| fail_reason | string | สาเหตุที่เข้าสู่ระบบล้มเหลว คืนค่าเฉพาะเมื่อเป็น login_failed |
ตัวอย่าง
{
"event": "account_login",
"data": {
"business_id": "123",
"org_id": "org-abc",
"operator": {
"email": "foo@example.com",
"ip_address": "1.2.3.4"
},
"account_login": {
"action": "login_success"
}
}
}
เหตุการณ์การจัดการเทมเพลต
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| action | string | สร้างเทมเพลต / อัปเดตเทมเพลต / ลบเทมเพลต |
| template_id | string | ID เทมเพลต |
| template_name | string | ชื่อเทมเพลต |
ตัวอย่าง
{
"event": "template_manage",
"data": {
"business_id": "123",
"org_id": "org-abc",
"operator": {
"email": "foo@example.com",
"ip_address": "1.2.3.4"
},
"template_manage": {
"action": "update template",
"template_id": "tmpl-456",
"template_name": "Verification Code"
}
}
}
เหตุการณ์การจัดการคีย์ลับ
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| action | string | ค่าที่เป็นไปได้:create api_key: สร้าง API Keyupdate api_key: อัปเดต API Keydelete api_key: ลบ API Keyview api_secret: ดู API Secret |
| api_key | string | API Key |
| description | string | คำอธิบาย (ไม่บังคับ) |
ตัวอย่าง
{
"event": "key_manage",
"data": {
"business_id": "123",
"org_id": "org-abc",
"operator": {
"email": "foo@example.com",
"ip_address": "1.2.3.4"
},
"key_manage": {
"action": "create",
"api_key": "apikey-789",
"description": "新建密钥"
}
}
}
เหตุการณ์การเรียกใช้ API
| ฟิลด์ | ประเภท | คำอธิบาย |
|---|---|---|
| api_path | string | เส้นทางอินเทอร์เฟซ |
| method | string | เมธอด HTTP |
ตัวอย่าง
{
"event": "api_call",
"data": {
"business_id": "123",
"org_id": "org-abc",
"operator": {
"api_key": "apikey-789",
"ip_address": "1.2.3.4"
},
"api_call": {
"api_path": "/api/v1/messages/send",
"method": "POST"
}
}
}










