Webhooks 通知外部服务,例如聊天客户端或其他外部 API 事件。当特定事件发生时,webhook 可以设置一个 URL。
重要
文件上传仅触发 uploads:create 和 uploads:processing webhook 事件。
keys:create、keys:update、translations:create 和 translations: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有效负载的结构在一个模式文件中定义,该文件可在https://app.phrase.com/webhook_schemas/<event_underscored_name>.json中找到,其中<event_underscored_name>对应于带下划线的webhook事件名称。
branches:create可以通过https://app.phrase.com/webhook_schemas/branches_create.json访问
|
事件名称 |
说明 |
|---|---|
|
|
已创建一个分支。 |
|
|
已合并一个分支。 |
|
|
在翻译键上添加了一个评论。 |
|
|
多个键中的自定义元数据字段值已更新。 |
|
|
在键级别更新了自定义元数据字段值。 |
|
|
一个工作被标记为完成。 |
|
|
一个工作被创建。 |
|
|
一个工作的区域被标记为完成。 |
|
|
一个工作的区域被重新打开。 |
|
|
一个工作的区域被审校并标记为完成。 |
|
|
一个工作的区域被审校并重新打开。 |
|
|
一个工作被重新打开。 |
|
|
一个工作被开始。 |
|
|
一个工作被更新。 |
|
|
多个键被删除。 |
|
|
一个键被创建。 |
|
|
一个键被删除。 |
|
|
多个键被添加了标记。 |
|
|
一个键被添加了标记。 |
|
|
一个键被重命名或更改。 |
|
|
在一个项目中创建了一个新的语言版本。 |
|
|
一个语言版本被删除。 |
|
|
一个语言版本被更改、重命名或重新配置。 |
|
|
一个项目被更改或重新配置。 |
|
|
一个OTA发布已被创建。 |
|
|
一个OTA版本已被删除。 |
|
|
创建了一个截图。 |
|
|
一个截图已被删除。 |
|
|
一个截图已被更改或重命名。 |
|
|
一个翻译列表已被删除。 |
|
|
一个翻译列表已被包含。 |
|
|
一个翻译列表已被审校。 |
|
|
一个翻译列表未被审校。 |
|
|
一个翻译列表未被验证。 |
|
|
一个翻译列表已被验证。 |
|
|
某种语言版本中的一个键的翻译已被添加。 |
|
|
某种语言版本中的一个键的翻译由语言服务提供商交付。 |
|
|
某种语言版本中的一个键的翻译已被排除。 |
|
|
某种语言版本中的一个键的翻译已被包含。 |
|
|
某种语言版本中的一个键的翻译已被审校。 |
|
|
某种语言版本中的一个键的翻译未被审校。 |
|
|
某种语言版本中的一个键的翻译未被验证。 |
|
|
某种语言版本中的一个键的翻译已被编辑。 |
|
|
某种语言版本中的一个键的翻译已被验证。 |
|
|
区域文件已成功处理。 |
|
|
区域文件正在处理中。 |
要添加一个Webhook,请按照以下步骤操作:
可以从特定Webhook的菜单中停用Webhook。
要测试一个Webhook:
使用像RequestBin这样的服务来捕获Webhook的内容。RequestBin提供一个URL,用于收集请求数据以供检查。
每当发生指定类型的事件时,都会向指定的回调 URL 发送一个 POST 请求。请求的 POST 负载是一个包含事件相关数据的 JSON 编码文档。属性 event、message 和 sent_at 将始终包含在内,以及与事件相关的其他属性,例如触发 webhook 的 user、project 和 branch。
响应头
发送到回调 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"
}
}