gpt4 book ai didi

stripe-payments - Stripe v3 - SetupIntents 和订阅

转载 作者:行者123 更新时间:2023-12-04 11:06:36 53 4
gpt4 key购买 nike

我正在尝试使用 SetupIntents 来验证和保存付款方式,然后使用它创建订阅以向客户收取所需金额(立即然后每月)。

这似乎工作正常:

  • 该卡已验证(如果需要,包括 SCA)
  • 付款方式已创建,默认附加到客户并启用以供将来使用,状态为 SUCEEDED。
  • 订阅已创建并使用上述付款方式

  • 问题是,当提供的卡需要安全客户授权 (SCA) 时,Stripe 然后生成相应的发票和付款意图,但后者的状态为“requires_action”,即使正在使用正确的付款方式(为将来使用启用)并且已执行卡验证。

    我认为使用 SetupIntents 的全部意义在于事先验证付款方式,然后能够向客户收费。

    我的假设是否完全错误,或者这实际上是可能的,我可能只是遗漏了什么?

    提前致谢

    编辑 :这是后端的订阅创建代码:
    # Set the default payment method on the customer
    Stripe::Customer.update(
    stripe_customer_id,
    invoice_settings: {
    default_payment_method: @requested_source
    }
    )

    subscription = Stripe::Subscription.create({
    "customer" => stripe_customer_id,
    "proration_behavior" => 'create_prorations',
    "items" => [
    [
    "plan" => "#{@stripe_plan_api_id}",
    ],
    ],
    'default_tax_rates' => [
    "#{@stripe_tax_rate_id}",
    ],
    "expand" => ["latest_invoice.payment_intent"]
    });

    最佳答案

    谢谢你的问题,爱德华多。

    有几种方法可以创建 Subscription同时获得客户 SCA 身份验证和以后对卡收费的许可。假设我们已经创建了一个 Stripe Customer 对象并且他们的 ID 存储在 stripe_customer_id 中。 .根据您现在的流程,有几个步骤:

  • 创建 SetupIntent .请注意,如果您使用以下用法创建它:'off_session' 和 Customer确认后,它将附加生成的 PaymentMethod。
    setup_intent = Stripe::SetupIntent.create({
    customer: stripe_customer_id,
    usage: 'off_session',
    })
  • 收集付款详细信息并使用其 client_secret 确认 SetupIntent在将 PaymentMethod 附加到客户的客户端上。请注意,它将附加但不会设置为 invoice_settings.default_payment_method默认情况下,因此您需要稍后进行单独的 API 调用来更新 Customer (参见步骤 3)。
     stripe.confirmCardSetup(
    '{{setup_intent.client_secret}}',
    {
    payment_method: {
    card: cardElement,
    },
    }
    ).then(function(result) {
    // Handle result.error or result.setupIntent
    });
  • 更新 Customer并设置其 invoice_settings.default_payment_method等于PaymentMethod的ID在成功确认的 SetupIntent 上。
    Stripe::Customer.update(
    stripe_customer_id, {
    invoice_settings: {
    default_payment_method: 'pm_xxxx', # passed to server from client. On the client this is available on the result of confirmCardSetup
    }
    })
  • 创建 Subscriptionoff_session: true
    subscription = Stripe::Subscription.create({
    customer: stripe_customer_id,
    proration_behavior: 'create_prorations',
    items: [{
    plan: "#{@stripe_plan_api_id}",
    }],
    default_tax_rates: [
    "#{@stripe_tax_rate_id}",
    ],
    expand: ["latest_invoice.payment_intent"],
    off_session: true,
    })

  • 这使用所谓的“商家发起的交易”(MIT) 进行订阅的第一笔付款。如果订阅是在客户离开之后创建的,并且技术上应该可行,那么这在技术上是可以的。

    如果您在创建 Subscription 时客户在您的网站/应用程序上,还有另一个流程更正确,不需要对 SCA 使用 MIT 豁免。流程如下 Subscription未经审判:
  • 使用客户端上的 createPaymentMethod 收集卡详细信息(无 SetupIntent)
    stripe.createPaymentMethod({
    type: 'card',
    card: cardElement,
    }).then(function(result) {
    //pass result to your server.
    })
  • 将这些卡的详细信息附加到 Customer
    Stripe::PaymentMethod.attach(
    "pm_xxx", {
    customer: stripe_customer_id
    }
    )
  • 更新 Customerinvoice_settings.default_payment_method
    Stripe::Customer.update(
    stripe_customer_id,
    invoice_settings: {
    default_payment_method: @requested_source
    }
    )
  • 创建 Subscription (没有 off_session: true)
    subscription = Stripe::Subscription.create(
    customer: data['customerId'],
    items: [
    {
    price: 'price_H1NlVtpo6ubk0m'
    }
    ],
    expand: ['latest_invoice.payment_intent']
    )
  • 使用 Subscriptionlatest_invoicepayment_intentclient_secret收集付款详情并在客户端确认。
    stripe.confirmCardPayment(
    '{{subscription.latest_invoice.payment_intent.client_secret}}', { ......

  • 从 SCA 的角度来看,第二个支付流程更正确,以获得授权以对卡收费。此处的指南概述了第二种方法: https://stripe.com/docs/billing/subscriptions/fixed-price

    我们还有一个条纹样本,您可以在这里进行实验: https://github.com/stripe-samples/subscription-use-cases/tree/master/fixed-price-subscriptions

    关于stripe-payments - Stripe v3 - SetupIntents 和订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62454487/

    53 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com