Webhook

网络钩子是合作伙伴创建的 HTTPS 回调,用于指定您的代理 响应消息和事件。配置 webhook 后,您可以 开始接收消息事件

合作伙伴网络钩子和代理网络钩子

您可以在合作伙伴级别或客服人员级别配置网络钩子 。

如果您同时配置了合作伙伴网络钩子和代理网络钩子,则代理 网络钩子优先于其特定代理,而合作伙伴网络钩子 适用于没有专属网络钩子的任何代理。

配置代理 webhook

您会在合作伙伴网络钩子处收到发送给客服人员的消息。如果您想 让特定代理到达其他网络钩子, 代理 Webhook。

  1. 打开 Business Communications 开发者控制台 并使用您的 RBM 合作伙伴 Google 账号登录。
  2. 点击您的代理。
  3. 点击集成
  4. 对于网络钩子,点击配置
  5. 网络钩子端点网址部分,输入以 “https://”。
  6. 记下您的 clientToken 值。您需要具备 验证您收到的消息是否来自 Google
  7. 配置 webhook,以接受带有指定POST clientToken 参数,并发送包含纯文本值的 200 OK 响应 secret 参数作为响应正文。

    例如,如果您的 webhook 收到具有以下正文内容的 POST 请求

    {
      "clientToken":"SJENCPGJESMGUFPY",
      "secret":"1234567890"
    }
    

    那么您的网络钩子应确认 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);
    });
    
  8. 在 Developer Console 中,点击验证。当 RBM 验证您的网络钩子时, 该对话框就会关闭。

验证收到的邮件

由于网络钩子可以接收来自任何发件人的消息,因此您应验证 Google 先发送收到的消息,然后处理消息内容。

要验证 Google 是否向您发送了邮件,请按以下步骤操作:

  1. 提取邮件的 X-Goog-Signature 标头。这是一个经过哈希处理、 消息正文载荷的 base64 编码副本。
  2. 对请求的 message.body 元素中的 RBM 载荷进行 Base-64 解码。
  3. 使用网络钩子的客户端令牌(您在设置自己的 webhook)作为密钥,创建字节的 SHA512 HMAC 并对结果进行 base64 编码。
  4. 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);
  

消息处理

从网络钩子返回 200 OK 以外的任何内容都会被视为传送 失败。

开发者必须注意,以高速率发送消息 以高速率生成 webhook 通知,并且必须将其代码设计为 确保它们能够以预期速率使用通知。请务必注意 开发者会考虑可能导致故障响应的情况, 来自其网络容器的 500 响应、超时或上游故障。事物 包括:

  • 确保您的 DDoS 防护配置为可处理预期的 网络钩子通知的速率
  • 确保数据库连接池等资源不会用尽, 导致出现超时或 500 响应。

递送失败时的行为

当 RBM 收到一个不同的响应时, 通过 webhook 调用调用 200 OK。RBM 会在 重试次数上限为 600 秒。停用将持续 7 天, 之后消息将被丢弃。

代理级 webhook 的影响

RBM 将合作伙伴的消息加入一个队列。合作伙伴在哪些国家/地区使用 需要注意的是,一个 Webhook 一旦发生故障, webhook 将影响传送到其他 webhook。属于 代理在发送失败消息的退避期间会得到调用,但 失败的消息会排入队列等待重试,整体传送速率会下降,而其他 都会受到影响

开发者必须据此了解此模型和代码,因为 接受消息并将其排队等待处理 最大限度地减少返回失败的可能性。

后续步骤

配置网络钩子后,代理可以 接收消息 来自您的 测试设备发送消息 验证您的设置。