มี LINE Official Account ของแพลตฟอร์ม 1 บัญชีที่ส่งผลสลิป/เตือนก่อนถึงวัน/แจ้งคิวให้ลูกค้าของร้าน PRO ทุกร้าน และรู้ว่าต้องซื้อโควตาข้อความก่อนเปิดจริง
ต้องมีก่อน สิทธิ์ผู้ดูแลระบบ · บัญชี LINE Business ID (สมัครที่ developers.line.biz) · APP_SECRET ตั้งอยู่แล้ว (ค่า LINE ถูกเข้ารหัสด้วยตัวนี้) · NEXT_PUBLIC_APP_URL เป็นโดเมนจริง (LINE เรียก webhook/callback กลับมาที่โดเมนนี้)
บัญชีเดียวใช้กับทุกร้าน — ร้านไม่ต้องตั้งค่าอะไร ลูกค้าเห็นชื่อผู้ส่งเป็นแพลตฟอร์ม ข้อความทุกบรรทัดจึงขึ้นชื่อร้านนำ (เหตุผลใน ADR-0017 Docs/adr/0017-line-notifications-and-waitlist.md)
ขั้นตอน
- LINE Developers → สร้าง Provider 1 ตัว (ชื่อแพลตฟอร์ม)→ เห็นหน้า Provider ว่าง ๆ มีปุ่ม “Create a new channel”
- สร้าง channel แบบ “Messaging API” (ผ่าน LINE Official Account Manager) แล้วเปิด “Use webhook”
ใส่ Webhook URL = ค่าที่หน้า “ตั้งค่าแพลตฟอร์ม” แสดงไว้ (
…/api/line/webhook) แล้วกด Verify — ระบบตอบ 200 เสมอเมื่อลายเซ็นถูก · ใน LINE Official Account Manager → Settings → Response settings: ปิด “Auto-response messages” และ “Greeting message” แบบเดิม (ระบบตอบเอง: ข้อความช่วยเหลือเมื่อพิมพ์อย่างอื่น) และเปิด “Webhooks”→ ได้ 3 ค่า: **Channel secret** (แท็บ Basic settings) · **Channel access token (long-lived)** (แท็บ Messaging API กด Issue) · **Basic ID** เช่น @123abcd - สร้าง channel แบบ “LINE Login” ใน Provider เดียวกัน → แท็บ LINE Login ใส่ Callback URL → แท็บ Basic settings กด “Link” ที่ “Linked OA” เลือก OA จากขั้นก่อน
Callback URL = ค่าที่หน้า “ตั้งค่าแพลตฟอร์ม” แสดง (
…/api/line/login/callback) · ไม่ Link OA = ลูกค้าจะไม่ถูกชวนเพิ่มเพื่อนตอน login แล้วข้อความจะส่งไม่ถึง (ขึ้น “ผูกแล้ว แต่คุณยังไม่ได้เพิ่มเพื่อน …”) · ขอ scope แค่profile openid(ค่าเริ่มต้น) · ตอนยังเป็น “Developing” ทดสอบได้เฉพาะบัญชีที่เพิ่มเป็น tester → กด “Publish” ก่อนเปิดจริง→ ได้ **Channel ID** และ **Channel secret** ของ LINE Login · แถว Linked OA ขึ้นชื่อ OA - หน้า “ตั้งค่าแพลตฟอร์ม” → การ์ด “LINE Official Account” กรอก 4 ค่า + Basic ID แล้วกด “บันทึกค่า LINE”
ค่าทั้งหมดเก็บในฐานข้อมูลแบบเข้ารหัส มีผลทันทีไม่ต้อง deploy · ลงบันทึกกิจกรรมแพลตฟอร์มเป็น “ตั้งค่า LINE OA” โดยไม่เก็บค่า secret
→ ขึ้น “บันทึกค่า LINE แล้ว” ช่อง token แสดง “ตั้งแล้ว ••••xxxx” และปุ่ม “ทดสอบ” / “ลบค่า LINE…” ปรากฏ - กด “ทดสอบ”
ทดสอบเรียก bot info + quota ด้วย token จริง ไม่ส่งข้อความหาใคร · ล้มเหลว = token ผิด/หมดอายุ (ออก long-lived token ใหม่แล้ววาง)
→ ขึ้น “OA “ชื่อ” (@basicId) ใช้ได้ · โควตาเดือนนี้ used/quota” - ติ๊ก “เปิดแจ้งเตือนลูกค้าทาง LINE”
ร้าน FREE ไม่เห็นอะไรเปลี่ยน · ปิดสวิตช์ = ข้อความที่ค้างในคิวถูกข้าม (SKIPPED) ไม่ส่งย้อนหลังเมื่อเปิดใหม่ การผูกของลูกค้าคงอยู่
→ ใบจองของร้าน PRO ทุกร้านมีการ์ด “รับแจ้งเตือนทาง LINE” ทันที และการ์ด waitlist มีปุ่ม “แจ้งทาง LINE เมื่อมีโต๊ะว่าง” - ทดสอบจริงครบวง: จองที่ร้าน PRO ทดสอบ → กด “รับแจ้งเตือนทาง LINE” → แนบสลิป → ดูข้อความ
ทดสอบทางแชทด้วย: พิมพ์
รหัสจอง เบอร์โทรในแชท OA ต้องตอบ “ผูกแล้ว — …” · พิมพ์อย่างอื่นต้องตอบข้อความช่วยเหลือ · ห้ามใช้ร้านลูกค้าจริงทดสอบ→ ได้ “ผูก LINE กับการจอง …” แล้วตามด้วย “จองสำเร็จ — …” หรือ “ได้รับสลิปแล้ว — …” ภายใน 1 นาที
โควตาข้อความ (สำคัญก่อนเปิดจริง)
- แพ็กเกจฟรีของ LINE OA ส่ง push ได้ 200 ข้อความ/เดือน ต่อบัญชี (reply จากแชทไม่นับ) · การจอง 1 ใบที่ผูก LINE ใช้ราว 3–5 ข้อความ (ผูก → ผลสลิป → เตือนเที่ยง → อาจมีย้าย/ยกเลิก) → ฟรีพอสำหรับ ~40–60 การจอง/เดือนรวมทุกร้าน เท่านั้น
- หมดโควตา = LINE ตอบ 429 ข้อความค้างในคิวและลองใหม่เอง (1 นาที → 5 → 15 → 1 ชม. → 6 ชม. แล้วหยุดที่ FAILED) — ลูกค้าจะได้รับช้าหรือไม่ได้รับ · การ์ด LINE แสดง “ส่งแล้วเดือนนี้ n ข้อความ” และเตือน “โควตาเหลือน้อย” เมื่อเหลือ < 20
- ก่อนเปิดให้ร้านจริง: ซื้อแพ็กเกจข้อความใน LINE Official Account Manager ให้พอกับจำนวนการจองรวมของร้าน PRO
เมื่อเปลี่ยนแปลง
| เหตุการณ์ | ต้องทำ |
|---|---|
เปลี่ยน APP_SECRET | ค่า LINE ทั้ง 3 secret และลิงก์ใบจองที่เข้ารหัสไว้กับการผูกอ่านไม่ได้ทั้งหมด → วางค่า LINE ใหม่; ลูกค้าที่ผูกไว้ยังได้รับข้อความแต่ ไม่มีลิงก์ จนกว่าจะผูกใหม่ |
เปลี่ยนโดเมน (NEXT_PUBLIC_APP_URL) | แก้ Webhook URL และ Callback URL ใน LINE Developers ให้ตรงค่าที่การ์ดแสดง |
| ออก token ใหม่ / เปลี่ยน OA | วางค่าใหม่ทั้งชุด (ค่าเก่าถูกเขียนทับ) · ถ้าเปลี่ยน OA เป็นบัญชีอื่น line_user_id ที่ผูกไว้ใช้กับ OA ใหม่ไม่ได้ — ลูกค้าต้องผูกใหม่ |
| “ลบค่า LINE…” | ปุ่ม/การ์ด LINE หายจากทุกร้านทันที การผูกและคิวคงอยู่ในฐานข้อมูลจนถูก purge 90 วัน |
ถ้าเห็นข้อความนี้
| ถ้าเห็นข้อความนี้ | แปลว่า | ให้ทำ |
|---|---|---|
| “ระบบยังไม่ได้ตั้ง APP_SECRET จึงเก็บค่าไม่ได้” | env APP_SECRET ว่างบนเซิร์ฟเวอร์นี้ | ตั้ง APP_SECRET ตาม ตัวแปรสภาพแวดล้อม แล้ว deploy |
| “กรอกให้ครบทั้ง 4 ค่า” | token / secret / Login ID / Login secret ขาดอย่างน้อย 1 ค่า | คัดลอกจาก LINE Developers ให้ครบ |
| “ทดสอบไม่ผ่าน: …” | LINE ปฏิเสธ token (คัดลอกไม่ครบ / ถูก revoke / channel ผิดชนิด) | ออก long-lived token ใหม่จาก channel Messaging API แล้ววางใหม่ |
| “โควตาเหลือน้อย — ข้อความจะค้างในคิวเมื่อโควตาหมด” | เหลือ < 20 ข้อความในเดือนนี้ | ซื้อแพ็กเกจข้อความ หรือปิดสวิตช์ชั่วคราว |
ตรวจเมื่อลูกค้าบอกว่าไม่ได้รับ
- การ์ด LINE ของแพลตฟอร์ม: สวิตช์เปิด? “ทดสอบ” ผ่าน? โควตาเหลือ?
- ร้านนั้นเป็น PRO ที่ยังไม่หมดอายุ? (ตก FREE = ข้ามข้อความ ไม่ส่งย้อนหลัง)
- หน้า “การจอง” ของร้านแถวนั้นมีป้าย “LINE” และ “LINE: ผูกแล้ว …”? ถ้า “LINE: ลูกค้ายกเลิก/บล็อกแล้ว” = ลูกค้าบล็อก OA หรือพิมพ์ยกเลิก
- Vercel → Cron
line-outboxรันทุกนาที? (ผลลัพธ์ JSON มี sent/failed/skipped)