抖音开放平台Logo
开发者文档
控制台

概述
收藏
我的收藏

用户授权​

webhook 是用户事件触发反向通知的机制,所以首先确保用户已经授权了该事件对应的 scope

回调地址校验​

在「控制台-设置-开发配置-Webhooks」中填写你要配置的请求网址。完成请求网址编辑后,点击保存按钮时,开放平台会向你配置的网址推送一个 application/json 格式的 POST 请求, 该请求用于验证你配置的网址的合法性。 通过开放平台验证的请求网址才能配置成功,请求网址配置成功后,你才可以进一步订阅你的应用关心的事件。​
开放平台发送的验证请求示例:​
{ "event": "verify_webhook", "client_key": "", "content": { "challenge": 12345 } }
当你收到开放平台 POST 验证请求时,你需要解析出 challenge 值,并立即返回该 challenge 值作为响应。​
需要注意:返回内容需要放入 ResponseBody 里,不能直接返回;并且返回内容为 text 格式的 json 数据。​
{ "challenge": 12345 }

事件订阅​

开发者可通过「控制台-设置-开发配置-Webhooks」或事件管理 openapi订阅需要通知的事件,注意:需要在管理中心打开该事件的订阅才可收到通知。​
如果开发者服务器长时间未响应事件推送请求,可能会取消开发者的订阅状态,开发者需重新订阅​

重试机制​

抖音服务器会 POST 消息到开发者的 Callback 域名,连接超过 5s 会自动断开,共重试 3 次​
用户可通过请求头中的 Msg-Id 进行去重​

消息来源验证​

用户可通过请求 header 中的 X-Douyin-Signature 字段判断该消息是否来自抖音开放平台。 抖音服务端会将应用的(client secret + 消息体)使用 sha1 哈希作为 X-Douyin-Signature header 的 value。您可以自行使用 client secret 和收到的消息体进行 sha1 哈希,与该请求头进行比对。​
以下是 go 语言实现生成签名的一个例子:​
import ( "crypto/sha1" "fmt" ) func Demo() string { body := "{\"event\":\"verify_webhook\",\"client_key\":\"abc\",\"content\":{\"challenge\":12345}}" // 接收到的完整请求体 clientSecret := "***" // 替换成自己的 client_secret return sign(clientSecret, []byte(body)) } func sign(clientSecret string, body []byte) string { h := sha1.New() h.Write([]byte(clientSecret)) h.Write(body) bs := h.Sum(nil) return fmt.Sprintf("%x", bs) }