3

我正在与 react node.js 进行条带集成

在没有试用的情况下创建订阅时,我没有任何问题,所有用例都非常简单。

但是,我正在尝试在不收集信用卡详细信息的情况下创建免费试用版,稍后当试用期到期时,我想收集信用卡详细信息

服务器端:创建没有付款方式的试用订阅:

  const subscription = await stripe.subscriptions.create({
    customer: customer.id,
    items: [{ price: priceId }],
    trial_end: expiredAt.unix(),
    expand: ['latest_invoice.payment_intent'], 
  });

ClientSide:稍后当试用期结束时,我想收集信用卡详细信息(paymentMethod),检查是否由于失败或 3ds 需要用户操作,并通过更新客户的默认 payment_method 来更新订阅:

  const updateCustomerDefaultPaymentMethod = await stripe.customers.update(
    customerId,
    {
      invoice_settings: {
        default_payment_method: req.body.paymentMethodId,
      },
    }
  );

如何更新订阅以执行 paymentIntent 或向用户收费,并以与创建没有试用期的订阅时相同的状态“in_complete”返回给客户端相同的订阅对象?目前,在运行我的代码时,我不断收到 status='active',因为第一张发票的 status='paid' 价格为 '0$'。

4

1 回答 1

3

在免费试用的情况下,创建订阅不会导致初始付款,Stripe 会自动为您创建一个SetupIntent。此 SetupIntent 旨在收集客户的付款方式时使用。因此,在试用期间的任何时候,客户都需要返回您的应用程序以输入他们的信用卡详细信息,然后您将使用 SetupIntent 保存这些信息:

一旦付款方式设置并保存给客户(作为发票的默认付款方式),它将用于在试用期结束时支付订阅的第一张发票。试用后第一笔付款被视为非会话付款(最后一个常见问题解答),因此如果付款失败,Stripe 将尝试使用通常的智能重试和催款功能收回付款。

简而言之,您需要使用已创建(并附加到订阅)的 SetupIntent 来保存用户的付款信息。

于 2020-10-26T17:20:36.173 回答