首先,您应该为您的订阅计划创建一个product
和一些prices
。price
代表您的订阅计划的实体。
Alookup_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
}
当用户创建新项目并选择他/她的订阅计划时,您将创建新 checkout.session
项目并通过price
. 您可以使用 获取当前price
选择的计划lookup_key
。
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',
});
然后,您可以在 webhookcheckout.session.completed
中接收对象并迁移您的数据库。checkout.session
接下来,假设您要将“pro”计划的价格从 20 美元更改为 30 美元。在这种情况下,您将price
使用相同的方式创建新的lookup_key
。通过这样做,您可以更改新订阅者的订阅价格,而无需更改向现有订阅者收取的金额。
const newProPrice = await stripe.prices.create({
unit_amount: 30,
currency: 'usd',
recurring: {interval: 'month'},
product: product.id,
lookup_key: 'pro',
transfer_lookup_key: true,
});