直接從 LINE 輸入「我最近睡得好嗎?」,LINE 要怎麼把使用者的訊息傳送到我的 Java Backend?接下來要來了解 LINE Messaging API,了解 LINE、Webhook 和目前的 Java Backend 是怎麼連接在一起的。
Messaging API 是 LINE 所提供的 API,可以讓 Backend 與 LINE 官方帳號之間交換訊息。當使用者傳送訊息時,LINE Platform 可以透過 Webhook 將 Event 傳送到 Backend;而 Backend 處理完成後,也可以透過 Messaging API 將結果回覆給使用者。
其中還會使用到兩個重要的資訊:
-Channel Access Token
是 Backend 呼叫 LINE Messaging API 時使用的通行證。舉例來說當 Backend 將分析結果回覆給使用者,就需要在 Request 中帶上 Access Token,讓 LINE Platform 可以確認這個 Backend 是否有權發送訊息。所以 Access Token 也需要像前面提到的 API 密碼透過環境變數取得,不然上傳到 GitHub 時可能被外洩。
-Channel Secret
當 LINE 平台發送 Webhook Request 時,Request Header 中會包含 x-line-signature。可以透過 Channel Secret 來驗證 Request Body 的簽章,確認收到的 Webhook Request 的確來自 LINE 且內容沒有在傳輸過程中被惡意竄改。
我目前的 Webhook Endpoint 在本地端:http://localhost:8081/webhook ,然而 LINE 平台是外部服務,它無法透過 localhost 找到我電腦裡的 Server。所以 LINE 需要一個從可以連線的 HTTPS Webhook URL。這裡可以使用像 ngrok 這類 Tunnel 工具,先建立一個公開的 HTTPS URL,將外部傳來的 Request 轉送到本機的 localhost:8081。這樣 LINE Platform 就可以將 Request 先傳到 ngrok 的公開 HTTPS URL,再由 ngrok 轉送至本機的 Java Server。
當使用者傳送 LINE 訊息後,LINE 並不是只把文字本身傳給 Backend,而是將這次發生的 Event 包裝成 JSON Payload,再 POST 到設定好的 Webhook URL。
使用 ngrok 建立 Tunnel:
LINE Official Account建立:
完成設定後,直接從 LINE Official Account 傳送一則訊息。這時 LINE Platform 會產生 Webhook Event,並透過剛才設定的 URL 發送到 Java Backend。
JAVA 接收成功:
回到 Java Console 後,可以看到 WebhookHandler 成功收到 LINE Platform 傳來的 Request Body。