集成

Webhooks (字符串)

文本由 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. 集成页面,向下滚动到Webhook并点击配置

    Webhook页面打开。

  2. 点击添加Webhook

    添加Webhook窗口打开。

  3. 提供Webhook详细信息。

  4. 可选地包含分支

  5. 点击保存。指定的Webhook已添加到Webhook页面的列表中。

可以从特定Webhook的更多菜单中停用Webhook。

测试一个Webhook

要测试一个Webhook:

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

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

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

使用Webhook数据

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

响应头

发送到回调 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": "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.