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

Stripe结账后修改billing_cycle_anchor报错求助

问题解决:Stripe订阅修改billing_cycle_anchor时时间戳参数报错

问题分析

你遇到的报错是因为Stripe的billing_cycle_anchor参数存在场景限制:仅在创建订阅时,或修改订阅同时变更计费周期(比如月度转年度)的情况下,才支持传入Unix时间戳。而你是在订阅已创建完成后,单纯修改锚点且未变更周期,此时该参数仅允许使用now、unset或unchanged这三个枚举值,这就是报错的核心原因。

解决方案

方案1:创建Checkout Session时直接设置计费锚点

最简洁的方式是在生成Stripe Checkout Session阶段,就指定订阅的计费锚点为下一个8月1日,跳过后续修改操作。示例代码调整如下:

def get_next_august_1st():
    current_year = datetime.now().year
    if datetime.now().month < 8:
        return datetime(current_year, 8, 1)
    return datetime(current_year + 1, 8, 1)

# 生成Checkout Session的核心代码
@app.route('/create-checkout-session', methods=['POST'])
def create_checkout_session():
    next_august_1st = get_next_august_1st()
    try:
        checkout_session = stripe.checkout.Session.create(
            payment_method_types=['card'],
            line_items=[
                {
                    'price': '你的价格ID',
                    'quantity': 1,
                },
            ],
            mode='subscription',
            success_url='https://你的域名.com/success',
            cancel_url='https://你的域名.com/cancel',
            subscription_data={
                'billing_cycle_anchor': int(next_august_1st.timestamp()),
                'proration_behavior': 'none'  # 避免锚点变更产生 prorate 费用
            }
        )
        return jsonify(id=checkout_session.id)
    except Exception as e:
        return jsonify(error=str(e)), 403

方案2:用Subscription Schedule调整已创建的订阅

如果必须在订阅创建后修改锚点,可以通过Stripe的Subscription Schedule实现,它支持调整已存在订阅的计费周期和锚点:

@app.route('/webhook', methods=['POST'])
def stripe_webhook():
    payload = request.get_data(as_text=True)
    sig_header = request.headers.get('Stripe-Signature')

    print(f"Received Stripe-Signature: {sig_header}")
    print(f"Recieved payload: {payload}")
    
    if not sig_header:
        print("Error: Missing Stripe-Signature header")
        return jsonify(success=False, message="Missing Stripe-Signature"), 400
    
    try:
        event = stripe.Webhook.construct_event(
            payload, sig_header, endpoint_secret
        )

        if event['type'] == 'checkout.session.completed':
            session = event['data']['object']
            
            if 'subscription' in session:
                subscription_id = session['subscription']
                next_august_1st = get_next_august_1st()
                
                # 创建订阅计划调整锚点
                schedule = stripe.SubscriptionSchedule.create(
                    from_subscription=subscription_id,
                    phases=[
                        {
                            'start_date': int(datetime.now().timestamp()),
                            'end_date': int(next_august_1st.timestamp()),
                            'proration_behavior': 'none',
                            'plans': [{'plan': '你的价格ID'}]
                        },
                        {
                            'start_date': int(next_august_1st.timestamp()),
                            'plans': [{'plan': '你的价格ID'}],
                            'interval': 'year',
                            'interval_count': 1
                        }
                    ]
                )
                print(f"Subscription {subscription_id} billing cycle anchor updated to {next_august_1st} via schedule {schedule.id}")
            else:
                print("No subscription found in session. Ignoring event.")
        
        return jsonify(success=True)

注意事项

  • 确保使用最新版本的Stripe API,旧版本可能对参数支持有限
  • 若需要用户加入当日全额支付整年费用,需配合价格设置或proration规则,避免产生异常收费

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 06:16:16