开发环境下Stripe Webhooks接收异常求助(返回200无日志)
排查思路与解决方案
1. 修正Nginx的API转发配置(核心嫌疑)
你的Nginx配置中location /api/的proxy_pass指向了https://dev.app.com/,这会导致循环代理:Nginx监听dev.app.com的443端口,收到/api/请求后又转发回同一个域名,请求根本没到达Spring Boot后端。
修改方式:将proxy_pass改成后端服务的实际地址(比如后端运行在本地8080端口,就用http://localhost:8080/;如果是内网地址,就用对应的http地址):
location /api/ { proxy_pass http://localhost:8080/; # 替换为后端实际地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_connect_timeout 10; # 建议延长超时时间,避免Stripe请求被提前断开 proxy_next_upstream error timeout http_500 http_502 http_503 http_504; # 移除proxy_intercept_errors on,避免拦截后端的错误响应 }
2. 确认Stripe Webhook的端点路径
你的后端Webhook端点是@PostMapping("/webhook"),结合Nginx的/api/转发规则,Stripe控制台中配置的Webhook URL应该是https://dev.app.com/api/webhook,而不是https://dev.app.com/webhook。
如果配置成后者,请求会被Nginx的location /规则处理,返回React的index.html(状态码200),但后端完全没收到请求,这正好符合你描述的“Stripe显示200但无后端日志”的现象。
3. 排查日志输出问题
- 检查Nginx的日志文件:查看
/var/log/nginx/access.log,搜索是否有Stripe发送的POST /api/webhook请求;查看error.log是否有转发失败的错误信息(比如连接后端超时、SSL错误)。 - 替换
System.out.println为标准日志框架:生产环境中Spring Boot可能不会捕获System.out的输出,改用SLF4J日志(比如log.info()),并确保日志配置正确(比如application.properties中指定logging.file.name或logging.path,且目录有写入权限)。
4. 验证Webhook签名配置
- 确认开发环境使用的Webhook Secret是Stripe控制台对应环境的正确密钥(测试环境和生产环境的Secret不同,不要混用本地的
whsec_开头的密钥)。 - 检查Nginx是否修改了请求体:Stripe的签名验证依赖原始请求体,如果Nginx开启了
gzip压缩或者修改了请求编码,会导致签名验证失败。可以在location /api/中添加配置确保请求体未被修改:
proxy_set_header Content-Encoding ""; proxy_pass_request_body on;
5. 检查后端服务状态
- 确认Spring Boot服务在开发环境中正常运行,且监听的端口与Nginx转发的地址一致。
- 直接访问后端的Webhook端点(比如用curl命令:
curl -X POST https://dev.app.com/api/webhook -d "test" -H "Stripe-Signature: test"),查看后端是否有日志输出,验证端点是否可达。
内容的提问来源于stack exchange,提问作者Beesz
相关产品推荐
相关产品推荐

