Stripe API中试用结束后切换价格ID的订阅更新问题
解决Stripe试用结束后自动切换订阅价格的问题
问题根源
你当前的代码逻辑是先创建独立订阅,再通过from_subscription绑定订阅计划,这种操作会触发Stripe将原订阅替换为计划生成的新订阅,同时你的计划只配置了单一阶段,没有明确包含原订阅的试用周期,导致逻辑混乱。
正确实现方案
方案一:直接创建含试用+正式阶段的订阅计划(推荐)
无需先创建独立订阅,直接定义包含两个阶段的订阅计划,Stripe会自动在试用结束时切换价格:
$schedule = $this->stripe->subscriptionSchedules->create([ 'customer' => $stripeCustomer->id, 'start_date' => 'now', 'phases' => [ // 试用阶段:使用初始价格,设置1年后结束 [ 'items' => [ ['price' => $priceId, 'quantity' => 1], ], 'end_date' => Carbon::now()->addYears(1)->timestamp, 'collection_method' => 'charge_automatically', 'description' => $description, ], // 正式阶段:试用结束后切换到目标价格 [ 'items' => [ ['price' => $product['product']->metadata->schedule_price, 'quantity' => 1], ], 'collection_method' => 'charge_automatically', ], ], 'end_behavior' => 'release', ]);
方案二:基于已存在的试用订阅创建计划
如果已经有正在运行的试用订阅,可将其纳入计划管理,添加后续价格切换阶段:
// 先获取已有的试用订阅(或你刚创建的$subscription) $subscription = $this->stripe->subscriptions->retrieve($stripeSubscriptionId); $schedule = $this->stripe->subscriptionSchedules->create([ 'from_subscription' => $subscription->id, 'phases' => [ // 第一阶段:继承原订阅设置,明确试用结束时间 [ 'items' => [ ['price' => $subscription->items->data[0]->price->id, 'quantity' => 1], ], 'end_date' => Carbon::now()->addYears(1)->timestamp, ], // 第二阶段:切换到目标价格 [ 'items' => [ ['price' => $product['product']->metadata->schedule_price, 'quantity' => 1], ], ], ], 'end_behavior' => 'release', ]);
关键注意事项
- 不要给原订阅设置
cancel_at,订阅计划会自动管理阶段周期,该参数会导致订阅提前取消,与计划逻辑冲突。 - 确保切换前后的价格属于同一产品(Stripe默认要求订阅计划的阶段切换需在同产品的不同价格间进行,避免不必要的报错)。
- 测试时可将试用结束时间设为几分钟后,快速验证阶段切换效果。
内容的提问来源于stack exchange,提问作者Ali Rasheed
相关产品推荐
相关产品推荐

