專案

一般

配置概況

動作

Bug #1383

進行中

[Backend Bug] LINE richmenu「Menu-3」postback 觸發 NullPointerException(CheckUserStatusEventHandler)

是由 陳國瑋11 天 前加入. 於 11 天 前更新.

狀態:
New
優先權:
High
被分派者:
-
開始日期:
2026-07-23
完成日期:
預估工時:

概述

現象

2026-07-23 下午 4 點左右(16:02:05、16:02:06、16:02:08、16:02:13、16:02:16、16:02:42、16:13:46、16:16:36-37、16:17:27),production /opt/hm/api/logs/api.log 出現多次同一模式的例外,皆由使用者點擊 richmenu「Menu-3」(postback tid=richmenu:50263_3, block=b304cae8-06e1-4f09-8daf-3439ff1fd1e9)觸發。

根因(已修正:問題不在 SS3A Framework,而在 OmniChat 轉發格式)

SS3A Framework 的 CheckUserStatusEventHandler.canHandle() 原始設計是正確的:它預期收到的 postback data 是 LINE 官方原生的 key=value query string 格式,這本來就是 LINE Messaging API 對 postback data 的標準處理方式。

真正的問題在於資料流架構:書心診所的 LINE 官方帳號目前只掛了 OmniChat(第三方客服/CRM 系統) 的 webhook URL(LINE 一個官方帳號只能設定一個 webhook URL)。實際資料流是:

LINE Platform --(webhook)--> OmniChat --(forward)--> hm (/callback)

OmniChat 在此扮演 gateway 角色:先接收 LINE 平台原生事件,再轉發給 hm 處理。問題出在這次轉發過程中,OmniChat 把 postback.data 的格式從原本的 query string 轉換成了 JSON

{"action":"bot","block":"b304cae8-06e1-4f09-8daf-3439ff1fd1e9","title":"Menu-3","tid":"richmenu:50263_3"}

導致 hm 收到的資料不符合 CheckUserStatusEventHandler.canHandle()(CheckUserStatusEventHandler.java:39)預期的格式,postBackData.get("pbe") 回傳 null,呼叫 .equals() 觸發 NullPointerException:

java.lang.NullPointerException: Cannot invoke "String.equals(Object)" because the return value of "java.util.Map.get(Object)" is null
	at com.sylksoft.line.bot.handler.user.CheckUserStatusEventHandler.canHandle(CheckUserStatusEventHandler.java:36)
	at com.sylksoft.line.bot.LineEventDispatcher.handlePostBackEvent(LineEventDispatcher.java:217)

此 NPE 被 LineEventDispatcher 的 catch-all 接住,改發送制式訊息「LINE發生錯誤,請連絡客服:,謝謝」,但這則回覆本身也因為 reply token 已失效而送不出去(詳見 #1384),導致使用者點擊按鈕後完全沒有收到任何回應。

結論:

  • ❌ 不是 SS3A Framework 的 bug——canHandle() 對「LINE 平台原生 postback data」的處理方式是對的,不應更動。
  • ✅ 真正原因是 OmniChat 轉發 postback event 時,把格式從 query string 改成了 JSON。

待釐清 / 下一步

  1. 需與 OmniChat 確認:轉發 postback event 時是否有設定可保留原始 query string 格式,或此為 OmniChat 固定行為、無法調整。
  2. 若 OmniChat 無法調整格式,hm 端需要自行相容兩種格式(query string 與 JSON),在進入各 handler 的 canHandle() 之前先正規化 postback data——這是 hm/OmniChat 整合層的責任,不應要求 SS3A framework 改動其對原生事件的假設。
  3. 需確認除了「Menu-3」外,是否還有其他 richmenu 按鈕的 postback 也會經過 OmniChat 轉發而受到相同影響。

影響範圍

所有點擊「Menu-3」這個 richmenu 按鈕的使用者,皆會遇到無回應的狀況。

動作

匯出至 Atom PDF