为每个用户的不同项目添加条带订阅
Add stipe stripe subscriptions for different projects of each user
我正在处理的用例很常见,但我需要一些建议来可视化它。
每个用户可以有多个他们可以订阅的项目。
例如,用户名下有两个项目,项目 X 和项目 Y。现在每个项目都有自己的订阅。
对于每个项目特定的付款,我如何标记客户 -> 项目 -> 订阅?
我可以通过订阅来标记客户,但不确定如何将订阅标记为项目。
我在想
- 在创建用户时,添加一个客户。
- 在项目创建中添加带有价格的产品。
- 结账
- 会话
- 订阅/结帐已完成
- 更新数据库
我看到这个有问题,如果我改变价格计划,我将不得不更新所有地方。 :(
实现此目标的 best/other 替代方案是什么?
为此,我将 Nextjs 与 Supabase 结合使用。按照这个例子。
https://github.com/vercel/nextjs-subscription-payments
您可以使用 metadata 到 'tag' Stripe 中的内容来映射到您的数据模型中的内容。
如果您想更改价格,是的,您必须更新所有订阅。相反,您可能想要查看使用数量或计量计费。 https://stripe.com/docs/billing/subscriptions/model
首先,您应该为您的订阅计划创建一个 product
和一些 prices
。 price
代表您订阅计划的实体。
A lookup_key
用于从静态字符串中动态检索价格,如果 transfer_lookup_key
设置为 true,将从现有价格中自动删除查找键,并将其分配给此价格.因此,您始终可以使用 lookup_key
并设置 transfer_lookup_key
true 来检索计划的最新价格。
const product = await stripe.products.create({
name: 'MyService', // your service name
});
const beginnerPrice = await stripe.prices.create({
unit_amount: 5,
currency: 'usd',
recurring: {interval: 'month'},
product: product.id,
lookup_key: 'beginner',
transfer_lookup_key: true,
});
const proPrice = await stripe.prices.create({
unit_amount: 20,
currency: 'usd',
recurring: {interval: 'month'},
product: product.id,
lookup_key: 'pro',
transfer_lookup_key: true,
});
这是我假设的数据库模式。
// db schema
interface IUser{
id: string
stripeCustomerId: string
}
interface IProject{
id: string
userId: string
}
interface IProjectSubscription{
id: string
projectId: string
stripeSubscriptionId: string // or/and stripeCheckoutSessionId, it's up to your use case
}
当用户创建新项目和 select his/her 订阅计划时,您将创建新的 checkout.session
并通过 price
传递相应的行项目。您可以使用 lookup_key
.
获取当前 price
的 selected 计划
const prices = await stripe.prices.list({
lookup_keys: ['pro'],
type: 'recurring',
limit: 1,
});
const session = await stripe.checkout.sessions.create({
success_url: 'https://example.com/success',
cancel_url: 'https://example.com/cancel',
payment_method_types: ['card'],
line_items: [
{price: prices[0].id, quantity: 1},
],
mode: 'subscription',
});
然后在 checkout.session.completed
,您可以接收 checkout.session
对象并在 webhook 中迁移您的数据库。
接下来,假设您想将 'pro' 计划的价格从 20 美元更改为 30 美元。在这种情况下,您将创建具有相同 lookup_key
的新 price
。通过这样做,您可以更改新订阅者的订阅价格,而不会更改向现有订阅者收取的费用。
const newProPrice = await stripe.prices.create({
unit_amount: 30,
currency: 'usd',
recurring: {interval: 'month'},
product: product.id,
lookup_key: 'pro',
transfer_lookup_key: true,
});
我正在处理的用例很常见,但我需要一些建议来可视化它。 每个用户可以有多个他们可以订阅的项目。
例如,用户名下有两个项目,项目 X 和项目 Y。现在每个项目都有自己的订阅。
对于每个项目特定的付款,我如何标记客户 -> 项目 -> 订阅?
我可以通过订阅来标记客户,但不确定如何将订阅标记为项目。
我在想
- 在创建用户时,添加一个客户。
- 在项目创建中添加带有价格的产品。
- 结账
- 会话
- 订阅/结帐已完成
- 更新数据库
我看到这个有问题,如果我改变价格计划,我将不得不更新所有地方。 :(
实现此目标的 best/other 替代方案是什么? 为此,我将 Nextjs 与 Supabase 结合使用。按照这个例子。 https://github.com/vercel/nextjs-subscription-payments
您可以使用 metadata 到 'tag' Stripe 中的内容来映射到您的数据模型中的内容。
如果您想更改价格,是的,您必须更新所有订阅。相反,您可能想要查看使用数量或计量计费。 https://stripe.com/docs/billing/subscriptions/model
首先,您应该为您的订阅计划创建一个 product
和一些 prices
。 price
代表您订阅计划的实体。
A lookup_key
用于从静态字符串中动态检索价格,如果 transfer_lookup_key
设置为 true,将从现有价格中自动删除查找键,并将其分配给此价格.因此,您始终可以使用 lookup_key
并设置 transfer_lookup_key
true 来检索计划的最新价格。
const product = await stripe.products.create({
name: 'MyService', // your service name
});
const beginnerPrice = await stripe.prices.create({
unit_amount: 5,
currency: 'usd',
recurring: {interval: 'month'},
product: product.id,
lookup_key: 'beginner',
transfer_lookup_key: true,
});
const proPrice = await stripe.prices.create({
unit_amount: 20,
currency: 'usd',
recurring: {interval: 'month'},
product: product.id,
lookup_key: 'pro',
transfer_lookup_key: true,
});
这是我假设的数据库模式。
// db schema
interface IUser{
id: string
stripeCustomerId: string
}
interface IProject{
id: string
userId: string
}
interface IProjectSubscription{
id: string
projectId: string
stripeSubscriptionId: string // or/and stripeCheckoutSessionId, it's up to your use case
}
当用户创建新项目和 select his/her 订阅计划时,您将创建新的 checkout.session
并通过 price
传递相应的行项目。您可以使用 lookup_key
.
price
的 selected 计划
const prices = await stripe.prices.list({
lookup_keys: ['pro'],
type: 'recurring',
limit: 1,
});
const session = await stripe.checkout.sessions.create({
success_url: 'https://example.com/success',
cancel_url: 'https://example.com/cancel',
payment_method_types: ['card'],
line_items: [
{price: prices[0].id, quantity: 1},
],
mode: 'subscription',
});
然后在 checkout.session.completed
,您可以接收 checkout.session
对象并在 webhook 中迁移您的数据库。
接下来,假设您想将 'pro' 计划的价格从 20 美元更改为 30 美元。在这种情况下,您将创建具有相同 lookup_key
的新 price
。通过这样做,您可以更改新订阅者的订阅价格,而不会更改向现有订阅者收取的费用。
const newProPrice = await stripe.prices.create({
unit_amount: 30,
currency: 'usd',
recurring: {interval: 'month'},
product: product.id,
lookup_key: 'pro',
transfer_lookup_key: true,
});