如何使用 3d 安全流在一张发票中处理产品和订阅?

Posted

技术标签:

【中文标题】如何使用 3d 安全流在一张发票中处理产品和订阅?【英文标题】:How to handle products and subscriptions in one invoice with 3d secure flow on stripe? 【发布时间】:2021-06-23 02:02:33 【问题描述】:

伙计们!第一次接触条纹对此类问题感到困惑 - 需要在一次付款中为组合产品 + 订阅付款(如果需要,则使用 3d 安全流程)并为客户发送一张总发票。所以我做了这样一个计划:

    创建条带客户 根据卡元素创建付款方式 向客户附加付款方式 创建订阅。 创建 paymentIntent(如果需要 3ds,则使用返回 url 属性)以在客户卡上存钱。 当我从配送服务处获得订单状态为“已发送”的信息时,从客户卡中扣款。

但是当我开始列表的第 4 点时,我因为条带上的订阅逻辑而感到困惑。正如我从文档中得到的那样,订阅将创建自己的付款意图、自己的发票并要求自己的 3ds。所以我很困惑,因为看起来用户需要为产品和子产品传递两个 3ds,将在两次不同的付款中支付这两种费用,并将获得两张发票。我错过了什么?为什么订阅不能附加到“主要”付款,在3ds过去后由它支付并在之后激活?为什么我应该拆分它们并使其比一张单一的付款/发票更复杂?

从代码的角度来看它的外观(只是没有任何侧面操作的模型):

    创建用户
const customer = await stripe.customers.create(
        email,
        address,
        name,
);
    创建付款方式
const  paymentMethod  = await stripe.createPaymentMethod(
        type: "card",
        card: cardElement,
        billing_details: 
          address: 
            city,
            country,
            line1: address1,
            line2: address2,
            postal_code: zip,
          ,
          email,
          name,
        ,
      );
    向客户附加付款方式
const paymentMethod = await stripe.paymentMethods.attach(paymentId, 
      customer,
    );
    创建付款意图以持有资金
const order = await stripe.paymentIntents.create(
      amount: sum * 100,
      currency: unit,
      description: "project name",
      customer,
      payment_method: paymentId,
      setup_future_usage: "off_session",
      confirm: true,
      capture_method: "manual", // to hold money
      receipt_email: email,
      return_url: returnUrl,   // to return after 3ds
    );
    创建订阅
const subs = await stripe.subscriptions.create(
      customer: customerId,
      items: subscriptions,
      expand: ["latest_invoice.payment_intent"], 
    );

if (subs.status === "incomplete" && subs.latest_invoice.payment_intent) 
        await stripe
          .confirmCardPayment(
            subs.latest_invoice.payment_intent.client_secret,
            
              payment_method: 
                card: cardElement,
              ,
            
          )
      

/* the only way i found to pass 3ds on sub without getting "incomplete" status
but it provide second 3ds for subs */
    为 3ds 重定向
const action = order.next_action;
      if (action && action.type === "redirect_to_url") 
        window.location = action.redirect_to_url.url;
      
    在 3ds 后被重定向后 - 抓钱
    await stripe.paymentIntents.capture(paymentId);

所以最终结果是 - 我有两笔付款(一笔 - 我计算的是总篮子的产品 - 订阅价格,第二个 - 订阅),每个有两个 3ds,订阅创建的 1 个发票,完全错过了产品发票逻辑,因为我不明白如何处理发票和意图的双重支付,这似乎是拐杖。

【问题讨论】:

【参考方案1】:

您可以在创建订阅时添加其他项目,这可能是您想要在此处执行的操作:https://stripe.com/docs/billing/invoices/subscription#first-invoice-extra

【讨论】:

行得通!非常感谢,但请您再解释两件事好吗?在创建付款意图时,我们可以通过 method="manual" 来持有资金并稍后调用 .capture,我该怎么做呢?如我所见,订阅不提供此类道具。第二 - 我如何在 3ds 之后重定向?与付款意图相同,它具有 return_url 属性。对不起,我很笨。

以上是关于如何使用 3d 安全流在一张发票中处理产品和订阅?的主要内容,如果未能解决你的问题,请参考以下文章

使用产品结账时如何用 laravel + cashier 生成发票

一张销售单一张增值税专用发票会计明细科目怎么写?

PayPal Pro 托管解决方案和 3D 安全卡

从智能门锁,看3D视觉的安全性突围

Stripe 更新订阅并使用 3d 安全添加新的付款方式

Stripe:如何更新通过订阅结帐会话创建的发票?