0

我正在处理的用例很常见,但我需要一些建议来可视化它。每个用户可以有多个他们可以订阅的项目。

例如,用户名下有两个项目,项目 X 和项目 Y。现在每个项目都有自己的订阅。

对于每个项目特定的付款,我如何标记客户 -> 项目 -> 订阅?

我可以使用订阅标记客户,但不确定如何将订阅标记为项目。

我在想类似的东西

  1. 在用户创建时,添加一个客户。
  2. 在项目创建中添加带有价格的产品。
  3. 结帐
  4. 会议
  5. 订阅/结帐完成
  6. 更新数据库

我看到这个问题,如果我更改价格计划,我将不得不在所有地方进行更新。:(

实现这一目标的最佳/其他选择是什么?为此,我正在使用 Nextjs 和 Supbase。按照这个例子。 https://github.com/vercel/nextjs-subscription-payments

4

2 回答 2

2

首先,您应该为您的订阅计划创建一个product和一些pricesprice代表您的订阅计划的实体。

Alookup_key用于从静态字符串中动态检索价格,如果transfer_lookup_key设置为 true,将从现有价格中自动删除查找键,并将其分配给该价格。因此,您始终可以通过使用lookup_key并设置为transfer_lookup_keytrue 来检索计划的最新价格。

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,
});
于 2021-05-22T06:40:07.923 回答
1

您可以使用元数据来“标记” Stripe 中的事物以映射到数据模型中的事物。

如果您想更改价格,是的,您必须更新所有订阅。相反,您可能希望查看使用数量或计量计费。https://stripe.com/docs/billing/subscriptions/model

于 2021-05-21T09:02:42.100 回答