บันทึกเทคนิคของ zhaoJian

WeChat Official Account ฟิลด์ notes ใน Template Message ไม่แสดง — การตรวจสอบและวิธีแก้ไข

เทคโนโลยี ~4193 คำ · อ่าน 11 นาที - ครั้งที่อ่าน

ปัญหา

ขณะส่ง Template Message จากบัญชีทดสอบ (sandbox) ของ WeChat Official Account ผมเจอเหตุการณ์แปลก ๆ คือเทมเพลตกำหนดไว้ 6 ฟิลด์ แต่ฟิลด์ notes (หมายเหตุ) ไม่แสดงเลย ส่วนอีก 5 ฟิลด์แสดงปกติ

เนื้อหาเทมเพลต:

ชื่อ: {{name.DATA}}
โทรศัพท์: {{phone.DATA}}
เวลา: {{time.DATA}}
บริการ: {{services.DATA}}
พนักงาน: {{staff.DATA}}
หมายเหตุ: {{notes.DATA}}

API ส่งสำเร็จ (errcode = 0) แต่ในข้อความ WeChat จริงแสดงเพียง 5 บรรทัดแรก บรรทัดหมายเหตุหายไปทั้งบรรทัด รวมถึงป้ายชื่อ “หมายเหตุ” ด้วย

ขั้นตอนการตรวจสอบ

1. ตัดประเด็นจำนวนฟิลด์

สมมติฐานแรก: บัญชี sandbox จำกัดฟิลด์ไม่เกิน 5 ฟิลด์ ทดสอบ:

  • ลบฟิลด์ “พนักงาน” ส่งแค่ 5 ฟิลด์ → notes ยังไม่แสดง
  • เพิ่มจนเป็น 9 ฟิลด์ → ทุกฟิลด์ รวมถึง notes แสดงครบ

สรุป: ไม่ใช่เพราะจำนวนฟิลด์

2. ตัดประเด็นความยาวอักขระ

ตามเอกสารทางการ Template Message จำกัด 1 บรรทัดไม่เกิน 20 อักขระ และรวมไม่เกิน 200 อักขระ ข้อมูลทดสอบของผมต่ำกว่ามาก

สรุป: ไม่ใช่เรื่องความยาว

3. พบรูปแบบที่ชัดเจน

หลังทดสอบหลายรอบเจอรูปแบบชัดเจน:

จำนวนฟิลด์ตำแหน่งของ notesnotes แสดงไหม?
6 ฟิลด์บรรทัดสุดท้ายไม่แสดง
9 ฟิลด์ลำดับที่ 6 (ไม่ใช่สุดท้าย)แสดง
7 ฟิลด์ลำดับที่ 6 (ไม่ใช่สุดท้าย)แสดง

สรุป: ตราบใดที่ notes เป็นบรรทัดสุดท้ายของเทมเพลต ก็จะหายไป ถ้ามีฟิลด์อื่นต่อท้าย ก็แสดงปกติ

4. ทดสอบชื่อฟิลด์

คงให้ notes อยู่บรรทัดสุดท้าย เปลี่ยนเฉพาะชื่อ:

ชื่อฟิลด์แสดงไหม?
notesไม่แสดง
remarkไม่แสดง
infoแสดง
messageแสดง

notes และ remark หายทั้งคู่ ส่วน info, message แสดงตามปกติ

วิเคราะห์สาเหตุ

API Template Message ของ WeChat Official Account เดิมรองรับพารามิเตอร์ remark ระดับบนสุด ที่จะถูกเรนเดอร์เป็น “หมายเหตุ” ที่ท้ายข้อความ แต่เมื่อ 30 มีนาคม 2566 (2023) WeChat ประกาศว่า:

Template Message จะไม่แสดงฟิลด์ remark อีกต่อไป

การยกเลิกครั้งนั้นไม่ได้กระทบเฉพาะพารามิเตอร์ remark ระดับบนสุดเท่านั้น WeChat ยังทำการจับคู่ความหมายกับ ชื่อฟิลด์ เช่น notes และ remark ด้วย — เมื่อชื่อแบบนี้ปรากฏเป็นฟิลด์ สุดท้าย ของเทมเพลต มันจะถูกตัดทิ้งเงียบ ๆ ผ่านเส้นทางความเข้ากันได้กับ remark เดิม

สรุปสั้น ๆ:

  • notes และ remark เป็นชื่อฟิลด์สงวนใน Template Message ของ WeChat
  • ถ้าวางไว้ตำแหน่งสุดท้าย จะเข้าเส้น compat ของ remark เก่า และถูกลบทิ้งโดยไม่มีคำเตือน
  • ย้ายไปตำแหน่งอื่น หรือเปลี่ยนชื่อ ก็แสดงปกติ

วิธีแก้

วิธีที่ 1: เปลี่ยนชื่อฟิลด์ (แนะนำ)

ทางออกที่สะอาดที่สุด: เปลี่ยน notes เป็นชื่อนอกชุดสงวน เช่น message, info, desc ฯลฯ

ชื่อ: {{name.DATA}}
โทรศัพท์: {{phone.DATA}}
เวลา: {{time.DATA}}
บริการ: {{services.DATA}}
พนักงาน: {{staff.DATA}}
ข้อความ: {{message.DATA}}

วิธีที่ 2: เพิ่มฟิลด์เติมหลัง notes

ถ้าเปลี่ยนชื่อไม่ได้ (เทมเพลตผ่านการตรวจแล้ว ใช้ในระบบโปรดักชันและถูกเรียกจากหลายระบบ) ให้เพิ่มฟิลด์ dummy หลัง notes เพื่อให้มันไม่ใช่บรรทัดสุดท้ายอีกต่อไป:

ชื่อ: {{name.DATA}}
โทรศัพท์: {{phone.DATA}}
เวลา: {{time.DATA}}
บริการ: {{services.DATA}}
พนักงาน: {{staff.DATA}}
หมายเหตุ: {{notes.DATA}}
อื่น ๆ: {{other.DATA}}

ตอนส่ง ฟิลด์ other ใส่สตริงว่างหรือ placeholder ก็พอ

ตัวอย่างปรับโค้ด

ฝั่ง backend เปลี่ยนชื่อฟิลด์จาก notes เป็น message ใน payload:

// สำคัญ: ห้ามใช้ notes เป็นชื่อฟิลด์
// WeChat จะถือว่าเป็นฟิลด์ "remark" ที่ถูกสงวน และจะตัดทิ้งโดยไม่แจ้งเตือน
return {
name,
phone,
time: timeRange,
services,
staff,
message // เดิม: notes
};

สรุป

  1. Template Message ของ WeChat Official Account มีชื่อฟิลด์สงวน ชื่อที่มีความหมายเชิง “หมายเหตุ” เช่น notes, remark ฯลฯ จะถูกตีความเป็นช่องหมายเหตุเก่า และไม่แสดง
  2. นี่คือผลพวงจากการที่ WeChat ยกเลิกการแสดงฟิลด์ remark ใน Template Message เมื่อปี 2023 — ซึ่งไม่ได้บันทึกไว้อย่างเด่นชัดในเอกสาร
  3. วิธีแก้คือเปลี่ยนเป็นชื่อกลาง ๆ เช่น message, info, desc หรือเพิ่มฟิลด์เติมหลัง notes
  4. สำหรับปัญหาแบบ “ไม่มี error แต่ไม่แสดง” การปรับจำนวนฟิลด์ ตำแหน่ง และชื่อทีละตัวแปร มักหาคำตอบเร็วกว่าการพึ่งเอกสาร

เอกสารอ้างอิง

แชร์:

ความคิดเห็น