เริ่มต้นใช้งาน
Webhook
Webhook ส่งข้อความจากลูกค้ามาที่เซิร์ฟเวอร์ของคุณทันที ไม่ต้องถาม API ซ้ำ ๆ
ตั้งค่า#
- ไปที่เมนู นักพัฒนา บนเว็บจัดการออฟฟิศ
- ใส่ที่อยู่
httpsของเซิร์ฟเวอร์คุณ แล้วกดบันทึก - คัดลอกความลับสำหรับตรวจลายเซ็น ระบบแสดงครั้งเดียว
- กด ส่งทดสอบ เพื่อตรวจว่าปลายทางรับได้
ข้อมูลที่ส่งมา#
ส่งแบบ POST เนื้อหาเป็น JSON ตอนนี้มีเหตุการณ์ message.received และ webhook.test
message.received
{
"event": "message.received",
"id": "1042-7",
"created_at": 1793857502513,
"office_id": "4611686018507324416",
"thread": {
"id": "1042",
"customer_name": "คุณสมหญิง",
"tags": ["VIP"],
"note": "ชอบรับของช่วงเช้า"
},
"message": {
"id": 7,
"sent_at": 1793857502513,
"from": "customer",
"type": "text",
"text": "ขนมชั้นวันนี้เหลือไหมคะ",
"file": null,
"location": null
}
}ระบบส่งเฉพาะข้อความจากลูกค้า คำตอบของออฟฟิศไม่ย้อนกลับมา บอทจึงไม่ตอบตัวเองวนไปมา
หัวข้อที่แนบมา#
| หัวข้อ | ความหมาย |
|---|---|
X-Takkub-Event | ชื่อเหตุการณ์ |
X-Takkub-Delivery | รหัสเหตุการณ์ ใช้กันทำงานซ้ำ |
X-Takkub-Timestamp | เวลาที่ส่ง เป็นวินาที |
X-Takkub-Signature | ลายเซ็น เช่น v1=abc123 |
ตรวจลายเซ็น#
ต้องตรวจทุกครั้ง เพราะใครก็ยิงเข้าที่อยู่ของคุณได้ คำนวณ HMAC-SHA256 ของ timestamp.เนื้อหาดิบ ด้วยความลับ แล้วเทียบกับลายเซ็น และควรปฏิเสธเวลาที่เก่าเกิน 5 นาที
import crypto from 'node:crypto';
function verify(rawBody, timestamp, signature, secret) {
if (Math.abs(Date.now() / 1000 - Number(timestamp)) > 300) return false;
const expected = 'v1=' + crypto.createHmac('sha256', secret)
.update(`${timestamp}.${rawBody}`).digest('hex');
const a = Buffer.from(expected);
const b = Buffer.from(signature || '');
return a.length === b.length && crypto.timingSafeEqual(a, b);
}import hashlib, hmac, time
def verify(raw_body: bytes, timestamp: str, signature: str, secret: str) -> bool:
if abs(time.time() - int(timestamp)) > 300:
return False
message = timestamp.encode() + b"." + raw_body
expected = "v1=" + hmac.new(secret.encode(), message, hashlib.sha256).hexdigest()
return hmac.compare_digest(expected, signature or "")<?php
function verify(string $raw, string $timestamp, string $signature, string $secret): bool {
if (abs(time() - (int) $timestamp) > 300) return false;
$expected = 'v1=' . hash_hmac('sha256', $timestamp . '.' . $raw, $secret);
return hash_equals($expected, $signature);
}การตอบกลับและการลองซ้ำ#
- ตอบสถานะ
2xxภายใน 5 วินาที แล้วค่อยทำงานหนัก เช่น เรียก AI ต่อภายหลัง - ถ้าไม่สำเร็จ ระบบลองใหม่อีก 2 ครั้ง หลัง 2 และ 10 วินาที
- ล้มเหลวติดกัน 100 ครั้ง ระบบปิด Webhook ให้ กดบันทึกบนเว็บเพื่อเปิดใหม่
- ระบบอาจส่งซ้ำ ให้ใช้
idกันทำงานซ้ำ - ข้อความอาจตกหล่นเมื่อคิวเต็ม หรือปลายทางล่มนาน ควรอ่าน รายการแชต เพื่อตามงานที่ค้างเป็นระยะ