本地测试Stripe Webhook时HTTP_STRIPE_SIGNATURE Header为空问题
问题解决
核心问题1:请求头名称错误
你代码里使用的HTTP_STRIPE_SIGNATURE是WSGI规范中转后的头名称,但FastAPI/Starlette这类异步框架直接使用原始HTTP头名称。Stripe Webhook的签名头实际为Stripe-Signature,获取头的代码应修改为:
sig_header = request.headers.get("Stripe-Signature")
核心问题2:Payload处理错误
stripe.Webhook.construct_event要求传入原始请求体字节内容,而非解析后的JSON字典。你当前用await request.json()解析请求体,会丢失签名验证所需的原始字节信息,正确处理方式是先获取原始请求体,再按需解析:
# 先获取原始请求体 payload = await request.body() # 按需解析为JSON结构 payload_json = await request.json() # 使用原始payload完成签名验证 event = stripe.Webhook.construct_event( payload, sig_header, endpoint_secret )
关于Stripe CLI本地测试的签名问题
Stripe CLI本地测试时会自动添加合法的Stripe-Signature头,前提是启动监听时指定了正确的端点密钥:
stripe listen --forward-to localhost:8000/your-webhook-path --secret whsec_xxx
若未指定密钥,CLI不会添加签名头,此时sig_header会返回None。另外,也可在Stripe Dashboard的Webhook设置中为本地端点配置密钥并关联到CLI。
额外排查点
- 确认Stripe CLI已完成登录(执行
stripe login),且监听命令中的端点路径与代码路由一致 - 检查请求是否被反向代理(如Nginx)篡改,确保
Stripe-Signature头被完整传递
内容的提问来源于stack exchange,提问作者Prakhar Rathi
相关产品推荐
相关产品推荐

