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

Stripe订阅非按比例计费:如何配置日历年计费周期?

实现Stripe年度会员按日历年续费且立即收取全额费用

可以实现你的需求,核心思路是先让订阅正常生成并收取全额年费,再调整计费锚点到日历年起始日,同时避免比例计费。以下是具体方案:

方案一:创建订阅后立即调整计费锚点

  1. 首先创建无特殊配置的年度订阅,Stripe会按用户注册日生成订阅并立即收取全额100美元年费。
  2. 用户完成支付后,更新该订阅的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. 第一阶段:按用户注册日生成订阅,立即收取全额年费。
  2. 第二阶段:自动切换到日历年周期,每年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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 09:06:01