You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不覆写现有订阅的情况下完成带3D Secure的订阅更新?

带3D Secure的订阅更新正确实现方式

核心思路就是先通过草稿发票完成支付验证,再正式更新订阅,这样既不会让原有订阅陷入incomplete状态,又能正常处理3D Secure验证流程:

服务端操作步骤

  • 针对现有订阅,创建一张草稿发票,把要调整的订阅内容(比如更换价格、修改产品数量)包含进去,调用Stripe的stripe.invoices.create接口时传入以下参数:
    const draftInvoice = await stripe.invoices.create({
      subscription: '你的现有订阅ID',
      items: [
        // 这里定义订阅的变更条目,比如替换原有价格
        {
          id: '现有订阅中的条目ID',
          price: '新的价格ID'
        }
      ],
      payment_behavior: 'allow_incomplete',
      collection_method: 'charge_automatically',
      status: 'draft'
    });
    
  • 此时草稿发票会关联一个payment_intent,检查它的状态:
    • 如果状态是requires_action,就把draftInvoice.payment_intent.client_secret发送给客户端。
    • 如果状态是succeeded,说明无需3D验证,直接进行后续收尾操作即可。

客户端操作步骤

  • 收到client_secret后,调用confirmCardPayment完成3D Secure验证:
    const { error } = await stripe.confirmCardPayment(clientSecret, {
      payment_method: '客户的支付方式ID'
    });
    
  • 验证成功后,通知服务端执行后续操作。

验证通过后的收尾操作

  • 服务端收到验证成功的通知后,将草稿发票标记为完成:
    const finalizedInvoice = await stripe.invoices.finalizeInvoice(draftInvoice.id);
    
  • 这时候Stripe会自动完成原有订阅的更新,新订阅状态正常,不会处于incomplete。

方案优势

  • 草稿发票不会修改原有订阅,只有当发票完成且支付成功后,订阅才会被更新,完全避免了原有订阅被意外覆写的问题。
  • 通过payment_behavior: 'allow_incomplete'生成的payment_intent可以正常处理3D Secure验证,验证完成后再应用订阅变更,完美匹配你的需求。

内容的提问来源于stack exchange,提问作者zaarr78

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 10:40:35