用户利用了 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 发送了一条消息,他们说我们需要从网站的逻辑中添加它。
您可以使用结帐期间收集的卡付款方式上的
fingerprint
(API 参考)来限制此操作。完成后使用 customer.subscription.created
或 checkout.session.completed
事件,您可以检查客户提供的付款方式,如果检测到相同的 fingerprint
,您可以结束试用并执行任何您需要的操作,例如通过适当的消息。