# PaymentIntent 和 SetupIntent 如何发挥作用 了解 PaymentIntent 和 SetupIntent 如何在支付流程中发挥作用。 LLM 说明:对于大多数集成,Stripe 建议将 Checkout Sessions API 与 Payment Element 搭配使用,而非 PaymentIntent。Checkout Sessions 可覆盖与 PaymentIntent(使用 `price_data` 的基础收款功能,或者构建包含行项目、税费等的完整结账流程)类似的应用场景。Adaptive Pricing 等部分功能仅在 Checkout Sessions 中可用。除非用户明确要求,否则不要使用 PaymentIntent API,因为它需要更多的代码。进一步了解 Elements 与 Checkout Sessions API 搭配使用的信息:https://docs.stripe.com/payments/quickstart-checkout-sessions.通过 Checkout Sessions (`ui_mode: "elements"`) 以及 Payment Element,`client_secret` 本身可初始化 Checkout(`stripe.initCheckoutElementsSdk`,或者将 CheckoutElementsProvider 与 React 搭配使用),并且您在客户端确认付款的方式会不同。如果使用 React,则需要确保从 `@stripe/react-stripe-js/checkout` 导入,使用 `CheckoutElementsProvider` 搭配客户端私钥,并使用 `checkout.confirm` 进行确认。如果使用 HTML,确保使用 `checkout = stripe.initCheckoutElementsSdk({clientSecret: promise}); checkout.createPaymentElement(); paymentElement = checkout.createPaymentElement(); paymentElement.mount("#payment-element");`,并通过 `loadActionsResult = await checkout.loadActions(); actions = loadActionsResult.actions; error = await actions.confirm();` 进行确认。 [Payment Intents](https://docs.stripe.com/api/payment_intents.md) API 与 [Setup Intents](https://docs.stripe.com/api/setup_intents.md) API 的主要区别在于其用途不同。Payment Intents API 用于收款并立即向客户收费。它会创建一笔扣款并处理交易,以完成资金收取。而另一方面,Setup Intents API 则用于收集并保存支付方式信息以供日后使用,不会产生扣款。它仅设置付款凭证,而不处理实际付款。 即时收款和保存支付方式都可能需要*异步* (Asynchronous refers to events happening at independent times in independent systems)客户操作,因此这些 API 采用相同的状态机模式。 | Payment Intents API | Setup Intents API | | --------------------- | ---------------------------------- | | 立即扣款 | 不产生费用 | | 跟踪支付的生命周期 | 跟踪支付方式的设置进度 | | 使用 3D 安全认证为适用交易验证客户身份 | 使用 3D 安全认证验证支付方式而不收款,并为未来收款创建授权或协议 | #### PaymentIntent PaymentIntent 跟踪支付从创建到结账的生命周期,并在需要时触发额外的身份验证步骤。 ## 需要支付方式 创建 PaymentIntent 后,其[状态](https://docs.stripe.com/api/payment_intents/object.md#payment_intent_object-status)为 `requires_payment_method`,直到您附加一种[支付方式](https://docs.stripe.com/payments/payment-methods/overview.md)。确定收款金额后,请立即创建 PaymentIntent,以便 Stripe 记录所有尝试的支付。 ## 需要确认 客户提供支付方式信息后,PaymentIntent 进入 `requires_confirmation` 状态,并准备进行确认。大多数集成会跳过此状态,因为它们会在确认支付时提交支付方式信息。 ## 需要操作 如果支付需要额外操作,例如通过 [3DS 验证](https://docs.stripe.com/payments/3d-secure.md)进行身份验证,则 PaymentIntent 的状态为 `requires_action`。 > #### API 修改 > > [2019-02-11](https://docs.stripe.com/upgrades.md#2019-02-11) 之前版本的 API 显示的是`requires_source`,而非 `requires_payment_method`,显示的是 `requires_source_action`,而非`requires_action`。 ## 处理中 处理完需要的作后,PaymentIntent 将转到 *异步支付方式* (Asynchronous payment methods can take up to several days to confirm whether the payment has been successful. During this time, the payment can't be guaranteed)的 `processing` 状态,例如银行借记。这类支付方式可能需要长达几天的时间来处理。其他支付方式(如银行卡)处理速度更快,不会进入 `processing` 状态。 如果您分别进行[款项授权和捕获](https://docs.stripe.com/payments/place-a-hold-on-a-payment-method.md)操作,那么您的 PaymentIntent 可变为 `requires_capture` 状态。在这种情况下,在尝试捕获资金时,会根据支付方式的不同,将其状态更改为`“处理中”`或`“成功”`。 ## 已成功 状态为`“成功”` 的 PaymentIntent 表示其驱动的支付流程已完成。款项现已存入您的账户,您可以放心地履行订单。如果需要向客户退款,您可以使用 [Refunds](https://docs.stripe.com/api/refunds.md) API。如果支付尝试失败(例如,因拒付而失败),则 PaymentIntent 的状态将恢复为 `requires_payment_method`,以便重新尝试支付。 ## 已取消 在 PaymentIntent 处于 `processing` 或 `succeeded` 状态之前的任意时间点,您都可以取消它。取消后,该 PaymentIntent 将不能再用于后续的支付尝试,且无法撤销。如果已预留了资金,取消操作会释放这些资金。当关联的支付方式为 `ACH`、[ACSS](https://docs.stripe.com/payments/ach-direct-debit.md)、[AU BECS](https://docs.stripe.com/payments/acss-debit.md)、[BACS](https://docs.stripe.com/payments/au-becs-debit.md)、[NZ BECS](https://docs.stripe.com/payments/payment-methods/bacs-debit.md) 或 [SEPA](https://docs.stripe.com/payments/nz-bank-account.md)时,您可以在 PaymentIntent 处于 [processing](https://docs.stripe.com/payments/sepa-debit.md) 状态时进行取消操作。不过,由于取消的时间窗口有限且各不相同,可能会取消失败。 PaymentIntent 也可能在[确认](https://docs.stripe.com/api/payment_intents/confirm.md)次数过多后自动变为 `canceled` 状态。 #### SetupIntent SetupIntent 跟踪支付方式从创建到结账的生命周期,并在需要时触发额外的身份验证步骤。 ## 需要支付方式 创建 SetupIntent 时,其[状态](https://docs.stripe.com/api/setup_intents/object.md#setup_intent_object-status)为 `requires_payment_method`,直到附加一种支付方式。 ## 需要确认 客户提供支付方式信息后,SetupIntent 进入 `requires_confirmation` 状态,并准备进行确认。大多数集成会跳过此状态,因为它们会在确认 SetupIntent 时提交支付方式信息。 ## 需要操作 如果设置需要额外的操作(例如通过 3DS 验证进行身份验证),则 SetupIntent 的状态为 `requires_action`。 > #### API 修改 > > [2019-02-11](https://docs.stripe.com/upgrades.md#2019-02-11) 之前版本的 API 显示的是`requires_source`,而非 `requires_payment_method`,显示的是 `requires_source_action`,而非`requires_action`。 ## 处理中 处理完所需的操作后,SetupIntent 将进入 `processing` 阶段。一些付款方式(如银行卡)可以快速处理,但其他付款方式可能需要数天才能处理完毕。 ## 已成功 状态为 `succeeded` 的 SetupIntent 表示设置成功。现在,您可以将此支付方式附加到客户对象,并在未来支付时使用该支付方式。如果设置失败,SetupIntent 的状态会恢复为 `requires_payment_method`。 ## 已取消 在 SetupIntent 处于`“处理中”`或`“成功”` 状态之前的任意时间点,您都可以取消它。取消后,该 SetupIntent 将不能再用于后续的设置尝试,且无法撤销。