用途:作为“某支付服务商在某技术栈上如何验签 Webhook”的单一事实来源,供生成 Webhook 处理代码时参考。
主要能力:定义正确的验签契约——先读 Content-Length,超过 256 KB 返回 413;读取未解析的原始请求体;读取服务商特定的签名头;验签失败返回 400 且不泄露原因;验签后再解析 JSON;按 signatures.md 中的策略做重放防护(时间戳窗口或 event.id 去重);按 event.type 分发;标记已处理并返回 200。仅记录 event.id、event.type、event.created,不记录完整载荷。
使用方式:按技术栈捕获原始请求体,例如 Next.js App Router 用 request.text() 且 runtime 为 nodejs;Pages Router 设 bodyParser: false 并用 micro 的 buffer;Express 在全局 express.json() 之前注册 express.raw({ type: 'application/json', limit: '256kb' });FastAPI 用 await request.body();Laravel 用 $request->getContent();Rails 用 request.raw_post。各服务商的签名头名、算法、时间戳容差、重放策略与最小事件集见 signatures.md。若验签封装在 lib/auth/ 的辅助函数中,可在处理函数上标注 // @pagokit:signature-verified。测试用 node scripts/sign-event.js --provider <id> --curl(应返回 2xx)、--mode forged 与 --mode replay(应返回 400),不要手工伪造签名。
适用场景:生成或审查支付 Webhook 处理代码,尤其是需要正确处理原始请求体、重放与幂等性的集成。
限制:资料未提供具体服务商清单、完整签名算法细节与价格信息;非对称签名、SDK 托管验签或 mTLS 类服务商无法本地签名,需改用其沙箱。