← กลับไปที่บล็อก
ระบบจองผ่าน LINELINE LIFFDevelopment

liff.getProfile() และ userId: ดึง LINE userId อย่างไร และทำไมต้องตรวจที่ server

20 ตุลาคม 2569 · โดย Yunmin Shin

ตอบสั้น ๆ

เรียก liff.init() แล้วตามด้วย liff.getProfile() จะได้ userId ของลูกค้า แต่ใช้ค่านี้แสดงผลในหน้าเว็บเท่านั้น ถ้าจะใช้ระบุตัวลูกค้าที่ server เช่น บันทึกการจอง ให้ส่ง ID token จาก liff.getIDToken() ไปตรวจกับ LINE แล้วใช้ค่า sub ที่ตรวจแล้ว

import liff from "@line/liff";

await liff.init({ liffId: "1234567890-AbCdEfGh" });
if (!liff.isLoggedIn()) liff.login(); // จำเป็นเฉพาะตอนเปิดนอกแอป LINE

const profile = await liff.getProfile();
profile.userId;      // "U4af4980629..."
profile.displayName; // ชื่อที่แสดงใน LINE

const idToken = liff.getIDToken(); // ส่งตัวนี้ไป server

ต้องเปิด scope อะไรบ้าง

ในหน้าตั้งค่า LIFF app ของ LINE Developers Console:

  • profile — จำเป็นสำหรับ liff.getProfile()
  • openid — จำเป็นสำหรับ liff.getIDToken()
  • chat_message.write — จำเป็นถ้าจะใช้ liff.sendMessages() ส่งข้อความสรุปการจองเข้าแชท (เทคนิคประหยัดโควตา ดูแพ็กเกจ LINE OA 2569)
  • email — เฉพาะถ้าต้องการอีเมล และ channel ต้องขอสิทธิ์อีเมลจาก LINE แล้ว

ทำไมห้ามเชื่อ userId ที่เบราว์เซอร์ส่งมา

หน้า LIFF คือเว็บธรรมดา ใครก็เปิด developer tools แล้วแก้ค่าที่ส่งไป server ได้ ถ้าระบบจองรับ userId จากเบราว์เซอร์ตรง ๆ คนหนึ่งสามารถยกเลิกหรือดูการจองของคนอื่นได้ ถ้ารู้ userId ของเขา

วิธีที่ถูกคือส่ง ID token แล้วให้ server ถาม LINE ว่า token นี้จริงไหม:

// app/api/me/route.ts (Next.js)
export async function POST(req: Request) {
  const { idToken } = await req.json();
  const res = await fetch("https://api.line.me/oauth2/v2.1/verify", {
    method: "POST",
    headers: { "Content-Type": "application/x-www-form-urlencoded" },
    body: new URLSearchParams({
      id_token: idToken,
      client_id: process.env.LINE_LOGIN_CHANNEL_ID!, // channel ID ที่ LIFF app อยู่
    }),
  });
  if (!res.ok) return Response.json({ error: "invalid token" }, { status: 401 });
  const claims = await res.json();
  return Response.json({ userId: claims.sub }); // userId ที่เชื่อถือได้
}

LINE ตรวจลายเซ็น วันหมดอายุ และ channel ให้ ID token มีอายุจำกัด ไม่ควรเก็บไว้ใช้ซ้ำ ให้ตรวจแล้วออก session ของระบบเอง

ทำไม userId ไม่ตรงกันระหว่าง channel

userId ไม่ซ้ำกันต่อ provider ลูกค้าคนเดียวกันมี userId เดียวกันในทุก channel ใต้ provider เดียวกัน แต่ถ้าอยู่คนละ provider จะได้ userId คนละค่า

ปัญหานี้เกิดบ่อยเมื่อ:

  • LIFF app อยู่ใต้ provider หนึ่ง แต่ LINE OA (Messaging API channel) อยู่อีก provider ระบบจองเก็บ userId ได้ แต่ส่งข้อความยืนยันหาลูกค้าไม่ได้
  • เอเจนซี่สร้าง channel ไว้ใต้ provider ของเอเจนซี่เอง วันที่เลิกจ้าง ร้านต้องสร้างใหม่และข้อมูลลูกค้าเดิมใช้ไม่ได้

ก่อนเริ่มทำระบบ ให้สร้าง channel ทั้งหมดใต้ provider ของร้านเอง แล้วเชิญผู้พัฒนาเป็นสมาชิก วิธีนี้ร้านเป็นเจ้าของข้อมูลลูกค้าเสมอ

ปัญหาที่เจอบ่อย

  • getProfile reject — เรียกก่อน init เสร็จ หรือไม่ได้เปิด scope profile
  • getIDToken คืนค่า null — ไม่ได้เปิด scope openid หรือ init ยังไม่เสร็จ
  • ส่ง push ไม่ได้ — provider ไม่ตรงกัน หรือลูกค้ายังไม่ได้เพิ่มเพื่อน LINE OA (ตั้ง "add friend option" ของ LINE Login channel ให้ชวนเพิ่มเพื่อนตอนล็อกอิน)
  • init ล้ม — ดู แก้ liff.init error

ใช้ในระบบจองอย่างไร

userId คือกุญแจของระบบจองผ่าน LINE ทั้งระบบ ใช้ผูกการจองกับลูกค้า ส่งข้อความยืนยันและเตือนก่อนนัด และจำลูกค้าเก่าได้โดยไม่ต้องกรอกเบอร์โทรซ้ำ ดูภาพรวมได้ที่ ระบบจองคิวผ่าน LINE OA

อ้างอิง: LIFF API reference ของ LINE Developers ฉบับภาษาอังกฤษ: LIFF getProfile and userId

คำถามที่พบบ่อย

ดึง userId ใน LIFF อย่างไร?

เรียก liff.init({ liffId }) ให้เสร็จก่อน แล้วเรียก liff.getProfile() จะได้ userId, displayName, pictureUrl และ statusMessage โดยต้องเปิด scope profile ให้ LIFF app ใน LINE Developers Console

ส่ง userId จากหน้า LIFF ไปเก็บที่ server ได้เลยไหม?

ไม่ควร ค่าที่มาจากเบราว์เซอร์ปลอมได้ ให้ส่ง ID token จาก liff.getIDToken() ไปที่ server แล้วตรวจกับ https://api.line.me/oauth2/v2.1/verify ใช้ค่า sub ที่ตรวจแล้วเป็น userId

ทำไม userId จาก LIFF ส่งข้อความหาลูกค้าผ่าน LINE OA ไม่ได้?

สาเหตุที่พบบ่อยที่สุดคือ LIFF app กับ LINE OA อยู่คนละ provider userId ของคนเดียวกันจะต่างกันเมื่ออยู่คนละ provider อีกสาเหตุคือลูกค้ายังไม่ได้เพิ่ม LINE OA เป็นเพื่อน หรือบล็อกไปแล้ว

userId กับ LINE ID ต่างกันอย่างไร?

userId เป็นรหัสภายในขึ้นต้นด้วย U ตามด้วยอักขระ 32 ตัว ใช้ในระบบเท่านั้น ส่วน LINE ID คือชื่อที่คนใช้ค้นหาเพื่อนในแอป เอา userId ไปค้นหาในแอป LINE ไม่ได้

อยากให้ระบบนี้ทำงานให้ธุรกิจของคุณ?

เราสร้างและดูแลระบบแบบเดียวกันบนเว็บไซต์ธุรกิจจริง 16 แห่งของเราเอง เล่าเรื่องธุรกิจของคุณให้เราฟัง เราตอบกลับภายใน 24 ชั่วโมง