Добавляйте подписки на стипендию для разных проектов каждого пользователя
Вариант использования, над которым я работаю, является распространенным, но мне нужны некоторые предложения, чтобы его визуализировать. У каждого пользователя может быть несколько проектов, на которые он может подписаться.
Так, например, у пользователя есть два проекта на свое имя: Project X и Project Y. Теперь каждый имеет свои собственные подписки.
Как я могу пометить клиента -> проект -> подписка для каждого платежа, относящегося к проекту?
Я могу помечать клиентов подписками, но не знаю, как пометить подписку на проект.
Я думал что-то вроде
- При создании пользователя добавление клиента.
- В проект создать добавьте товар с ценами.
- Касса
- Сессия
- Подписки / оформление заказа завершено
- обновить БД
Проблема с этим я вижу, если я изменю тарифные планы, мне придется обновлять во всех местах. :(
Каковы лучшие / другие альтернативы для этого? Для этого я использую 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