Laravel Cashier订阅退款后避免账户遗留信用问题求助
解决Laravel Cashier退款后遗留账户信用导致重新订阅不扣费的问题
问题核心:Stripe针对订阅发票的全额退款,默认会将退款金额转为客户的账户信用(Customer Balance),后续用户重新订阅时会优先使用该信用抵扣费用,而非向用户发起扣费。
修改后的实现代码
$subscription = $user->subscription(); $subscription->cancelNow(); $stripe_subscription = $subscription->asStripeSubscription(); $latest_invoice = Cashier::stripe()->invoices->retrieve($stripe_subscription->latest_invoice); // 执行退款操作 Cashier::stripe()->refunds->create([ 'charge' => $latest_invoice->charge ]); // 获取当前用户对应的Stripe客户对象 $stripe_customer = $user->asStripeCustomer(); // 检查并清零客户账户信用(仅当余额为正时执行) if ($stripe_customer->balance > 0) { Cashier::stripe()->customers->createBalanceTransaction($stripe_customer->id, [ 'amount' => -$stripe_customer->balance, // 负数表示扣除对应金额的余额 'currency' => $stripe_customer->currency, 'description' => '清零退款产生的账户信用' ]); }
逻辑说明
- 原有的取消订阅+退款逻辑保持不变,确保订阅立即取消且完成退款。
- 新增的账户信用清零步骤:
- 获取用户关联的Stripe客户对象,检查其账户余额
- 若余额为正(即存在遗留信用),创建反向余额交易将余额清零
- 该操作会直接移除客户的预付信用,后续重新订阅时系统会正常发起扣费请求
内容的提问来源于stack exchange,提问作者Dan
相关产品推荐
相关产品推荐

