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

如何在PHP中更新Stripe订阅以重置计费周期且不生成新发票?

解决Stripe订阅付款后重置计费周期且不重复扣费的问题

当用户支付逾期发票后,要重置订阅的计费周期锚点到付款当天,同时避免生成新发票或重复扣费,你需要调整更新订阅时的参数,核心是添加payment_behavior: 'skip'来跳过立即收费逻辑。

问题原因

你之前的代码会生成新发票,是因为Stripe默认的payment_behavior参数值会触发变更发票的生成,即使设置了proration_behavior: 'none',系统仍会尝试创建用于确认变更的发票,导致重复扣费。

正确的PHP实现代码

在invoice.paid webhook中,先确认发票对应的订阅是从逾期状态恢复的,再执行以下更新:

// 获取触发webhook的发票对象
$invoice = \Stripe\Invoice::retrieve($event->data->object->id);
$subscription_id = $invoice->subscription;

// 确认订阅此前处于逾期状态(可选但建议做校验)
$subscription = \Stripe\Subscription::retrieve($subscription_id);
if (in_array($subscription->status, ['past_due', 'unpaid'])) {
    // 更新订阅,用发票实际付款时间作为新计费锚点,跳过立即收费
    \Stripe\Subscription::update($subscription_id, [
        'billing_cycle_anchor' => $invoice->paid_at, // 用实际付款时间更精准,替代'now'
        'proration_behavior'   => 'none',
        'payment_behavior'     => 'skip', // 关键参数:跳过生成变更发票,无额外扣费
    ]);
}

参数说明

  • billing_cycle_anchor: $invoice->paid_at:使用发票的实际付款时间作为新的计费锚点,比'now'更精准,避免webhook延迟导致的时间偏差
  • proration_behavior: 'none':禁止生成任何补收/退款的 prorations,无需调整已过期周期的费用
  • payment_behavior: 'skip':告诉Stripe仅更新订阅的未来计费日期,不生成任何变更发票,彻底避免重复扣费

注意事项

  • 该操作仅适用于订阅状态为active的情况(用户支付逾期发票后,订阅会自动从past_due/unpaid恢复为active)
  • 务必确保webhook已正确验证Stripe签名,避免恶意请求触发错误操作

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.12 02:42:31