部署在Heroku的Laravel API对接Stripe Webhook遇500错误求助
排查Heroku上Laravel Stripe Webhook 500错误的常见原因
以下是几个最可能导致你遇到通用500错误的原因及对应解决方法:
环境变量加载异常
Heroku生产环境下,Laravel会缓存配置,直接用env("STRIPE_WEBHOOK_SECRET")大概率取不到正确值。- 先确认Heroku控制台的「Settings > Config Vars」里已经正确配置了
STRIPE_WEBHOOK_SECRET,值要和Stripe后台的Webhook签名密钥完全一致。 - 在
config/services.php中添加Stripe配置项:
控制器里改用'stripe' => [ 'webhook_secret' => env('STRIPE_WEBHOOK_SECRET'), ],config('services.stripe.webhook_secret')获取密钥,避免缓存导致的变量丢失。
- 先确认Heroku控制台的「Settings > Config Vars」里已经正确配置了
请求体被提前消耗
Laravel的Request类会自动解析请求内容,导致php://input流被读取后无法再次获取,直接用file_get_contents('php://input')会拿到空值,触发后续异常。
修改控制器方法,注入Request对象并获取原始内容:use Illuminate\Http\Request; public function stripe_webhook(Request $request) { $payload = $request->getContent(); $sig_header = $request->header('Stripe-Signature'); // 后续代码保持不变 }同时用
$request->header()替代$_SERVER获取签名头,更符合Laravel的规范。Response类未正确引入
控制器里直接用Response::json()但没引入对应Facade,会触发「类未找到」的致命错误。
要么在控制器顶部添加引用:use Illuminate\Support\Facades\Response;要么直接用Laravel的辅助函数简化代码:
return response()->json(['event' => $event], 201);未查看具体错误日志
500是通用错误,必须看具体日志才能定位问题。在本地终端执行:heroku logs --tail实时查看Heroku上的应用日志,里面会明确显示错误原因(比如变量为空、类不存在等)。
CSRF排除路径不匹配
api.php中的路由默认带有/api前缀,实际Webhook路径是/api/stripe_webhook,你在VerifyCsrfToken的$except里写的是/stripe_webhook,可能存在路径不匹配的问题。尝试改为:protected $except = [ "/api/stripe_webhook", ];
内容的提问来源于stack exchange,提问作者dl_atl
相关产品推荐
相关产品推荐

