Stripe Connect直连账户Checkout Session回调500错误排查求助
问题定位指导:Stripe Checkout Session 回调500错误
1. 优先排查Webhook签名验证问题
- 切换到关联账户收费模式后,Webhook签名密钥必须使用关联账户的专属密钥,而非平台账户的密钥。很多新手会直接沿用平台密钥验证关联账户的事件,导致签名验证失败直接抛出500错误。
- 检查PHP回调代码中
Stripe\Webhook::constructEvent()方法使用的密钥,确认是关联账户的Webhook签名密钥(在Stripe后台关联账户的Webhook设置中获取)。
2. 确认事件接收端点的归属
- 创建Session时指定了
stripe_account参数的话,该Session的所有事件(如checkout.session.completed)会发送到关联账户配置的Webhook端点,而非平台账户的端点。 - 登录Stripe后台,检查关联账户的Webhook配置:
- 是否添加了正确的回调URL
- 是否开启了
checkout.session.completed等必要事件 - 是否使用了关联账户的签名密钥
3. 客户资源跨账户问题排查
- 若创建Session时传入了平台账户下的
customerID,而Session归属关联账户,会导致资源不匹配问题(但你提到创建Session正常,可能未指定customer参数)。 - 检查创建Session的PHP代码:
- 若需要关联账户下的客户,创建时必须指定
stripe_account参数:// 正确:在关联账户下创建客户 $customer = \Stripe\Customer::create( ['email' => 'user@example.com'], ['stripe_account' => 'acct_xxx'] // 替换为你的关联账户ID ); - 创建Session时,若传入
customer参数,必须是关联账户下的客户ID。
- 若需要关联账户下的客户,创建时必须指定
4. 给回调代码添加错误捕获
- 新手代码常因未做异常处理,导致错误直接返回500而看不到具体原因。给回调代码加上try-catch并记录错误日志:
try { $event = \Stripe\Webhook::constructEvent( file_get_contents('php://input'), $_SERVER['HTTP_STRIPE_SIGNATURE'], $webhook_secret // 关联账户的Webhook密钥 ); // 处理事件逻辑 http_response_code(200); } catch (\Exception $e) { // 记录错误到日志文件 error_log('Stripe Webhook Error: ' . $e->getMessage()); http_response_code(400); exit(); } - 查看日志就能明确是签名错误、Session不存在还是其他问题。
5. 分析Stripe日志的关键细节
- 从你提供的Stripe日志截图中重点关注:
- 事件的
account字段:确认事件属于平台账户还是关联账户 - 错误信息关键词:如
Invalid signature(签名错误)、No such checkout session(Session不存在) - 若出现
No such checkout session,说明你在回调中查询Session时未指定关联账户ID,需修正:// 正确:查询关联账户下的Session $session = \Stripe\Checkout\Session::retrieve( 'cs_xxx', ['stripe_account' => 'acct_xxx'] );
- 事件的
内容的提问来源于stack exchange,提问作者Harry
相关产品推荐
相关产品推荐

