集成

Webhooks (Strings)

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

可用于

  • 团队、专业、商业、企业和软件 UI/UX 计划

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

Webhooks 通知外部服务,如聊天客户端或其他外部 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 的更多菜单中停用 webhook。

测试 Webhook

要测试 webhook:

  • Webhooks页面,选择一个 webhook 并从发送测试通知中选择更多菜单。

    会显示一条通知,指示测试成功。

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

使用 Webhook 数据

每当指定类型的事件发生时,都会向指定的回调 URL 发送一个 POST 请求。请求的 POST 负载是一个 JSON 编码的文档,包含与事件相关的数据。属性eventmessagesent_at将始终包含,以及与事件相关的其他属性,如 webhook 被触发的用户项目分支

响应头

发送到回调 URL 的 HTTP 请求将包含几个特殊头。

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

  • X-PhraseApp-Signature:使用钩子的秘钥对有效负载进行 HMAC 十六进制摘要。

例如:

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":"首席开发者",
    "created_at":"2015-01-28T09:52:53Z",
    "updated_at":"2015-01-28T09:52:53Z"
  },
  "project": {
    "id": "abcd1234cdef1234abcd1234cdef1234",
    "name":"我的安卓项目",
    "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":"我的翻译",
    "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.