Webhook 是合作夥伴指定的網址,RBM 平台會將訊息和事件發布到這個網址。 這個網址會做為端點,接收含有事件資料的 HTTPS POST 要求。這表示資料會透過 HTTPS 安全地傳送至應用程式。
Webhook 網址可能如下所示:
https://[your company name].com/api/rbm-events。
設定 Webhook 後,即可開始接收訊息和事件。
合作夥伴 Webhook 和服務專員 Webhook
你可以在合作夥伴層級或服務專員層級設定 Webhook。
- 合作夥伴 Webhook 會套用至您維護的每個代理程式。如果代理程式的行為類似,或只有一個代理程式,請使用合作夥伴 Webhook。
- 服務專員 Webhook 適用於個別服務專員。如果您經營多個行為各異的代理程式,可以為每個代理程式設定不同的 Webhook。
如果您同時設定了合作夥伴 Webhook 和代理程式 Webhook,代理程式 Webhook 會優先套用至特定代理程式,而合作夥伴 Webhook 則會套用至沒有專屬 Webhook 的代理程式。
設定代理程式 Webhook
您會在合作夥伴 Webhook 收到傳送給代理程式的訊息。如要將特定服務專員的訊息傳送至其他 Webhook,請設定服務專員 Webhook。
- 開啟 Business Communications 開發人員控制台,然後使用 RBM 合作夥伴 Google 帳戶登入。
- 按一下代理程式。
- 點選 [Integrations] (整合)。
- 在「Webhook」部分,按一下「設定」。
- 在「Webhook 端點網址」部分,輸入開頭為「https://」的 Webhook 網址。
- 請記下
clientToken值。您需要這項資訊,才能驗證收到的訊息是否來自 Google。 將 Webhook 設為接受含有指定
clientToken參數的POST要求,並傳送200 OK回應,其中secret參數的純文字值會做為回應主體。舉例來說,如果 Webhook 收到
POST要求,且內容如下:{ "clientToken":"SJENCPGJESMGUFPY", "secret":"1234567890" }Webhook 應確認
clientToken值,如果clientToken正確,則傳回200 OK回應,並將1234567890做為回應主體:// 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); });在開發人員控制台中,按一下「驗證」。RBM 驗證 Webhook 後,對話方塊就會關閉。
驗證收到的訊息
由於 Webhook 可以接收任何寄件者的訊息,因此您應先驗證內送訊息是否由 Google 傳送,再處理訊息內容。
如要確認您收到的訊息是否由 Google 傳送,請按照下列步驟操作:
- 擷取郵件的
X-Goog-Signature標頭。這是訊息主體承載內容的雜湊副本,採用 Base64 編碼。 - 對要求
message.body元素中的 RBM 酬載進行 Base64 解碼。 - 使用網路鉤子的用戶端權杖 (您在設定網路鉤子時指定),以 Base64 解碼訊息酬載的位元組建立 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);
訊息處理
如果從 Webhook 傳回的內容不是 200 OK,系統會視為傳送失敗。
開發人員必須注意,以高頻率傳送訊息會產生高頻率的 Webhook 通知,因此必須設計程式碼,以處理預期頻率的通知。開發人員務必考量可能導致失敗回應的情況,包括來自網頁容器的 500 回應、逾時或上游失敗。請考量以下事項:
- 確認 DDoS 防護機制已設定完畢,可處理預期的 Webhook 通知率。
- 確認資料庫連線集區等資源不會用盡,並產生逾時或
500回應。
開發人員應設計系統,讓 RBM 事件的處理作業以非同步方式進行,且不會阻止 Webhook 傳回 200 OK。

請務必不要在 Webhook 本身處理 RBM 事件。處理期間發生任何錯誤或延遲,都可能影響 Webhook 回傳代碼:

傳送失敗時的行為
當 RBM 從 Webhook 呼叫收到 200 OK 以外的回應時,會使用退避和重試機制。RBM 會增加重試之間的等待時間,最長可達 600 秒。系統會持續重試 7 天,之後就會捨棄郵件。
服務專員層級 Webhook 的影響
RBM 會將合作夥伴的訊息排入一個佇列。如果合作夥伴使用代理商層級的 Webhook,請務必注意,一個 Webhook 失敗會影響其他 Webhook 的傳送。在訊息失敗的回退期間,系統會呼叫其他代理程式的 Webhook。不過,由於系統會將傳送失敗的訊息排入佇列並重試,整體傳送率會下降,其他代理程式也會受到影響。
開發人員務必瞭解這個模型,並據此編寫程式碼,盡可能接受訊息並排入處理佇列,以減少傳回失敗的機會。