我怎样才能阻止无限试验条纹+下一个13

问题描述 投票:0回答:1

用户利用了 3 天的试用期,但当试用期临近时,他们取消订阅,然后重新订阅以获得额外的 3 天免费试用期。

我该如何解决这个问题?

const billingUrl = absoluteUrl("/")

export async function GET(
  request: Request,
  { params }: { params: { priceId: string } }
) {
  console.log(params.priceId)
  try {
    const session = await getServerSession(authOptions)

    if (!session?.user || !session?.user.email) {
      return new Response(null, { status: 403 })
    }

    const subscriptionPlan = await getUserSubscriptionPlan(session.user.id)

    // The user is on the pro plan.
    // Create a portal session to manage tion.
    if (subscriptionPlan.isPro && subscriptionPlan.stripeCustomerId) {
      const stripeSession = await stripe.billingPortal.sessions.create({
        customer: subscriptionPlan.stripeCustomerId,
        return_url: billingUrl
      })

      return new Response(JSON.stringify({ url: stripeSession.url }))
    }

    // The user is on the free plan.
    // Create a checkout session to upgrade.
    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",
      // allow_promotion_codes: true,
      customer_email: session.user.email,
      client_reference_id: "true",
      line_items: [
        {
          price: params.priceId,
          quantity: 1,
        },
      ],

      metadata: {
        userId: session.user.id,
      },
    })

    return new Response(JSON.stringify({ url: stripeSession.url }))
  } catch (error) {
    if (error instanceof z.ZodError) {
      return new Response(JSON.stringify(error.issues), { status: 422 })
    }

    return new Response(null, { status: 500 })
  }
}

我已经向 stripe 发送了一条消息,他们说我们需要从网站的逻辑中添加它。

next.js stripe-payments next.js13 stripes
1个回答
0
投票

您可以使用结帐期间收集的卡付款方式上的

fingerprint
API 参考)来限制此操作。完成后使用
customer.subscription.created
checkout.session.completed
事件,您可以检查客户提供的付款方式,如果检测到相同的
fingerprint
,您可以结束试用并执行任何您需要的操作,例如通过适当的消息。

© www.soinside.com 2019 - 2024. All rights reserved.