คำอธิบายการตั้งค่าการเรียกกลับ

ส่วนนี้จะอธิบายวิธีตั้งค่าที่อยู่การเรียกกลับ (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 '{}'
              
              curl -X POST https://example.engagelabotp.callback.com -d '{}'

            
โค้ดนี้โชว์เป็นหน้าต่างลอย

ข้อกำหนดของการตอบกลับ

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

HTTP/1.1 200 OK Content-Length: 0
              
              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}
              
              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()
              
              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": 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": "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" } } } ] }
              
              {
  "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 // 告警阈值; } } }] }
              
              {
    "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!" } } } ] }
              
              {
    "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": 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

ฟิลด์ ประเภท คำอธิบาย
email 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" } } } } ] }
              
              {
  "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" } } }
              
              {
  "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" } } }
              
              {
  "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 Key
update api_key: อัปเดต API Key
delete api_key: ลบ API Key
view 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": "新建密钥" } } }
              
              {
  "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" } } }
              
              {
  "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"
    }
  }
}

            
โค้ดนี้โชว์เป็นหน้าต่างลอย
Icon Solid Transparent White Qiyu
ติดต่อฝ่ายขาย