配置回调地址
- 登录控制台。
- 在首页打开“应用信息”中的“安全与回调配置”。
- 填写你的服务端 HTTPS 回调地址并保存。
- 确保该地址可从公网访问,并能在 6 秒内完成验签和返回确认响应。
APP_SECRET,之后的首次投递和失败重试都会立即使用新密钥生成签名。发布新密钥时应先让接收端在短暂切换期内识别新旧两把密钥,再移除旧密钥,避免重试中的事件验签失败。
注意
回调地址必须由你的服务端处理。不要使用需要浏览器 Cookie 的页面,也不要把 APP_SECRET 写入 URL、日志或错误信息。
平台发送的请求
平台使用POST 发送 JSON,并附带以下请求头:
Webhook 请求体
验证签名
签名原文由请求头中的事件 ID、换行符和秒级时间戳组成:X-Webhook-Event-Id与 JSONevent_id完全一致。- 使用常量时间比较校验签名,避免普通字符串比较造成时序泄漏。
- 时间戳与服务器当前时间的差值在你的安全窗口内,例如 5 分钟。
event_id未被成功处理过;重复事件直接返回成功确认,不再重复执行副作用。
返回确认响应
验签并安全接收后,请在 6 秒内返回 HTTP 2xx 和以下 JSON:success 和 code,且 success=true、code=200 时才算投递成功。204 No Content、空响应、非 JSON、success=false 或其他业务码都会进入重试。
建议 推荐先完成验签与幂等落库,再立即返回确认;耗时业务交给你自己的队列异步处理,避免超过 6 秒。
重试与幂等
平台最多尝试 5 次。首次立即发送,失败后的重试间隔约为 10、20、40、80 秒。网络异常、超时、非 2xx、无效 JSON 或确认字段不符合要求都会触发重试。 接收端应以event_id 建立唯一约束。出现重复投递时:
- 不再次创建订单、发消息或执行其他副作用。
- 如果此前已成功接收,仍返回
{ "success": true, "code": 200 }。 - 仅记录事件 ID、事件类型和处理状态;不要记录
APP_SECRET或完整签名。
上线检查
- 回调地址为可公开访问的 HTTPS 地址。
- 读取原始请求头后先做时间窗、事件 ID 和签名校验。
- 使用数据库唯一键或同等机制保证
event_id幂等。 - 6 秒内返回 HTTP 2xx 与正确 JSON 确认。
- 将真正业务处理放入异步队列。
- 对验签失败、重复事件和处理失败设置可观测告警,但不记录密钥。