Next.js 为每个用户的不同项目添加条带订阅

Next.js 为每个用户的不同项目添加条带订阅,next.js,stripe-payments,supabase,Next.js,Stripe Payments,Supabase,我正在处理的用例很常见,但我需要一些建议来可视化它。 每个用户都可以订阅多个项目 例如,用户有两个项目,项目X和项目Y。现在每个项目都有自己的订阅 对于每个特定于项目的付款,我如何标记客户->项目->订阅 我可以用订阅标记客户,但不确定如何标记项目的订阅 我在想 在用户创建时,添加客户 在“项目创建”中,添加具有价格的产品 结帐 会议 订阅/签出已完成 更新数据库 我看到这一个的问题,如果我改变价格计划,我将不得不在所有地方更新( 实现这一目标的最佳/其他备选方案是什么? 我正在使用Nextjs

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

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

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

我可以用订阅标记客户,但不确定如何标记项目的订阅

我在想

  • 在用户创建时,添加客户
  • 在“项目创建”中,添加具有价格的产品
  • 结帐
  • 会议
  • 订阅/签出已完成
  • 更新数据库
  • 我看到这一个的问题,如果我改变价格计划,我将不得不在所有地方更新(

    实现这一目标的最佳/其他备选方案是什么? 我正在使用Nextjs和Supabase来实现这一点。

    您可以使用“标记”条带中的内容,以映射到数据模型中的内容

    如果您想更改价格,是的,您必须更新所有订阅。相反,您可能希望查看使用数量或计量计费。

    您可以使用“标记”条带中的内容,以映射到数据模型中的内容


    如果您想更改价格,是的,您必须更新所有订阅。相反,您可能希望查看使用数量或计量计费。

    首先,您应该为您的订阅计划创建一个
    产品和一些
    价格。
    价格
    表示订阅的实体安

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

    const product=wait stripe.products.create({
    名称:'MyService',//您的服务名称
    });
    const初学者price=等待stripe.prices.create({
    单位金额:5,
    货币:美元,
    重复:{间隔:'月'},
    product:product.id,
    查找键:“初学者”,
    传输\u查找\u键:true,
    });
    const proPrice=wait stripe.prices.create({
    单位金额:20,
    货币:美元,
    重复:{间隔:'月'},
    product:product.id,
    查找键:“pro”,
    传输\u查找\u键:true,
    });
    
    这是我假设的db模式

    //数据库模式
    接口IUser{
    id:字符串
    stripeCustomerId:字符串
    }
    接口项目{
    id:字符串
    userId:string
    }
    接口IProjectSubscription{
    id:字符串
    projectId:字符串
    stripeSubscriptionId:string//或/和stripeCheckoutSessionId,这取决于您的用例
    }
    
    当用户创建新项目并选择其订阅计划时,您将创建新的
    checkout.session
    ,并使用
    price
    传递相应的行项目。您可以使用
    lookup\u键
    获取所选计划的当前
    price

    const prices=wait stripe.prices.list({
    查找键:[pro'],
    类型:'重复',
    限额:1,,
    });
    const session=wait stripe.checkout.sessions.create({
    成功链接:'https://example.com/success',
    取消url:'https://example.com/cancel',
    付款方式类型:[“卡”],
    行项目:[
    {price:prices[0].id,数量:1},
    ],
    模式:“订阅”,
    });
    
    然后在
    checkout.session.completed
    上,您可以接收
    checkout.session
    对象并在webhook中迁移数据库

    接下来,假设您希望将“pro”计划的价格从20美元更改为30美元。在这种情况下,您将使用相同的
    lookup_key
    创建新的
    price
    。这样,您就可以更改新订户的订阅价格,而无需更改向现有订户收取的金额

    const newProPrice=wait stripe.prices.create({
    单位金额:30,
    货币:美元,
    重复:{间隔:'月'},
    product:product.id,
    查找键:“pro”,
    传输\u查找\u键:true,
    });
    
    首先,您应该为订阅计划创建单个
    产品
    和一些
    价格
    价格
    代表订阅计划的实体

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

    const product=wait stripe.products.create({
    名称:'MyService',//您的服务名称
    });
    const初学者price=等待stripe.prices.create({
    单位金额:5,
    货币:美元,
    重复:{间隔:'月'},
    product:product.id,
    查找键:“初学者”,
    传输\u查找\u键:true,
    });
    const proPrice=wait stripe.prices.create({
    单位金额:20,
    货币:美元,
    重复:{间隔:'月'},
    product:product.id,
    查找键:“pro”,
    传输\u查找\u键:true,
    });
    
    这是我假设的db模式

    //数据库模式
    接口IUser{
    id:字符串
    stripeCustomerId:字符串
    }
    接口项目{
    id:字符串
    userId:string
    }
    接口IProjectSubscription{
    id:字符串
    projectId:字符串
    stripeSubscriptionId:string//或/和stripeCheckoutSessionId,这取决于您的用例
    }
    
    当用户创建新项目并选择其订阅计划时,您将创建新的
    checkout.session
    ,并使用
    price
    传递相应的行项目。您可以使用
    lookup\u键
    获取所选计划的当前
    price

    const prices=wait stripe