如何将Stripe Connect账户资金划转至自有Stripe账户?(Laravel环境)
Stripe Connect 资金操作方案(Laravel 项目)
一、每月5日向成员银行账户转账
使用 Stripe Payouts API 实现,核心是给指定Connect账户绑定的银行账户发起提现操作。
操作步骤
- 前置校验:确保成员的Connect账户已完成银行账户绑定(Stripe中称为External Account),且状态有效。
- 定时触发:通过Laravel任务调度,每月5日执行批量转账逻辑。
- API调用:创建Payout对象,指定目标银行账户、金额及对应Connect账户。
Laravel 代码示例
use Stripe\Stripe; use Stripe\Payout; use Illuminate\Support\Facades\Log; // 初始化Stripe SDK Stripe::setApiKey(config('services.stripe.secret')); // 遍历需要转账的成员(假设从数据库获取) $members = Member::where('status', 'active')->get(); foreach ($members as $member) { try { // 创建提现请求 $payout = Payout::create( [ 'amount' => $member->pending_amount * 100, // 单位:分,需转换为最小货币单位 'currency' => 'usd', // 根据实际业务修改币种 'destination' => $member->stripe_bank_account_id, // 成员Connect账户绑定的银行账户ID 'description' => 'Monthly payout for platform member' ], ['stripe_account' => $member->stripe_connect_account_id] // 指定操作的Connect账户 ); // 记录成功日志,更新数据库状态 Log::info("Payout successful for member {$member->id}: {$payout->id}"); $member->update(['pending_amount' => 0, 'last_payout_at' => now()]); } catch (\Exception $e) { // 处理错误,记录日志并标记异常 Log::error("Payout failed for member {$member->id}: {$e->getMessage()}"); $member->update(['payout_error' => $e->getMessage()]); } }
任务调度配置
在 app/Console/Kernel.php 中添加定时任务:
protected function schedule(Schedule $schedule) { $schedule->call(function () { // 调用上面的转账逻辑 $this->call(ProcessMonthlyPayouts::class); })->monthlyOn(5, '02:00'); // 每月5日凌晨2点执行,避开高峰 }
二、成员退出时划转Connect账户余额至平台账户
使用 Stripe Transfers API 实现,将成员Connect账户的可用余额划转至平台自有Stripe账户。
操作步骤
- 余额校验:先查询成员Connect账户的可用余额,确认有可划转资金。
- 发起划转:调用Transfer API,将资金从Connect账户转入平台账户。
- 状态同步:更新数据库中成员的账户状态,记录划转记录。
Laravel 代码示例
use Stripe\Stripe; use Stripe\Account; use Stripe\Transfer; use Illuminate\Support\Facades\Log; Stripe::setApiKey(config('services.stripe.secret')); $member = Member::find($memberId); $connectAccountId = $member->stripe_connect_account_id; try { // 查询Connect账户的可用余额 $account = Account::retrieve($connectAccountId); // 假设币种为USD,取可用余额(单位:分) $availableBalance = $account->balance->available[0]->amount ?? 0; if ($availableBalance <= 0) { Log::info("No available balance to transfer for member {$member->id}"); return; } // 发起资金划转 $transfer = Transfer::create( [ 'amount' => $availableBalance, 'currency' => 'usd', 'destination' => config('services.stripe.platform_account_id'), // 平台自有Stripe账户ID 'description' => 'Balance transfer for exiting member' ], ['stripe_account' => $connectAccountId] // 从该Connect账户转出资金 ); // 记录日志,更新成员状态 Log::info("Balance transfer successful for member {$member->id}: {$transfer->id}"); $member->update([ 'status' => 'exited', 'balance_transferred_at' => now(), 'transferred_amount' => $availableBalance / 100 ]); } catch (\Exception $e) { Log::error("Balance transfer failed for member {$member->id}: {$e->getMessage()}"); // 抛出异常或进行错误处理 throw new \Exception("Failed to transfer balance: {$e->getMessage()}"); }
三、关键注意事项
- 账户类型:确保使用Stripe Connect标准账户或自定义账户,Express账户部分资金操作受限,需提前确认。
- 资金状态:仅能划转Connect账户的可用余额(
available字段),pending状态的资金无法立即操作。 - 权限配置:在Stripe Dashboard的Connect设置中,确保平台账户拥有操作子账户资金的权限。
- 错误处理:必须捕获API调用异常,处理余额不足、账户无效、权限不足等场景,避免资金异常。
- 合规要求:所有资金操作需符合Stripe Connect条款,划转原因需明确,避免违反反洗钱等监管规定。
内容的提问来源于stack exchange,提问作者bluestar0505
相关产品推荐
相关产品推荐

