ร้านค้าในไทยคุยกับลูกค้าใน LINE กันเป็นหลัก พอร้านอยากให้ระบบหลังร้านเชื่อมกับ LINE ด้วย ความต้องการมักมีสามเรื่อง คือให้ลูกค้ากดเมนูใน LINE แล้วเปิดดูข้อมูลของตัวเองได้ ให้ระบบรับรูปหรือข้อความที่ลูกค้าส่งมาในแชต และให้ระบบส่งข้อความแจ้งลูกค้า เช่นร้านได้รับสลิปแล้ว หรือใกล้ถึงวันชำระงวด
สามเรื่องนี้ใช้คนละส่วนของ LINE และตั้งค่ากันคนละที่ จุดที่พลาดบ่อยที่สุดตอนเริ่มทำจึงเป็นการเอาค่าจาก channel หนึ่งไปใส่ในช่องของอีก channel โพสต์นี้เป็นภาพรวมของทั้งหมด ส่วนแต่ละเรื่องมีโพสต์ของตัวเอง ลิงก์ไว้ในแต่ละหัวข้อ
LINE OA กับระบบของร้านคุยกันผ่านสองช่องทาง
LINE Developers Console จัดของเป็นสองชั้น ชั้นบนคือ provider ซึ่งแทนบริษัทหรือร้าน ข้างใต้มี channel ได้หลายตัว แต่ละ channel เป็นช่องทางที่ระบบของเราใช้คุยกับ LINE ระบบร้านที่เชื่อมกับ LINE เต็มรูปแบบใช้สอง channel
| channel | ใช้ทำอะไร | ค่าที่ระบบต้องเก็บ |
|---|---|---|
| LINE Login | ลูกค้าเข้าแอปของร้านใน LINE (LIFF) และระบบตรวจว่าเป็น LINE ของใคร | LIFF ID และ Channel ID |
| Messaging API | ผูกกับ LINE OA ของร้าน รับข้อความจากแชต (webhook) และส่งข้อความหาลูกค้า (push) | Channel access token และ Channel secret |
LIFF คือหน้าเว็บของร้านที่เปิดอยู่ใน LINE เอกสารของ LINE บอกไว้ชัดว่าเพิ่ม LIFF ได้เฉพาะใน channel แบบ LINE Login และ LINE MINI App เท่านั้น channel ของ Messaging API ใส่ LIFF ไม่ได้ จึงต้องมีสอง channel ตั้งแต่แรก
ค่าแต่ละตัวมาจาก channel ไหน และระบบใช้ทำอะไร
ค่าที่ต้องใส่ในระบบมีสี่ตัว สองตัวจากแต่ละ channel
- LIFF ID (จาก LINE Login แท็บ LIFF) หน้าเว็บใช้เริ่มต้น LIFF ตอนลูกค้าเปิดแอป
- Channel ID ของ LINE Login server ส่งไปพร้อม token ของลูกค้าตอนถาม LINE ว่า token นี้เป็นของใคร ถ้าไม่ตรง LINE จะไม่ยืนยันให้
- Channel access token (จาก Messaging API) ใช้ส่งข้อความหาลูกค้าและโหลดรูปที่ลูกค้าส่งมา
- Channel secret (จาก Messaging API) ใช้ตรวจลายเซ็นของ webhook ว่ามาจาก LINE จริง
ทั้งสอง channel มี Channel ID และ Channel secret ของตัวเอง หน้าตาเหมือนกัน แต่ใช้แทนกันไม่ได้ ใส่ secret ของ LINE Login ลงช่อง secret ของ webhook แล้ว ทุก webhook จะตรวจลายเซ็นไม่ผ่าน ส่วน Channel ID ของ Messaging API ไม่ต้องใช้เลย เพราะการส่งข้อความใช้แค่ access token และการตรวจ webhook ใช้แค่ secret
ทั้งสอง channel ต้องอยู่ใต้ provider เดียวกัน
เอกสารของ LINE บอกว่า userId ของลูกค้าคนเดียวกันจะต่างกันในแต่ละ provider แต่เหมือนกันในทุก channel ที่อยู่ใต้ provider เดียวกัน
ผลคือถ้า channel ของ LINE Login อยู่คนละ provider กับ Messaging API ลูกค้าที่ login เข้าแอปจะได้ userId ค่าหนึ่ง แต่ webhook ตอนลูกค้าส่งสลิปในแชตจะมาอีกค่าหนึ่ง ระบบจับคู่ไม่ได้ว่าเป็นคนเดียวกัน และส่งข้อความหาลูกค้าที่ login ไว้ไม่ถึง เรื่องนี้แก้ทีหลังยาก เพราะย้าย channel ข้าม provider ไม่ได้ จึงควรเช็กตั้งแต่วันแรกที่สร้าง channel
เมื่ออยู่ provider เดียวกันแล้ว ยังผูก LINE OA ของร้านไว้ในหน้า Basic settings ของ channel LINE Login ได้ด้วย (Linked LINE Official Account) ตอนลูกค้า login ครั้งแรก LINE จะเสนอให้เพิ่มเพื่อน OA ไปพร้อมกัน ลูกค้าที่ไม่ได้เป็นเพื่อนกับ OA จะไม่ได้รับข้อความที่ระบบส่ง
หน้าตั้งค่าในระบบควรแยกตาม channel
เวลาร้านเปลี่ยนคนดูแล หรือต้องออก access token ใหม่ คนที่มาใส่ค่ามักเป็นแอดมินของร้าน ไม่ใช่นักพัฒนา หน้าตั้งค่าในระบบจึงควรแบ่งเป็นสองส่วนตามชื่อ channel ใน Console และเขียนกำกับใต้แต่ละช่องว่าค่ามาจากแท็บไหน แอดมินจะได้คัดลอกจากหน้าที่ตรงกัน
อย่างระบบที่เราทำ ชื่อค่าในโค้ดเคยขึ้นต้นด้วย LIFF_ ทั้งสี่ตัว ทั้งที่ access token กับ secret เป็นของ Messaging API ชื่อแบบนี้ชวนให้ไปคัดลอกจาก channel ของ LIFF ซึ่งผิด เราไม่ได้เปลี่ยนชื่อค่าเพราะใช้อยู่หลายจุด แต่หน้าตั้งค่าแยกเป็นหัวข้อ LINE Login กับ LINE Messaging API ให้ตรงกับ Console แทน
อีกสองอย่างที่ช่วยได้มาก
- ปุ่มทดสอบ webhook ในหน้าตั้งค่า ระบบเซ็นข้อความทดสอบด้วย secret ที่เพิ่งใส่ แล้วส่งเข้า URL webhook ของตัวเอง ถ้าผ่านก็รู้ทันทีว่า secret ถูก ไม่ต้องรอให้ลูกค้าส่งข้อความจริง
- ตรวจแบบปิดไว้ก่อน ถ้ายังไม่ได้ใส่ secret ระบบควรปฏิเสธ webhook ทุกตัว ดีกว่ารับข้อความที่ตรวจไม่ได้ แต่ต้องรู้ไว้ว่าระหว่างนั้นข้อความจากลูกค้าจะไม่เข้าระบบเลย
แต่ละงานมีรายละเอียดในโพสต์ของตัวเอง
- ลูกค้าเข้าแอปผ่าน LINE หน้าเว็บส่งแค่ token มา แล้ว server ถาม LINE เองว่าเป็นใคร รายละเอียดอยู่ใน Login ผ่าน LINE LIFF ใน Laravel อย่างปลอดภัย
- รับข้อความและรูปจากแชต ตรวจลายเซ็น ตอบ LINE ทันที แล้วค่อยทำงานใน queue อยู่ใน ทำ LINE webhook ใน Laravel ให้ตอบทันที
- ส่งข้อความแจ้งลูกค้า ใช้ push ของ Messaging API แทน LINE Notify ที่ปิดไปแล้ว อยู่ใน LINE Notify ปิดแล้ว ส่งแจ้งเตือนเข้า LINE ใช้อะไรแทน
ผูกบัญชี LINE กับลูกค้าด้วยเบอร์โทรต้องมีด่านเพิ่ม
login ผ่าน LINE ได้แล้ว ระบบยังไม่รู้ว่าคนนี้คือลูกค้าคนไหนของร้าน ทางที่สะดวกที่สุดคือให้กรอกเบอร์โทร เพราะร้านมีเบอร์ลูกค้าทุกคนอยู่แล้ว แต่เบอร์โทรไม่ใช่ความลับ คนรู้จักหรือพนักงานก็รู้ได้ ถ้าร้านตัดสินใจผูกด้วยเบอร์ ระบบต้องมีด่านที่จำกัดความเสียหายไว้
- ต้องมีรหัสอีกชั้น เช่นรหัสที่ร้านออกให้ หรือ OTP ทาง SMS ไปที่เบอร์นั้น
- ไม่ผูกทับลูกค้าที่ผูก LINE อื่นไว้แล้ว ให้ติดต่อร้านเพื่อยกเลิกก่อน
- จำกัดจำนวนครั้งต่อบัญชี LINE เช่น 5 ครั้งต่อนาที และ 20 ครั้งต่อวัน
- ทุกหน้าตอบว่าไม่พบ เมื่อขอดูข้อมูลของลูกค้าคนอื่น
รายละเอียดของการผูกบัญชีอยู่ในโพสต์ LIFF ข้างบน ส่วน OTP ทาง SMS มีโพสต์ของตัวเองในซีรีส์นี้
กรณีที่อาจเจอในงานจริง
- ลูกค้าส่งสลิปในแชตแล้วระบบหาบัญชีไม่เจอ ทั้งที่ลูกค้าคนนั้นผูก LINE ไว้แล้ว ให้เช็กก่อนว่าสอง channel อยู่ provider เดียวกันไหม
- webhook ตอบ 401 ตลอด ส่วนใหญ่เป็น secret ที่ยังไม่ได้ใส่ หรือใส่ secret ของ LINE Login แทนของ Messaging API
- ส่งข้อความหาลูกค้าไม่ถึง ลูกค้าอาจยังไม่ได้เพิ่ม OA เป็นเพื่อน หรือบล็อกไปแล้ว
- เครื่องทดสอบส่งข้อความหาลูกค้าจริง เครื่องที่ใช้ข้อมูลชุดจริงควรปิดการส่งข้อความไว้ก่อน หรือชี้ไป channel สำหรับทดสอบ






