如何在Stripe中指定订阅的时长

4
我正在实现Stripe订阅功能,但在创建结账会话时,我无法在API文档中找到如何指定订阅持续时间的信息。以下是我目前的代码:
    const customer = await stripe.customers.create({
      description: "My First Test Customer (created for API docs)",
      email: "some.email@gmail.com",
      address: {
        city: 'Toronto',
        country: 'CA',
        line1: "Some Address",
        line2: "Some unit number",
        postal_code: "M5G0V1",
        state: "ON",
      },
      name: "Some Name",
      phone: "Some Number",
    }); 
    const price = await stripe.prices.create({
      unit_amount: 599,
      currency: 'cad',
      recurring: {interval: 'month', interval_count: '1'},
      product: 'prod_KZfHFK4nfCqlGS',
    });
    const subscriptionSchedule = await stripe.subscriptionSchedules.create({
      customer: customer.id,
      start_date: 'now',
      end_behavior: 'cancel',
      phases: [
        {
          items: [
            {
              price: price.id,
              quantity: 1,
            },
          ],
          iterations: 24,
        },
      ],
    });
    console.log(subscriptionSchedule);
    const session = await stripe.checkout.sessions.create({
      success_url: 'http://localhost:8080/stripeSessionSuccessHook',
      cancel_url: 'http://localhost:8080/stripeSessionCancelHook',
      payment_method_types: ['card'],
      customer: customer.id,
      line_items: [
        {price: price.id, quantity: 1},
      ],
      mode: 'subscription',
    });

我正在尝试创建一个订阅服务,客户每月支付24个月的费用。我使用答案中建议的“订阅计划”,确实创建出了这样一个24个月的订阅服务。但是,当创建新的结帐时,在支付成功的情况下,它会创建一项为期12个月的订阅服务......最终,我有了两个订阅服务。一个是通过订阅计划创建的(24个月,预期的那个),另一个是订阅服务(12个月)。是否有办法将此订阅计划传递给结帐,以便不会创建2个订阅服务?
1个回答

7

如果订阅已支付,每个计费周期后都会自动续订。重复间隔设置在价格中,最大重复间隔为一年。

如果您想在两年后结束订阅,则需要使用订阅计划:https://stripe.com/docs/billing/subscriptions/subscription-schedules

对于您的用例,使用具有 recurring.interval=year 的价格,您将创建一个订阅计划,其中包含一个单独的阶段,具有 iterations=2end_behavior=cancel

您可以参考此示例:https://stripe.com/docs/billing/subscriptions/subscription-schedules/use-cases#installment-plans

请注意,订阅计划当前无法与 Checkout 或 Customer Portal 一起使用。如果要使用 Checkout,则可以采取以下解决方法:

  1. 客户通过结账支付订阅费用
  2. 为现有(已付费)订阅创建订阅计划:https://stripe.com/docs/billing/subscriptions/subscription-schedules/use-cases#existing-subscription
  3. 更新新创建的订阅计划参数,以在2年后结束订阅:https://stripe.com/docs/api/subscription_schedules/update

您不应该依赖成功重定向来执行客户端上的任何重要操作。在客户端上,客户可能会在重定向发生之前关闭浏览器窗口或退出应用程序。您需要设置一个Webhook来监听checkout.session.completed事件,并在收到此事件时创建订阅计划。

您可以在此处了解更多关于设置Webhook的信息:


谢谢您的指导。我已经更新了我的代码,并描述了问题。如果您知道如何避免重复订阅创建,我将不胜感激。 - Elvin Jafali
已更新以回答您的问题。 - alex
谢谢Alex!我认为这听起来很正规。我本来想以这种方式做,但我在我的脑海中唯一错误的地方是,客户付款后,重定向将转到后端终点,我会操作订阅(添加到订阅计划),然后重定向到某个页面。但是 Webhook 听起来更好。如果我让它工作,我会发布我的解决方案。 - Elvin Jafali
我想回来提一下,从现有的计划创建订阅计划后,您需要进行单独的API调用以更新相关参数,以在2年后结束订阅:https://stripe.com/docs/api/subscription_schedules/update - alex
1
谢谢Alex,终于搞定了!不得不多次重新阅读你在这里提出的建议。 - Elvin Jafali

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接