如何修复PHP对接Stripe时GCP生产环境虚拟机POST请求返回403错误
根因分析
根据两个环境的配置差异,403错误的可能原因按优先级排序如下:
- Cloud Armor规则拦截:生产环境负载均衡绑定的Cloud Armor如果配置了IP白名单限制、WAF防护规则,会直接拦截Stripe的Webhook请求,返回403响应。此时请求未到达后端Apache服务,因此
$payload = @file_get_contents('php://input');读取结果为空。 - 负载均衡配置错误:
- 若负载均衡开启了身份感知代理(IAP),未授权的外部Stripe请求会被直接拦截返回403
- 负载均衡若配置了HTTP强制跳转HTTPS规则,Stripe发送的POST请求跳转时会丢失请求body,同时请求方法转为GET,触发接口权限校验返回403
- 负载均衡的后端服务配置了请求校验规则,丢弃了POST请求的body内容,导致Stripe签名校验失败返回403
- Apache层访问控制拦截:生产环境配置SSL后,若Apache开启了mod_security模块、
.htaccess文件配置了来源IP限制、请求方法过滤规则,也会拦截Stripe的Webhook请求返回403
修复方案
按优先级执行以下排查修复操作:
- 检查Cloud Armor规则:
- 放行Stripe官方公布的所有Webhook出口IP段,关闭针对Webhook接口路径的WAF检测规则
- 查看Cloud Armor日志,确认请求被拦截的具体规则,针对性调整
- 调整负载均衡配置:
- 确认负载均衡未对Stripe Webhook接口路径开启IAP认证
- 若配置了HTTP转HTTPS规则,配置例外规则允许Stripe的Webhook请求直接通过HTTPS访问,或在Stripe后台将Webhook地址修改为HTTPS协议
- 检查负载均衡请求转发配置,确保POST请求的body内容完整透传给后端Apache服务
- 校验Apache配置:
- 检查Apache的虚拟主机配置、
.htaccess文件,确认未限制Stripe的IP访问、未拦截POST请求 - 关闭mod_security模块针对Webhook接口的检测规则,避免误拦截
- 检查Apache的虚拟主机配置、
- 完成配置后,使用Stripe后台的测试Webhook功能发送测试请求,确认返回200响应且PHP可正常读取payload内容
内容的提问来源于stack exchange,提问作者Nishit Kumar
相关产品推荐
相关产品推荐

