概述收藏我的收藏
收藏
我的收藏用户授权
webhook 是用户事件触发反向通知的机制,所以首先确保用户已经授权了该事件对应的 scope
回调地址校验
在「控制台-设置-开发配置-Webhooks」中填写你要配置的请求网址。完成请求网址编辑后,点击保存按钮时,开放平台会向你配置的网址推送一个 application/json 格式的 POST 请求, 该请求用于验证你配置的网址的合法性。 通过开放平台验证的请求网址才能配置成功,请求网址配置成功后,你才可以进一步订阅你的应用关心的事件。
开放平台发送的验证请求示例:
{ "event": "verify_webhook", "client_key": "", "content": { "challenge": 12345 } }
当你收到开放平台 POST 验证请求时,你需要解析出 challenge 值,并立即返回该 challenge 值作为响应。
需要注意:返回内容需要放入 ResponseBody 里,不能直接返回;并且返回内容为 text 格式的 json 数据。
{ "challenge": 12345 }
事件订阅
如果开发者服务器长时间未响应事件推送请求,可能会取消开发者的订阅状态,开发者需重新订阅
重试机制
抖音服务器会 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) }