You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel Cashier如何实现降级时订阅在下个计费周期切换生效

订阅升降级延迟生效实现方案

修改后核心代码

// 先取出当前活跃订阅实例,避免重复查询
$activeSubscription = auth()->user()->subscriptions()->active()->first();
$currentPlanPrice = auth()->user()->plan()['price'];

if ($currentPlanPrice <= $newPlanPrice) {
    // 升级逻辑:即时生效,按比例计费
    $activeSubscription->swap($request->plan);
} else {
    // 降级逻辑:无比例计费,下个计费周期生效
    $activeSubscription->noProrate()->swapNextCycle($request->plan);
}

实现说明

  • 你当前使用的是Laravel Cashier的订阅管理能力,上述代码用到的swapNextCycle()是Cashier官方提供的原生方法,适配v10及以上版本。调用该方法后:
    • 当前计费周期内用户的订阅权益完全不变,可正常使用原高等级方案的所有功能
    • 到当前计费周期结束的续费节点,系统会自动切换到降级后的方案,同时按新方案的价格扣费
    • 搭配noProrate()使用完全符合你降级不按比例计费的需求,不会产生差额退费

低版本Cashier兼容方案

如果你使用的Cashier版本低于v10不支持swapNextCycle,可手动实现逻辑:

  • 给订阅数据表新增pending_swap_plan字段,存储用户申请降级的目标方案ID
  • 新增降级申请时仅写入该字段,不触发即时切换操作,权限判断逻辑仍读取当前生效的方案ID
  • 监听subscription_renewed订阅续费事件,事件触发时如果对应订阅存在待切换的目标方案,执行swap切换后清空pending_swap_plan字段即可

交互优化建议

用户提交降级申请时,可在前端明确提示降级生效时间(即当前计费周期的结束日期),避免用户产生功能立刻被收回的误解。如果用户在生效前撤销降级申请,直接删除待切换的目标方案记录即可。

内容的提问来源于stack exchange,提问作者Remi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 14:15:00