Laravel 10集成Stripe Connect报错:无法设置转账目标为自身账户
错误原因与排查解决步骤
这个错误的核心原因是:你在设置payment_intent_data[transfer_data][destination]时,传入了自己的Stripe主账户ID,而不是用户的Express子账户ID。Stripe不允许将资金转账到平台自身的主账户,该参数只能指定关联的子账户(比如你为用户创建的Express账户)。
以下是具体排查和解决步骤:
检查
stripe_account_id的存储与取值- 直接查看数据库中用户表的
stripe_account_id字段,确认存储的是用户的Express账户ID,而非你的Stripe主账户ID。 - 在PaymentController创建Checkout Session的代码前,打印当前使用的
stripe_account_id值,对比Stripe后台的主账户ID,排除取值错误。
- 直接查看数据库中用户表的
核对Checkout Session创建代码
确保transfer_data[destination]参数正确指向用户的Express账户ID,示例代码如下:$user = Auth::user(); // 或获取当前交易对应的用户 $session = \Stripe\Checkout\Session::create([ 'payment_method_types' => ['card'], 'line_items' => [ [ 'price_data' => [ 'currency' => 'usd', 'product_data' => ['name' => '商品名称'], 'unit_amount' => 1000, // 单位为分 ], 'quantity' => 1, ], ], 'mode' => 'payment', 'payment_intent_data' => [ 'transfer_data' => [ 'destination' => $user->stripe_account_id, // 这里必须是用户的Express账户ID ], ], 'success_url' => route('payment.success'), 'cancel_url' => route('payment.cancel'), ]);绝对不能将
destination设为你的Stripe主账户ID,这是Stripe明确禁止的操作。验证用户Stripe账户类型
检查RegisterController中创建账户的代码,确保创建的是Express类型的子账户,示例代码:$account = \Stripe\Account::create([ 'type' => 'express', 'email' => $user->email, // 其他必填信息,比如业务类型等 ]); $user->stripe_account_id = $account->id; $user->save();只有平台关联的子账户(Express/Standard/Custom)才能作为
transfer_data[destination]的有效值,主账户不允许。单例测试排查
选取一个已注册用户,手动获取其stripe_account_id,在代码中硬编码该值到destination参数,调用接口测试。如果不再报错,说明是你获取用户stripe_account_id的逻辑存在问题;如果仍报错,登录Stripe后台确认该账户是否确实属于你的平台关联账户。
内容的提问来源于stack exchange,提问作者Carol.Kar
相关产品推荐
相关产品推荐

