网络钩子是合作伙伴创建的 HTTPS 回调,用于指定代理应如何响应消息和事件。配置网络钩子后,您就可以开始接收消息和事件了。
合作伙伴 webhook 和代理 webhook
您可以在合作伙伴级或代理级配置网络钩子。
- 您的合作伙伴网络钩子适用于您维护的每个代理。如果您的代理具有类似行为,或者您只有一个代理,请使用合作伙伴网络钩子。
- 代理网络钩子适用于各个代理。如果您操作多个具有不同行为的代理,则可以为每个代理设置不同的 webhook。
如果您同时配置了合作伙伴 webhook 和代理 webhook,则代理 webhook 优先于其特定代理,而合作伙伴 webhook 适用于没有自己的 webhook 的任何代理。
配置代理网络钩子
您会在合作伙伴网络钩子中收到发送给代理的消息。如果您希望特定代理的消息到达其他网络钩子,请设置代理网络钩子。
- 打开 Business Communications 开发者控制台,然后使用您的 RBM 合作伙伴 Google 帐号登录。
- 点击您的代理。
- 点击集成。
- 对于网络钩子,点击配置。
- 在网络钩子端点网址部分,输入以“https://”开头的网络钩子网址。
- 记下您的
clientToken
值。您需要使用它来验证您收到的消息是否来自 Google。 将网络钩子配置为接受具有指定
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); });
在 Play 管理中心内,点击验证。RBM 验证您的网络钩子后,该对话框会关闭。
验证收到的邮件
由于网络钩子可以接收来自任何发件人的消息,因此您应该在处理消息内容之前验证 Google 是否发送了传入消息。
要验证 Google 是否向您发送了邮件,请按以下步骤操作:
- 提取消息的
X-Goog-Signature
标头。这是消息正文载荷的经过哈希处理、base64 编码的副本。 - 对请求的
message.body
元素中的 RBM 载荷进行 Base-64 解码。 - 使用 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);