← 所有文章
指南

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_idtext 則可選。普通 Webhook 確認不能代替它。

如果問題是將 Bot API 方法放入 Webhook 回應內容,還是另發請求,請參閱 Webhook 回應內容與獨立 API 請求的分別。那是呼叫方式的選擇;本文處理的是按鈕互動沒有獲得回應的問題。

找出出錯的環節

處理器完全收不到回調

檢查收到的更新類型,不要只搜尋普通訊息紀錄。確認分發邏輯會處理 callback_query,以及明確設定的 allowed_updates 有沒有包含它。Telegram 說明,省略 allowed_updates 會沿用之前設定,因此後續設定請求不傳這個參數,不代表已重設篩選條件。

如果整個更新都未送達,請按 getWebhookInfo 投遞診斷指南檢查。投遞失敗與應用程式忽略回調,需要不同的修復方法。

回調已收到,但按鈕仍在載入

以實際收到的更新核對欄位:

輸入欄位用途
callback_query.id傳入 answerCallbackQuerycallback_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

UnifyPort API

令訊息接入變成一條穩定嘅產品管線。

先用統一嘅 API 跑通發送,再用標準事件將所有入站訊息接返去業務系統。