如何将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
相关产品推荐
相关产品推荐

