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
相关产品推荐
相关产品推荐

