Webhook 是合作夥伴建立的 HTTPS 回呼,用於指定代理程式應如何回應訊息和事件。設定 Webhook 後,即可開始接收訊息和事件。
合作夥伴 Webhook 和服務專員 Webhook
您可以在合作夥伴層級或代理程式層級設定 Webhook。
- 合作夥伴 Webhook 會套用至您維護的所有虛擬服務專員。如果您的代理程式具有類似行為,或只有一個代理程式,請使用合作夥伴 Webhook。
- 代理程式 Webhook 適用於個別服務專員。如果您操作的多個代理程式都有不同的行為,可以為每個代理程式設定不同的 Webhook。
如果您同時設定了合作夥伴 Webhook 和代理程式 Webhook,則服務專員 Webhook 會以其特定代理程式為優先,而合作夥伴 Webhook 則適用於沒有自己 Webhook 的任何代理程式。
設定代理程式 Webhook
你會透過合作夥伴 Webhook 接收傳送給服務專員的訊息。如要讓特定代理程式的訊息到達其他 Webhook,請設定代理程式 Webhook。
- 開啟 Business Communications 開發人員控制台,並使用您的 RBM 合作夥伴 Google 帳戶登入。
- 按一下虛擬服務專員。
- 點選 [Integrations] (整合)。
- 在「Webhook」部分,按一下「Configure」。
- 在「Webhook 端點網址」部分,輸入以「https://」開頭的 Webhook 網址。
- 記下
clientToken
值。您必須確認收到的訊息來自 Google。 請將 Webhook 設為接受含有指定
clientToken
參數的POST
要求,並傳送200 OK
回應,並以secret
參數的純文字值做為回應主體。舉例來說,如果您的 Webhook 收到包含下列內文內容的
POST
要求{ "clientToken":"SJENCPGJESMGUFPY", "secret":"1234567890" }
則 Webhook 應確認
clientToken
值,如果clientToken
正確,傳回包含1234567890
的200 OK
回應做為回應主體:// clientToken from Configure const myClientToken = "SJENCPGJESMGUFPY"; // Example endpoint app.post("/rbm-webhook", (req, res) => { const msg = req.body; if (msg.clientToken === myClientToken) { res.status(200).send(msg.secret); return; } res.send(400); });
在 Developer Console 中,按一下「驗證」。RBM 驗證 Webhook 時,對話方塊會關閉。
驗證收到的訊息
由於 Webhook 可以接收來自任何寄件者的訊息,因此在處理訊息內容之前,您應確認 Google 已傳送傳入的訊息。
如要驗證 Google 是否傳送了您收到的訊息,請按照下列步驟操作:
- 擷取郵件的
X-Goog-Signature
標頭。這是訊息內文酬載的雜湊碼,採用 Base64 編碼。 - 在要求的
message.body
元素中透過 Base-64 解碼 RBM 酬載。 - 使用 Webhook 的用戶端憑證 (您在設定 Webhook 時指定) 做為金鑰,建立由 Base-64 解碼訊息酬載的位元組 SHA512 HMAC,以及使用 Base64 編碼的結果。
- 比較
X-Goog-Signature
雜湊和您建立的雜湊。- 如果雜湊值相符,表示您已確認 Google 已傳送該訊息。
如果雜湊不相符,請查看已知良好訊息中的雜湊程序。
如果雜湊程序正常運作,且收到您認為詐騙訊息,請與我們聯絡。
Node.js
if ((requestBody.hasOwnProperty('message')) && (requestBody.message.hasOwnProperty('data'))) { // Validate the received hash to ensure the message came from Google RBM let userEventString = Buffer.from(requestBody.message.data, 'base64'); let hmac = crypto.createHmac('sha512', CLIENT_TOKEN); let data = hmac.update(userEventString); let genHash = data.digest('base64'); let headerHash = req.header('X-Goog-Signature'); if (headerHash === genHash) { let userEvent = JSON.parse(userEventString); console.log('userEventString: ' + userEventString); handleMessage(userEvent); } else { console.log('hash mismatch - ignoring message'); } } res.sendStatus(200);