Telegram 內聯按鈕一直載入?檢查 answerCallbackQuery
Telegram 內聯回調按鈕一直載入時,先檢查機械人有沒有為收到的 callback_query 呼叫 answerCallbackQuery。Webhook 回傳 HTTP 200,不等於已完成這次呼叫。Telegram 要求回應回調查詢,即使不需要顯示通知文字也一樣。應盡快確認互動,另外追蹤耗時業務的執行結果。
重點
- 回調按鈕產生的是
callback_query,不是普通文字訊息;只處理訊息的程式可能忽略它。 - 將查詢的
id傳入callback_query_id,不要改用訊息、對話或更新識別碼。 - 通知文字並非必填,不顯示文字也可以回應。
- 載入提示消失,不代表付款、審批或客服操作已完成。
為何載入中的按鈕需要 answerCallbackQuery
Telegram Bot API 官方文件區分回調按鈕與 URL 按鈕:callback_data 會透過回調查詢傳給機械人,URL 按鈕則開啟指定連結。排查前先確認自己建立的是哪一種。
回調互動涉及三種不同結果:
| 結果 | 確認依據 | 不能證明甚麼 |
|---|---|---|
| Webhook 投遞已確認 | 接收端回傳成功 HTTP 狀態 | 回調查詢已獲回應 |
| 按鈕互動已回應 | 對該查詢呼叫 answerCallbackQuery | 業務操作已成功 |
| 業務操作已完成 | 應用程式提交的實際結果 | 只收到或回應點擊並不足夠 |
官方文件說明,answerCallbackQuery 可以顯示通知或提示視窗,成功時回傳 True。必填參數是 callback_query_id,text 則可選。普通 Webhook 確認不能代替它。
如果問題是將 Bot API 方法放入 Webhook 回應內容,還是另發請求,請參閱 Webhook 回應內容與獨立 API 請求的分別。那是呼叫方式的選擇;本文處理的是按鈕互動沒有獲得回應的問題。
找出出錯的環節
處理器完全收不到回調
檢查收到的更新類型,不要只搜尋普通訊息紀錄。確認分發邏輯會處理 callback_query,以及明確設定的 allowed_updates 有沒有包含它。Telegram 說明,省略 allowed_updates 會沿用之前設定,因此後續設定請求不傳這個參數,不代表已重設篩選條件。
如果整個更新都未送達,請按 getWebhookInfo 投遞診斷指南檢查。投遞失敗與應用程式忽略回調,需要不同的修復方法。
回調已收到,但按鈕仍在載入
以實際收到的更新核對欄位:
| 輸入欄位 | 用途 |
|---|---|
callback_query.id | 傳入 answerCallbackQuery 的 callback_query_id |
callback_query.data | 存在時當作應用程式輸入解析 |
callback_query.message | 存在時提供訊息上下文,不可假定每次都有 |
callback_query.inline_message_id | 存在時識別透過內聯模式傳送的訊息 |
Telegram 對普通機械人訊息與內聯模式訊息提供不同上下文。如果程式一律直接存取 callback_query.message.chat,可能未回應查詢就已出錯。
需要確認結果時,獨立發出 answerCallbackQuery 請求。記錄真實成功或錯誤,不要洩露機械人 token。不要等 AI、CRM 或其他耗時服務完成,才給按鈕互動回饋。
載入結束,但業務操作不正確
回調資料是輸入,不是權限憑證。Telegram 提醒,產生查詢的訊息可能已不包含帶有該資料的按鈕。建議檢查允許的動作、用戶權限,以及伺服器上的最新物件狀態。
以一個假設的審批流程為例:回應點擊不應直接將申請標示為通過。驗證請求後,只執行一次合法狀態轉換,再另外顯示實際結果。對重複投遞做去重,同時以業務狀態防止重複點擊造成重複執行;兩者並非同一問題。
驗收互動流程,不只是 Webhook
推出前應覆蓋以下情況:
- 合法回調即使沒有通知文字,仍能獲得回應。
- 耗時工作不會阻塞互動回應。
- 缺少
message不會令回調處理器出錯。 - 未知或過時的回調資料不會觸發未授權操作。
- 重複投遞或重複點擊不會重做不可撤銷的操作。
這是建議的驗收清單,不是已完成的測試結果,也不是 Telegram 的回應時間保證。
UnifyPort 的適用範圍
機械人內聯鍵盤及回調回應應繼續使用 Telegram 官方 Bot API。UnifyPort 的非官方介面用於已連接的訊息帳戶,採用另一套標準化事件契約。公開的 Webhook 事件目錄包含 message.received,但沒有記載 callback_query 事件或 answerCallbackQuery 操作。不要將訊息事件改名當作回調,也不要假定統一 Webhook 能替機械人回應按鈕。
如果同時需要帳戶層級的訊息接收,應將其接收端與機械人互動處理器分開。UnifyPort 的投遞文件說明回應內容會被丟棄;在其中回傳 Bot API 方法 JSON,不會執行回調回應。
常見問題
HTTP 200 能令 Telegram 按鈕停止載入嗎?
單獨回傳狀態碼不可以。回調需要 answerCallbackQuery,HTTP 確認只處理更新投遞。
answerCallbackQuery 必須附上文字嗎?
不需要。text 是可選參數,可以不顯示通知文字。
callback_query_id 應填訊息 ID 嗎?
不是,應使用收到的 CallbackQuery 物件的 id。
統一訊息 Webhook 能代替這個處理器嗎?
UnifyPort 現有的公開契約沒有提供這項能力。回調處理應留在官方 Telegram 機械人整合中。
下一步與來源
進行一次受控的按鈕點擊,追蹤 callback_query 接收紀錄與實際 answerCallbackQuery 結果。如果也需要帳戶層級的訊息接收,請先閱讀標準 Webhook 事件契約,再決定哪些應用邏輯可以共用。
官方來源核對日期:2026-09-22。Telegram Bot API:CallbackQuery、answerCallbackQuery、InlineKeyboardButton 與 allowed_updates。
令訊息接入變成一條穩定嘅產品管線。
先用統一嘅 API 跑通發送,再用標準事件將所有入站訊息接返去業務系統。