Stripe订阅非按比例计费:如何配置日历年计费周期?
实现Stripe年度会员按日历年续费且立即收取全额费用
可以实现你的需求,核心思路是先让订阅正常生成并收取全额年费,再调整计费锚点到日历年起始日,同时避免比例计费。以下是具体方案:
方案一:创建订阅后立即调整计费锚点
- 首先创建无特殊配置的年度订阅,Stripe会按用户注册日生成订阅并立即收取全额100美元年费。
- 用户完成支付后,更新该订阅的
billing_cycle_anchor为次年1月1日,并设置proration_behavior: 'none',这样不会产生比例扣费或退款,后续订阅将在每年1月1日自动续费。
对应的PHP代码示例:
// 第一步:创建正常的Checkout Session,不设置billing_cycle_anchor $checkout_params = [ 'line_items' => [ [ 'price' => $prices->data[0]->id, 'quantity' => 1, ], ], 'mode' => 'subscription', 'success_url' => $success_url . '?success=true&session_id={CHECKOUT_SESSION_ID}', 'cancel_url' => $return_url, 'customer_email' => $email, ]; $checkout_session = \Stripe\Checkout\Session::create($checkout_params); // 用户支付成功后,从Checkout Session中获取订阅ID // 实际场景中需在success_url对应的回调逻辑中执行以下代码 $session = \Stripe\Checkout\Session::retrieve($checkout_session->id); $subscription_id = $session->subscription; // 第二步:更新订阅的计费锚点到次年1月1日 $nextYear = date('Y') + 1; \Stripe\Subscription::update( $subscription_id, [ 'billing_cycle_anchor' => strtotime("{$nextYear}-01-01"), 'proration_behavior' => 'none', 'payment_behavior' => 'default_incomplete', // 避免触发额外扣费逻辑 ] );
方案二:使用订阅日程(Subscription Schedules)预先规划计费周期
如果你需要预先设定好后续的计费规则,可以用订阅日程来分阶段管理订阅:
- 第一阶段:按用户注册日生成订阅,立即收取全额年费。
- 第二阶段:自动切换到日历年周期,每年1月1日续费。
代码示例:
// 先获取或创建客户(如果已有客户ID可直接使用) $customer = \Stripe\Customer::create(['email' => $email]); $nextYear = date('Y') + 1; // 创建订阅日程 $schedule = \Stripe\SubscriptionSchedule::create([ 'customer' => $customer->id, 'start_date' => 'now', 'end_behavior' => 'release', // 日程结束后订阅转为常规订阅 'phases' => [ // 第一阶段:当前注册日到次年注册日的周期 [ 'items' => [ [ 'price' => $prices->data[0]->id, 'quantity' => 1, ], ], 'end_date' => strtotime("+1 year"), ], // 第二阶段:切换到日历年周期,每年1月1日续费 [ 'items' => [ [ 'price' => $prices->data[0]->id, 'quantity' => 1, ], ], 'billing_cycle_anchor' => strtotime("{$nextYear}-01-01"), 'proration_behavior' => 'none', ], ], ]); // 基于订阅日程创建Checkout Session $checkout_params = [ 'line_items' => [ [ 'price' => $prices->data[0]->id, 'quantity' => 1, ], ], 'mode' => 'subscription', 'success_url' => $success_url . '?success=true&session_id={CHECKOUT_SESSION_ID}', 'cancel_url' => $return_url, 'customer' => $customer->id, 'subscription_data' => [ 'schedule' => $schedule->id, ], ]; $checkout_session = \Stripe\Checkout\Session::create($checkout_params);
关键说明
- 两种方案都不会产生比例计费,用户注册时立即支付全额100美元。
- 调整计费锚点时设置
proration_behavior: 'none',确保Stripe不会计算或收取中间时段的比例费用,也不会退还已收费用。 - 后续订阅将固定在每年1月1日自动续费,符合日历年计费周期的需求。
内容的提问来源于stack exchange,提问作者Ben T
相关产品推荐
相关产品推荐

