集成

webhook (Strings)

文本由 Phrase Language AI 从英语机器翻译而得。

可用于

  • Team、Professional、Business、Enterprise 和 Software UI/UX 计划

关于许可问题,请联系销售团队

webhook 会将事件通知给聊天客户端或其他外部 API 等外部服务。当特定事件发生时,webhook 可以设置一个 URL。

重要

文件上传仅触发 uploads:createuploads:processing webhook 事件。

keys:createkeys:updatetranslations:createtranslations:update webhook 事件不会由文件上传或通过以下方式进行的自动导入触发:

webhook 历史记录的保留期为 30 天。

webhook 响应

webhook 端点必须在收到回调后的 5 秒内返回 200–299 范围内的 HTTP 状态代码。其他状态代码和请求超时将被视为发送失败。如果连续超过 10 个事件发送失败,webhook 将被停用。回调不会重复。

如果收到回调,请在 5 秒的请求超时期限内做出响应。为确保应用程序不会意外触发超时,请在发送 HTTP 响应后再进行处理。

webhook 请求完整性

每个 webhook 请求都包含一个 X-PhraseApp-Signature 标头,该标头是使用 webhook 验证令牌作为密钥以及请求中发送的数据生成的。通过计算请求主体的 HMAC 摘要并将其与 X-PhraseApp-Signature 标头中的值进行比较,来验证请求来源。

示例:

Ruby

def verify_webhook(signatureheader)
  digest = OpenSSL::Digest::Digest.new('sha256')
  hmac = OpenSSL::HMAC.digest(digest, VERIFICATION_TOKEN, request.body)
  hmac = Base64.encode64(hmac).strip
  hmac == signatureheader
end

PHP

function verify_webhook($signatureheader){
  $hmac = hash_hmac('sha256', $requestBody, $verificationToken, true);
  $hmac = trim(base64_encode($hash));
  return $hmac == $signatureheader;
}

webhook 事件

每个 webhook 有效负载的结构定义在架构文件中,该文件位于 https://app.phrase.com/webhook_schemas/<event_underscored_name>.json,其中 <event_underscored_name> 对应于带有下划线的 webhook 事件名称。

事件名称

说明

branches:create

分支已创建。

branches:merge

分支已合并。

comments:create

已添加翻译键的备注。

custom_metadata_values:batch_update

自定义元数据字段值已在多个键中更新。

custom_metadata_values:update

自定义元数据字段值已在键级别更新。

jobs:complete

工作已被标记为完成。

jobs:create

工作已创建。

jobs:locale:complete

工作的区域已被标记为完成。

jobs:locale:reopened

工作的区域已被重新打开。

jobs:locale:review:complete

工作的区域已审校并标记为完成。

jobs:locale:review:reopen

工作的区域已审校并重新打开。

jobs:reopened

工作已被重新打开。

jobs:start

工作已开始。

jobs:update

工作已更新。

keys:batch_delete

多个键已被删除。

keys:create

已创建键。

keys:delete

已删除键。

keys:tags:batch_create

已向多个键添加标记。

keys:tags:create

已向键添加标记。

keys:update

已重命名或更改键。

locales:create

已在项目中创建新的语言版本。

locales:delete

已删除语言版本。

locales:update

已更改、重命名或重新配置语言版本。

project:update

已更改或重新配置项目。

releases:create

已创建 OTA 版本。

releases:delete

已删除 OTA 版本。

screenshots:create

已创建屏幕截图。

screenshots:delete

已删除屏幕截图。

screenshots:update

已更改或重命名屏幕截图。

translations:batch_delete

已删除翻译列表。

translations:batch_include

已包含翻译列表。

translations:batch_review

已审校翻译列表。

translations:batch_unreview

翻译列表已取消审校。

translations:batch_unverify

翻译列表已设为未验证。

translations:batch_verify

翻译列表已设为已验证。

translations:create

已添加特定语言版本中某个键的翻译。

translations:deliver

特定语言版本中某个键的翻译已由语言服务商交付。

translations:exclude

特定语言版本中某个键的翻译已被排除。

translations:include

特定语言版本中某个键的翻译已被包含。

translations:review

特定语言版本中某个键的翻译已审校。

translations:unreview

特定语言版本中某个键的翻译未审校。

translations:unverify

特定语言版本中某个键的翻译未验证。

translations:update

特定语言版本中某个键的翻译已编辑。

translations:verify

特定语言版本中某个键的翻译已验证。

uploads:create

区域文件已成功处理。

uploads:processing

区域文件正在处理中。

添加 webhook

要添加 webhook,请按照以下步骤操作:

  1. Integrations 页面中,向下滚动至 Webhooks 并点击 Configure

    Webhooks 页面随即打开。

  2. 点击 添加 webhook

    添加 webhook 窗口随即打开。

  3. 提供 webhook 详细信息。

  4. 可选:包含分支

  5. 点击保存。指定的 webhook 已添加到 Webhooks 页面上的列表。

可以从特定 webhook 的 More 菜单中停用 webhook。

测试 webhook

要测试 webhook:

  • Webhooks 页面中,选择一个 webhook,然后从 More 菜单中选择 Send Test-Notification

    系统会显示一条通知,表明测试成功。

使用 RequestBin 等服务来捕获 webhook 的内容。RequestBin 提供了一个 URL,用于收集请求数据以供检查。

使用 webhook 数据

每当发生指定类型的事件时,都会向指定的 callback URL 发送 POST 请求。请求的 POST 有效负载是一个 JSON 编码的文档,其中包含有关该事件的相关数据。属性 eventmessagesent_at 将始终包含在内,以及与事件相关的其他属性,例如触发 webhook 的 userprojectbranch

响应头

向 callback URL 发出的 HTTP 请求将包含几个特殊的头信息。

  • X-PhraseApp-Event:触发 webhook 的事件类型。

  • X-PhraseApp-Signature:有效负载的 HMAC 十六进制摘要,使用 hook 的密钥作为键。

例如:

Content-Type: application/json
X-PhraseApp-Event: translation:create
X-PhraseApp-Signature: abc123

{
  "event": "translations:create",
  "message": "Peter translated page.help.title in fr.",
  "sent_at": "2015-01-29T09:52:53Z"   
  "user": {
    "id": "abcd1234cdef1234abcd1234cdef1234",
    "username": "joe.doe",
    "name": "Joe Doe",
    "email": "joe@phrase.com",
    "position": "Lead Developer",
    "created_at": "2015-01-28T09:52:53Z",
    "updated_at": "2015-01-28T09:52:53Z"
  },
  "project": {
    "id": "abcd1234cdef1234abcd1234cdef1234",
    "name": "My Android Project",
    "main_format": "xml",
    "project_image_url": "http://assets.phrase.com/project.png",
    "account": "account",
    "created_at": "2015-01-28T09:52:53Z",
    "updated_at": "2015-01-28T09:52:53Z"
  },
  "branch": {
  "name": "branch_name"
  },
  "translation": {
    "id": "abcd1234cdef1234abcd1234cdef1234",
    "content": "My translation",
    "unverified": false,
    "excluded": false,
    "plural_suffix": "",
    "key": {
      "id": "abcd1234cdef1234abcd1234cdef1234",
      "name": "home.index.headline",
      "plural": false
    },
    "locale": {
      "id": "abcd1234cdef1234abcd1234cdef1234",
      "name": "de",
      "code": "de-DE"
    },
    "placeholders": [
      "%{count}"
    ],"
    "created_at": "2015-01-28T09:52:53Z",
    "updated_at": "2015-01-28T09:52:53Z"
  }
}
这篇文章有帮助吗?

Sorry about that! In what way was it not helpful?

The article didn’t address my problem.
I couldn’t understand the article.
The feature doesn’t do what I need.
Other reason.

Note that feedback is provided anonymously so we aren't able to reply to questions.
If you'd like to ask a question, submit a request to our Support team.
Thank you for your feedback.