รู้ทันทีที่มีคนส่งน้ำใจ แล้วให้ระบบทำงานต่อเอง
ภาษาคนทุกครั้งที่ทิปถูกยืนยัน Tipjai จะส่งข้อความสั้น ๆ ไปบอกบริการอย่าง Zapier แล้วคุณตั้งให้มันทำอะไรต่อก็ได้ เช่น จดลง Google Sheets หรือแจ้งเข้า Discord
ข้อจำกัดตอนนี้ปลายทางต้องเป็นลิงก์ของ Zapier, Make หรือ IFTTT เท่านั้น ตั้งได้ในแดชบอร์ดที่การ์ด เชื่อมต่ออัตโนมัติ (Zapier / Make / IFTTT)
- จดทุกทิปลง Google Sheetsรับ webhook แล้วเพิ่มแถวใหม่ ชื่อ ยอด ข้อความ ครบในตาราง
- ขอบคุณในห้อง Discordส่งข้อความเข้าห้องทุกครั้งที่มีคนส่งน้ำใจ
- ไฟในห้องกระพริบต่อกับหลอดไฟอัจฉริยะ ให้ไฟวาบทุกครั้งที่ทิปเข้า
ต่อทิปเข้า Google Sheets อัตโนมัติ
ไม่ต้องเขียนโค้ด ใช้ Make หรือ Zapier ที่มีแพลนฟรี ถ้าแค่อยากได้ไฟล์ไว้ยื่นภาษี ปุ่ม ดาวน์โหลด CSV ในแดชบอร์ดง่ายกว่า
- 1สมัคร Make หรือ Zapier
- 2สร้าง scenario ใหม่ เลือก trigger Webhooks แล้ว Custom webhook คัดลอกลิงก์ที่ได้
- 3วางลิงก์นั้นในการ์ด เชื่อมต่ออัตโนมัติ บนแดชบอร์ด Tipjai แล้วกด บันทึก
- 4กด ส่งทดสอบ ปลายทางจะได้ event พร้อมฟิลด์ supporter, amount และ message
- 5เพิ่ม action Google Sheets แบบ Add a Row แล้วลากแต่ละฟิลด์ลงคอลัมน์
- 6เปิด scenario ไว้ ทุกทิปจะลงชีตเอง
หนึ่งคำขอ แยกออกเป็นสามชั้น
ตัวอย่างนี้คำนวณลายเซ็นจริงด้วย secret ตัวอย่าง ลองเอาไปตรวจในกล่องด้านล่างได้
POST https://hooks.zapier.com/hooks/catch/… Content-Type: application/json; charset=utf-8 User-Agent: Tipjai-Webhook/1.0 Idempotency-Key: 8c2f4e1a-6b3d-4f7e-9a2c-1d5e8f0b3a47 X-Tipjai-Delivery: 8c2f4e1a-6b3d-4f7e-9a2c-1d5e8f0b3a47 X-Tipjai-Event: tip.confirmed X-Tipjai-Timestamp: 1790501464 X-Tipjai-Signature: v1=e8a89c93dfba1464…7ceba520
- ได้ id เดิมซ้ำ แปลว่าเป็นงานเดิมที่ส่งซ้ำ ข้ามได้เลย
- Timestamp เป็นเวลาแบบ Unix หน่วยวินาที คำนวณใหม่ทุกครั้งที่ส่ง รวมถึงตอนส่งซ้ำ
hmac_sha256( secret, "1790501464" + "." + body ดิบ ) → hex แล้วนำหน้าด้วย v1=
- เซ็นจาก body ดิบเท่านั้น ห้าม parse แล้วแปลงกลับเป็นข้อความก่อนตรวจ
{ "id": "8c2f4e1a-…-1d5e8f0b3a47",
"data": { "gift": { "id": "rose", "qty": 3, "name": "กุหลาบ" },
"amount": 30, "tip_id": "e7a1c3f5-…-9d1b3f5e7a2c",
"message": "สู้ ๆ นะครับ", "currency": "THB",
"supporter": "แฟนคลับหมายเลข 1", "verification": "verified" },
"event": "tip.confirmed",
"created_at": "2026-09-27T09:31:04.221+00:00",
"schema_version": 1 }- กุหลาบดอกละ ฿10 สามดอก ยอดจึงเป็น 30
ส่งยังไง และถ้าพลาดจะเกิดอะไร
- 1ทิปถูกยืนยัน
ตามการตั้งค่าของครีเอเตอร์ ระดับการยืนยันอยู่ในฟิลด์ verification
- 2เข้าคิวส่ง
งานถูกเก็บในคิวก่อน ไม่หายแม้ปลายทางล่มชั่วคราว
- 3ส่ง POST
รอคำตอบนานสุด 5 วินาที และไม่ตาม redirect
- 4ได้ 2xx คือสำเร็จ
ตอบ 200 ถึง 299 แปลว่ารับแล้ว จบงานนี้
- 5ไม่ใช่ 2xx ส่งซ้ำเอง
ลองใหม่อัตโนมัติได้นานถึง 24 ชั่วโมง ด้วย id เดิม
ปิด webhook หรือเปลี่ยนปลายทาง งานที่ยังค้างในคิวจะถูกยกเลิก ไม่ถูกส่งไปที่เดิมอีก
กด เปลี่ยน secret เมื่อไหร่ งานที่ค้างอยู่จะถูกเซ็นด้วย secret ใหม่ก่อนส่ง
งานที่ส่งไม่สำเร็จจนหมดเวลา กด ส่งรายการค้างอีกครั้ง ในการ์ดเดียวกันได้
มั่นใจว่ามาจาก Tipjai จริง
คัดลอก secret ได้จากการ์ดเชื่อมต่ออัตโนมัติในแดชบอร์ด ถ้าใช้ Zapier ให้เลือกตัวรับแบบ Catch Raw Hook เพื่อให้ได้ body ดิบ แล้วตรวจในขั้น Code by Zapier ด้วยโค้ดชุดเดียวกันนี้
import { createHmac, timingSafeEqual } from "node:crypto";
// rawBody คือข้อความดิบที่ได้รับ ยังไม่ผ่าน JSON.parse
export function verifyTipjai(rawBody, headers, secret) {
const ts = headers["x-tipjai-timestamp"];
const got = String(headers["x-tipjai-signature"] || "");
const want = "v1=" + createHmac("sha256", secret)
.update(`${ts}.${rawBody}`)
.digest("hex");
const fresh = Math.abs(Date.now() / 1000 - Number(ts)) < 300;
return fresh && got.length === want.length &&
timingSafeEqual(Buffer.from(got), Buffer.from(want));
}schema_version 1
| ฟิลด์ | ชนิด | คำอธิบาย |
|---|---|---|
id | uuid | รหัสของการส่งครั้งนี้ ค่าเดียวกับ Idempotency-Key |
event | string | tip.confirmed หรือ tip.test |
created_at | timestamp | เวลาที่ทิปถูกยืนยัน |
schema_version | number | ตอนนี้เป็น 1 |
data.tip_id | uuid | รหัสทิป |
data.supporter | string | ชื่อคนส่ง ถ้าเว้นว่างจะเป็น ผู้สนับสนุน |
data.amount | number | ยอดเงิน |
data.currency | string | สกุลเงิน ปกติเป็น THB |
data.message | string | ข้อความจากคนส่ง ไม่มีจะเป็นค่าว่าง |
data.verification | string | ระดับการยืนยัน เช่น verified หรือ creator_confirmed |
data.gift | object | null | id, name, qty เมื่อทิปมาพร้อมของขวัญ |
tip.confirmedส่งทุกครั้งที่ทิปถูกยืนยัน
tip.testกด ส่งทดสอบ จากแดชบอร์ด ยอดเป็น 0 และ verification เป็น test
