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

如何将Stripe免费试用与网站账号创建绑定并自动生成试用?

需求可行性及实现方案

完全可行。你可以通过关联Stripe客户(Customer)并预填充用户邮箱的方式,跳过结账环节的邮箱输入步骤,直接将免费试用与已创建的网站账号绑定。以下是具体实现思路和代码修改建议:

核心逻辑说明

Stripe允许在创建结账会话(Checkout Session)时,直接指定customer(已有客户ID)或customer_email参数,这样结账页面会自动跳过邮箱输入流程——因为Stripe已经获取到用户的邮箱信息,同时会自动将订阅与该客户关联,实现和网站账号的绑定。

代码修改步骤

1. 关联Stripe客户(可选但推荐)

建议在用户创建网站账号时,同步创建Stripe Customer并将其ID存储到用户模型中(比如新增stripe_customer_id字段)。如果还没做这一步,也可以在创建结账会话时临时创建并关联。

2. 修改结账会话创建代码

在你的create_checkout_session函数中,添加customer或customer_email参数,同时调整相关逻辑:

def create_checkout_session(request, app_type):
    subscription_plan_duration = SubscriptionPlanDuration.objects.filter().first()

    # 获取当前用户的邮箱(账号创建时已存在)
    user_email = request.user.email
    # 尝试获取用户已关联的Stripe客户ID
    stripe_customer_id = request.user.stripe_customer_id

    # 如果用户未关联Stripe客户,自动创建并绑定
    if not stripe_customer_id:
        customer = stripe.Customer.create(email=user_email)
        request.user.stripe_customer_id = customer.id
        request.user.save()
        stripe_customer_id = customer.id

    user_subscription = UserSubscription.objects.create(
        subscription_plan_duration_id=subscription_plan_duration.id,
        user_id=request.user.id,
        app_type=app_type,
        is_active=False  # 试用激活后改为True
    )
    
    discount_coupon = DiscountCoupon.objects.filter(subscription_plan_duration_id=subscription_plan_duration.id).first()

    checkout_session = stripe.checkout.Session.create(
        line_items=[
            {
                'price': subscription_plan_duration.price_id,
                'quantity': 1,
            },
        ],
        metadata={ 
            "user_subscription_id": user_subscription.id
        },
        mode="subscription",
        # 关联已有的Stripe客户,跳过邮箱输入
        customer=stripe_customer_id,
        # 如果还未创建Stripe客户,也可以直接传邮箱,Stripe会自动创建客户
        # customer_email=user_email,
        # discounts=[{
        #     'coupon': discount_coupon.coupon_id,
        # }],
        subscription_data={
            "trial_period_days": 30,
            "trial_settings": {
                "end_behavior": {
                    "missing_payment_method": "cancel"
                }
            }
        },
        payment_method_collection="if_required",
        allow_promotion_codes=True,
        success_url=settings.APP_END_POINT + '/stripe/success',
        cancel_url=settings.APP_END_POINT + '/stripe/cancel-subscription/' + app_type
    )

    return redirect(checkout_session.url)

3. 激活试用状态

在结账成功的回调处理函数(即success_url对应的视图)中,将UserSubscription的is_active字段更新为True,正式激活用户的免费试用:

def stripe_success(request):
    # 获取结账会话ID(Stripe会在回调时传递session_id参数)
    session_id = request.GET.get('session_id')
    session = stripe.checkout.Session.retrieve(session_id)
    
    # 获取关联的UserSubscription ID
    user_subscription_id = session.metadata.get('user_subscription_id')
    if user_subscription_id:
        user_subscription = UserSubscription.objects.get(id=user_subscription_id)
        user_subscription.is_active = True
        user_subscription.save()
    
    # 跳转至用户的试用页面或首页
    return redirect('/dashboard')

补充说明

  • payment_method_collection="if_required"对于免费试用场景是合理的设置,因为试用期间无需支付,Stripe不会要求用户输入支付方式;如果你的业务需要用户在试用时绑定支付方式,可以将该参数改为always。
  • 提前在账号创建时生成Stripe Customer并存储ID,能避免重复创建客户,同时让后续的订阅管理更顺畅。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 20:35:56