本地测试Stripe Webhook时出现Invalid Signature错误求助
解决Stripe Webhook本地测试签名无效问题
以下是排查和解决invalid signature错误的具体步骤:
1. 确认端点密钥(endpoint_secret)正确
Stripe CLI启动时会输出专属的本地测试密钥,格式类似whsec_xxxxxxxxxxxx,你必须使用这个密钥,而非Stripe Dashboard里配置的生产/测试webhook密钥。
- 重新运行
./stripe listen --forward-to http://localhost/cb/stripe,复制终端输出的webhook signing secret值,替换代码中$endpoint_secret = 'whsec...';的省略部分。
2. 确保请求体未被修改
若服务器或框架自动解析POST请求体,会导致php://input无法获取原始payload,进而签名验证失败:
- 检查代码中是否多次读取
php://input(比如同时用$_POST和file_get_contents),确保仅读取一次并直接传入constructEvent方法。 - 若使用PHP框架(如Laravel、Symfony),关闭自动解析请求体的中间件,或使用框架提供的原始请求体获取方式(例如Laravel的
$request->getContent())。 - 检查服务器是否开启gzip压缩,这会修改原始payload内容导致签名不匹配,需关闭针对该webhook端点的压缩设置。
3. 验证签名头的获取是否正确
确认服务器环境能正确获取Stripe-Signature请求头:
- 在代码中添加日志打印
$_SERVER['HTTP_STRIPE_SIGNATURE']的值,确保其存在且不为空。部分服务器会将请求头的横线转为下划线,但Stripe-Signature对应的$_SERVER键就是HTTP_STRIPE_SIGNATURE,若不存在,需检查服务器配置是否拦截了该请求头。
4. 检查代码逻辑与依赖
- 确保Stripe PHP SDK为最新版本,旧版本可能存在签名验证bug,运行
composer update stripe/stripe-php完成更新。 - 确认
write_log函数不会在签名验证前输出内容,避免干扰HTTP响应流程。
额外测试步骤
- 停止当前
stripe listen进程,重新启动以生成新的签名密钥,替换到代码中。 - 运行
stripe trigger payment_intent.succeeded时,观察终端输出,确认请求已正确转发到本地端点。
内容的提问来源于stack exchange,提问作者The Hawk
相关产品推荐
相关产品推荐

