Добавляйте подписки на стипендию для разных проектов каждого пользователя

Вариант использования, над которым я работаю, является распространенным, но мне нужны некоторые предложения, чтобы его визуализировать. У каждого пользователя может быть несколько проектов, на которые он может подписаться.

Так, например, у пользователя есть два проекта на свое имя: Project X и Project Y. Теперь каждый имеет свои собственные подписки.

Как я могу пометить клиента -> проект -> подписка для каждого платежа, относящегося к проекту?

Я могу помечать клиентов подписками, но не знаю, как пометить подписку на проект.

Я думал что-то вроде

  1. При создании пользователя добавление клиента.
  2. В проект создать добавьте товар с ценами.
  3. Касса
  4. Сессия
  5. Подписки / оформление заказа завершено
  6. обновить БД

Проблема с этим я вижу, если я изменю тарифные планы, мне придется обновлять во всех местах. :(

Каковы лучшие / другие альтернативы для этого? Для этого я использую Nextjs с Supabase. Следуя этому примеру.https://github.com/vercel/nextjs-subscription-payments

2 ответа

Сначала вы должны создать сингл product и немного pricesдля ваших планов подписки. Представляет сущность вашего плана подписки.

A используется для динамического получения цен из статической строки, и, если установлено значение true, атомарно удаляет ключ поиска из существующей цены и присваивает его этой цене. Таким образом, вы всегда можете получить самую новую цену плана, используя и установив transfer_lookup_key правда.

      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, которую я предполагал.

      // 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
}

Когда пользователь создаст новый проект и выберет свой план подписки, вы создадите новый и передадите соответствующую позицию с. Вы можете получить текущий выбранный тариф, используя.

      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 object и перенесите свой БД в webhook.

Затем предположим, что вы хотите изменить цену плана «профессиональный» с 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,
});

Вы можете использовать метаданные, чтобы «пометить» объекты в Stripe, чтобы сопоставить их с объектами в вашей модели данных.

Если вы хотите изменить цены, да, вам придется обновить все подписки. Вместо этого вы можете использовать либо количество, либо выставление счетов по счетчику. https://stripe.com/docs/billing/subscriptions/model

Другие вопросы по тегам