Stripe 将 paymentMethod 添加到试用订阅并随后验证信用卡

Oro*_*vid 4 node.js stripe-payments reactjs payment-method

我正在研究与 React Node.js 的条带集成

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

但是,我正在尝试创建免费试用版而不收集信用卡详细信息,稍后当试用期结束时,我想收集信用卡详细信息

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

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

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

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

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

小智 5

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

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

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