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

如何在Next.js 13中阻止Stripe订阅无限试用滥用问题

解决Stripe 3天免费试用期滥用问题

针对用户反复取消订阅再重新订阅以滥用3天免费试用期的问题,结合Stripe官方建议,需从业务逻辑层面限制用户仅能享受一次试用期,具体实现方案如下:

1. 数据库新增试用跟踪字段

在用户表中添加布尔类型字段(如has_used_trial),或记录trial_started_at、trial_ended_at时间字段,用于标记用户是否已使用过免费试用期。

2. 修改订阅创建逻辑

生成Stripe Checkout Session前,先检查当前用户的试用状态,仅向未试用过的用户提供试用期:

修改后的核心代码片段

// 原代码中用户处于免费计划时的逻辑部分
const subscriptionPlan = await getUserSubscriptionPlan(session.user.id);

// 新增:查询用户是否已使用过试用期
const userHasUsedTrial = await checkIfUserUsedTrial(session.user.id);

// 若已试用过,直接返回错误提示
if (userHasUsedTrial) {
  return new Response(JSON.stringify({ error: "您已享受过免费试用期,无法再次获取" }), { status: 403 });
}

// 创建Checkout Session
const stripeSession = await stripe.checkout.sessions.create({
  success_url: billingUrl,
  cancel_url: billingUrl,
  payment_method_types: ["card"],
  discounts: [{
    promotion_code: 'promo_1OkTmuK3h7UDnylM9PK1vZfL',
  }],
  mode: "subscription",
  subscription_data: {
    trial_period_days: 3,
  },
  billing_address_collection: "auto",
  customer_email: session.user.email,
  client_reference_id: "true",
  line_items: [
    {
      price: params.priceId,
      quantity: 1,
    },
  ],
  metadata: {
    userId: session.user.id,
  },
})

3. 通过Stripe Webhook更新试用状态

当用户成功创建带试用期的订阅后,监听Stripe的customer.subscription.created Webhook事件,更新数据库中对应用户的has_used_trial字段为true,确保后续无法再次获取试用期。

Webhook核心处理逻辑示例

// 处理Stripe订阅创建事件
if (event.type === 'customer.subscription.created') {
  const subscription = event.data.object;
  const userId = subscription.metadata.userId;
  
  // 检查订阅是否包含试用期
  if (subscription.trial_start && subscription.trial_end) {
    await updateUserTrialStatus(userId, true);
  }
}

额外优化建议

  • 若允许用户在特定间隔后再次试用(如6个月),可通过trial_ended_at字段计算时间差,判断是否符合条件。
  • 在前端页面添加明确提示,告知用户仅能享受一次免费试用期,避免误解。

内容的提问来源于stack exchange,提问作者Nicolas Cassundé

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 02:20:12