跳转到主要内容
Webhook 事件系统正在持续完善中。本文档展示的事件类型和签名格式为推荐实现模式,具体以平台发布的最新文档为准。

你将构建什么

本教程将带你构建一个 Webhook 接收服务,安全地接收并处理袋袋平台推送的实时事件。你将实现签名验证、事件分发、幂等处理和异步消费的完整流程。

Webhook 事件类型

每个 Webhook 请求的 JSON 结构:

前置条件

袋袋 App

已在袋袋 Studio 创建 App,获取 Client ID

Webhook URL

在 Studio 配置了可公网访问的 Webhook 接收地址

Webhook Secret

在 Studio 获取 Webhook 签名密钥(用于验证请求来源)

Step 1: 注册 Webhook URL

在袋袋 Studio 中完成 Webhook 配置:
  1. 进入 App 管理 → 选择你的 App → Webhook 设置
  2. 填写你的 Webhook 接收地址(如 https://your-app.com/api/webhook
  3. 选择需要订阅的事件类型
  4. 保存后复制自动生成的 Webhook Secret
.env
Webhook Secret 是验证请求来源的唯一凭据。请妥善保管,不要提交到版本控制或暴露给客户端。

Step 2: 创建 Webhook 接收端点

先返回 200,再异步处理。袋袋平台在超时未收到响应时会触发重试,快速应答可避免重复投递。

Step 3: 验证签名

袋袋使用 HMAC-SHA256 对请求 body 签名,签名值通过 X-Profy-Signature header 传递。格式为 sha256=<hex_digest>
必须使用 timingSafeEqual(Node)或 hmac.compare_digest(Python)进行比较。普通字符串比较存在时序攻击风险。

Step 4: 处理事件

event_type 分发到对应的处理函数。

Step 5: 幂等处理

网络抖动或超时重试可能导致同一事件被投递多次。使用 event_id 做幂等去重。
在主处理流程中加入幂等检查:
如果没有 Redis,也可以用数据库 UNIQUE(event_id) 约束实现幂等。插入失败即表示已处理过。

Step 6: 响应与重试

响应规范

最佳实践

不要在返回 200 之前执行耗时操作(如数据库写入、外部 API 调用)。袋袋平台的投递超时为 10 秒。

本地开发调试

本地开发时,Webhook URL 需要公网可达。推荐使用隧道工具将本地端口暴露到公网。
获取到临时公网地址后,将其填入袋袋 Studio 的 Webhook URL 配置中(如 https://abc123.ngrok-free.app/api/webhook)。
调试时可以在袋袋 Studio 的 Webhook 日志中查看每次投递的请求/响应详情和重试记录。

完整示例

以下是可直接运行的完整示例:

安全最佳实践

始终验证签名

每个请求都必须通过 HMAC-SHA256 签名验证,拒绝一切未签名或签名错误的请求

使用 HTTPS

Webhook URL 必须使用 HTTPS,避免请求内容在传输中被窃听或篡改

幂等处理

利用 event_id 做去重,确保同一事件被多次投递时只处理一次

超时保护

在 10 秒内返回 200。耗时逻辑放到后台队列,避免阻塞响应触发重试
其他建议:
  • IP 白名单:如果你的防火墙支持,可以只放行袋袋平台的出口 IP 段
  • Secret 轮换:定期在 Studio 重新生成 Webhook Secret,并在应用侧平滑切换(支持同时验证新旧两个 Secret 的过渡期)
  • 日志与监控:记录每个 Webhook 的 event_id、处理结果、耗时,便于排查丢失或延迟问题

下一步

Next.js 全栈集成

OAuth 登录 + Token 管理 + 计费事件上报

按次计费 SaaS

PER_USE 模式:固定价格按次扣费

Events API 参考

查看完整的 Events API 文档

Token 管理最佳实践

并发刷新、安全存储、降级策略