# 支付过程中保存付款详情 了解如何接受付款并保存客户的付款详情以备将来购物时使用。 # 托管页面 > This is a 托管页面 for when payment-ui is stripe-hosted. View the full page at https://docs.stripe.com/payments/checkout/save-during-payment?payment-ui=stripe-hosted. 用 [Stripe Checkout](https://docs.stripe.com/payments/checkout.md) 进行快速、低代码集成,让客户保存他们的支付信息,用于未来购物时使用。 ## 设置 Stripe [服务器端] 首先,[注册](https://dashboard.stripe.com/register)一个 Stripe 账户。 用我们的官方库从您的应用程序访问 Stripe API: #### Ruby ```bash # Available as a gem sudo gem install stripe ``` ```ruby # If you use bundler, you can add this line to your Gemfile gem 'stripe' ``` ## 创建客户 [服务器端] 要为将来的付款设置银行卡,就必须将它绑定到 *Customer* (Customer objects represent customers of your business. They let you reuse payment methods and give you the ability to track multiple payments)。当客户在您的公司创建账户时,创建 Customer 对象。Customer 对象允许重复使用支付方式并跟踪多笔付款。 > #### 使用 Accounts v2 API 表示客户 > > 如果您的集成使用了[客户配置的 Account](https://docs.stripe.com/api/v2/core/accounts/create.md#v2_create_accounts-configuration-customer),请将代码示例中的 `Customer` 和事件引用替换为等效的 Accounts v2 API 引用。更多信息,请参阅[使用 Account 对象表示客户](https://docs.stripe.com/connect/use-accounts-as-customers.md)。 ```curl curl https://api.stripe.com/v1/customers \ -u "<>:" \ -d "name=Jenny Rosen" \ --data-urlencode "email=jennyrosen@example.com" ``` 成功创建后会返回 [Customer](https://docs.stripe.com/api/customers/object.md) 对象。您可以检查客户 `id` 的对象,并将它的值存储在您的数据库中以供以后检索。 您可以在管理平台的[客户](https://dashboard.stripe.com/customers)页面中找到这些客户。 ## 创建一个 Checkout Session [客户端] [服务器端] 在您的网站上添加一个结账按钮,调用一个服务器端点来创建 [Checkout Session](https://docs.stripe.com/api/checkout/sessions/create.md)。 您还可以为[现有客户](https://docs.stripe.com/payments/existing-customers.md?platform=web&ui=stripe-hosted)创建 Checkout Session,从而用已知联系信息预填 Checkout 字段,并统一该客户的购买记录。 ```html Buy cool new product
``` Checkout Session 是客户被重定向到支付表单时所看到的内容的程序化展示。可通过多种选项对它进行配置,例如: - 要扣款的 [Line items](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-line_items) - 可用货币 您必须将 `success_url` 填写为您网站上的页面 URL,Checkout 会在客户完成支付后将其重定向到该页面。 > Checkout Sessions 默认在创建后 24 小时后过期。 创建完 Checkout Session 后,将您的客户重定向到响应中返回的 [URL](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-url)。 #### Ruby ```ruby # This example sets up an endpoint using the Sinatra framework. require 'json' require 'sinatra' require 'stripe' # Don't put any keys in code. See https://docs.stripe.com/keys-best-practices. # Find your keys at https://dashboard.stripe.com/apikeys. client = Stripe::StripeClient.new('<>') post '/create-checkout-session' dosession = client.v1.checkout.sessions.create({ line_items: [{ price_data: { currency: 'usd', product_data: { name: 'T-shirt', }, unit_amount: 2000, }, quantity: 1, }], mode: 'payment', # These placeholder URLs will be replaced in a following step. success_url: 'https://example.com/success', }) redirect session.url, 303 end ``` ### 支付方式 默认情况下,Stripe 支持银行卡及其他主流支付方式。您可以在 [Stripe 管理平台](https://dashboard.stripe.com/settings/payment_methods)中开启或关闭个别支付方式。在 Checkout 中,Stripe 评估货币和任何限制,然后动态向客户显示支持的支付方式。 要查看您如何向客户显示支付方式,请在管理平台中输入交易 ID 或设置订单金额和货币。 您可以在您的[支付方式设置](https://dashboard.stripe.com/settings/payment_methods)中启用 Apple Pay 和 Google Pay。默认情况下,Apple Pay 处于启用状态,Google Pay 处于禁用状态。但在某些情况下,即使已启用这些功能,Stripe 仍会将其过滤。如果您[启用自动计税](https://docs.stripe.com/tax/checkout.md)但未收集收货地址,我们将过滤 Google Pay。 Checkout 的 Stripe 托管页面不需要修改集成即可启用 Apple Pay 或 Google Pay。Stripe 处理这些付款的方式与处理其他银行卡付款的方式完全一样。 ### 确认您的端点 启动您的网页服务器(例如 `localhost:4242`)并运行下列指令,以确认您的端点: ```bash curl -X POST -is "http://localhost:4242/create-checkout-session" -d "" ``` 在您的终端应该会看到类似于下面的响应: ```bash HTTP/1.1 303 See Other Location: https://checkout.stripe.com/c/pay/cs_test_... ... ``` ### 验证您的集成 现在,您的结账按钮应该可以使用了,能够将客户重定向到 Stripe Checkout。 1. 点击结账按钮。 1. 您会被重定向到 Stripe Checkout 支付表单。 如果您的集成不能用: 1. 打开浏览器开发人员工具上的 Network 面板。 1. 点击结账按钮,确认它向您的服务器端点 (`POST /create-checkout-session`) 发送了 XHR 请求。 1. 验证该请求是否返回状态码 200。 1. 用按钮点击监听器内的 `console.log(session)` 确认返回的数据是否正确。 有关配置和测试您的托管 Checkout 集成应用的更多信息,请查看[接受付款](https://docs.stripe.com/payments/accept-a-payment.md?platform=web&ui=hosted-form)。 ## 保存支付方式 [服务器端] 设置完您的托管 Checkout 集成应用后,为您的集成应用选择一个配置,以保存客户所用的支付方式。 默认情况下,用 Checkout 进行一次性付款时所使用的支付方式将来不能再使用。 ### 保存支付方式,以在会话外扣款 通过传递 [payment_intent_data.setup_future_usage](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-payment_intent_data-setup_future_usage) 实参可以对 Checkout 进行设置,使其保存用于进行一次性付款的支付方式。在您需要捕捉填写的支付方式以便收取滞后费用时(例如取消或未到场费用),这样做非常有帮助。 ```curl curl https://api.stripe.com/v1/checkout/sessions \ -u "<>:" \ -d customer_creation=always \ -d "line_items[0][price_data][currency]=usd" \ -d "line_items[0][price_data][product_data][name]=T-shirt" \ -d "line_items[0][price_data][unit_amount]=2000" \ -d "line_items[0][quantity]=1" \ -d mode=payment \ --data-urlencode "success_url=https://example.com/success.html" \ -d "payment_intent_data[setup_future_usage]=off_session" ``` 如果您在 `subscription` 模式下使用 Checkout,Stripe 会自动保存支付方式,以便后续收款。使用 `setup_future_usage` 或 `subscription` 模式为客户保存的银行卡支付方式不会出现在 Checkout 的再次购买选项中(更多信息见下文)。我们建议使用[自定义文本](https://docs.stripe.com/payments/checkout/custom-components.md#customize-text)链接到有关已保存支付信息使用的相关条款。 > 全球隐私法非常复杂、微妙。建议在实施 [setup_future_usage](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-payment_intent_data-setup_future_usage) 之前咨询您的法律和隐私团队,因为这可能会影响您的隐私合规框架。参考[欧洲数据保护委员会发布的指导意见](https://edpb.europa.eu/system/files/2021-05/recommendations022021_on_storage_of_credit_card_data_en_1.pdf),了解有关保存支付详情的更多信息。 ### 保存支付方式,以在 Checkout 中预先填充 默认情况下,Checkout 使用 [Link](https://docs.stripe.com/payments/link/checkout-link.md) 为您的客户提供安全保存和重复使用其支付信息的选项。如果您希望自行管理支付方式,请在创建 Checkout Session 时使用 [saved_payment_method_options.payment_method_save](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-saved_payment_method_options-payment_method_save),让您的客户保存支付方式,以便将来在 Checkout 中购物。 ```curl curl https://api.stripe.com/v1/checkout/sessions \ -u "<>:" \ -d customer_creation=always \ -d "line_items[0][price_data][currency]=usd" \ -d "line_items[0][price_data][product_data][name]=T-shirt" \ -d "line_items[0][price_data][unit_amount]=2000" \ -d "line_items[0][quantity]=1" \ -d mode=payment \ --data-urlencode "success_url=https://example.com/success.html" \ -d "saved_payment_method_options[payment_method_save]=enabled" ``` 在 [payment](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-mode) 或 [subscription](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-mode) 模式下传递此参数会显示一个可选复选框,让客户显式保存其支付方式以备将来购买时使用。当客户选中此复选框时,Checkout 会使用 [allow_redisplay: always](https://docs.stripe.com/api/payment_methods/object.md#payment_method_object-allow_redisplay) 保存支付方式。Checkout 使用该参数来确定将来的购物中是否可以预先填充支付方式。使用 `saved_payment_method_options.payment_method_save` 时,您无需传入 `setup_future_usage` 来保存支付方式。 > #### 使用 Accounts v2 API 表示客户 > > Accounts v2 API 已对 Connect 用户正式发布 (GA),对于其他 Stripe 用户则处于公开预览阶段。所有 Stripe 用户都可以[在管理平台中启用 Accounts v2](https://dashboard.stripe.com/settings/connect/platform-setup)。但是,在调用 Accounts v2 API 时,预览版用户需要[指定预览版本](https://docs.stripe.com/api-v2-overview.md#sdk-and-api-versioning)。 > > 在大多数应用场景下,我们建议[将您的客户建模为客户配置的 Account 对象](https://docs.stripe.com/connect/use-accounts-as-customers.md),而不是使用 [Customer](https://docs.stripe.com/api/customers.md) 对象。 使用 [saved_payment_method_options.payment_method_save](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-saved_payment_method_options-payment_method_save) 需要一个对象来代表您的客户(可以是客户配置的 `Account` 或 `Customer`)。要保存新客户,请将 Checkout 会话的 [customer_creation](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer_creation) 设置为 `always`。否则,会话将不会保存客户或支付方式。 如果未传入 `payment_method_save` 或客户不同意保存支付方式,Checkout 仍会保存在 `subscription` 模式下或使用 `setup_future_usage` 创建的支付方式。这些支付方式的 `allow_redisplay` 值为 `limited`,这可以防止在退货时预先填充它们,并使您遵守卡组织的规则和数据保护法规。了解如何[更改这些模式启用的默认行为](https://support.stripe.com/questions/prefilling-saved-cards-in-checkout)以及如何更改或覆盖 `allow_redisplay` 行为。 > 您可以使用 Checkout 保存银行卡和其他支付方式来进行会话外收款,但 Checkout 仅预填充已保存的银行卡信息。了解如何[预填充保存的银行卡信息](https://support.stripe.com/questions/prefilling-saved-cards-in-checkout)。要在不进行初始付款的情况下保存支付方式,[请在设置模式下使用 Checkout](https://docs.stripe.com/payments/save-and-reuse.md?platform=checkout)。 ### 允许客户移除已保存的支付方式 要让客户移除已保存的支付方式,使其不会在将来的付款中再次出现,请在创建 Checkout Session 时使用 [saved_payment_method_options.payment_method_remove](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-saved_payment_method_options-payment_method_remove)。 #### Accounts v2 ```curl curl https://api.stripe.com/v1/checkout/sessions \ -u "<>:" \ -d "customer_account={{CUSTOMERACCOUNT_ID}}" \ -d "line_items[0][price_data][currency]=usd" \ -d "line_items[0][price_data][product_data][name]=T-shirt" \ -d "line_items[0][price_data][unit_amount]=2000" \ -d "line_items[0][quantity]=1" \ -d mode=payment \ --data-urlencode "success_url=https://example.com/success.html" \ -d "saved_payment_method_options[payment_method_remove]=enabled" ``` #### Customers v1 ```curl curl https://api.stripe.com/v1/checkout/sessions \ -u "<>:" \ -d customer={{CUSTOMER_ID}} \ -d "line_items[0][price_data][currency]=usd" \ -d "line_items[0][price_data][product_data][name]=T-shirt" \ -d "line_items[0][price_data][unit_amount]=2000" \ -d "line_items[0][quantity]=1" \ -d mode=payment \ --data-urlencode "success_url=https://example.com/success.html" \ -d "saved_payment_method_options[payment_method_remove]=enabled" ``` 如果支付方式关联到有效订阅,并且客户没有为账单和订阅付款保存默认支付方式,则客户不能删除该支付方式。 # 嵌入式页面 > This is a 嵌入式页面 for when payment-ui is embedded-form. View the full page at https://docs.stripe.com/payments/checkout/save-during-payment?payment-ui=embedded-form. 用 [Stripe Checkout](https://docs.stripe.com/payments/checkout.md) 在您的网站上嵌入预构建的支付表单,让客户保存他们的支付信息,用于未来购物时使用。 ## 设置 Stripe [服务器端] 首先,[注册](https://dashboard.stripe.com/register)一个 Stripe 账户。 用我们的官方库从您的应用程序访问 Stripe API: #### Ruby ```bash # Available as a gem sudo gem install stripe ``` ```ruby # If you use bundler, you can add this line to your Gemfile gem 'stripe' ``` ## 创建客户 [服务器端] 要为将来的付款设置银行卡,就必须将它绑定到 *Customer* (Customer objects represent customers of your business. They let you reuse payment methods and give you the ability to track multiple payments)。当客户在您的公司创建账户时,创建 Customer 对象。Customer 对象允许重复使用支付方式并跟踪多笔付款。 > #### 使用 Accounts v2 API 表示客户 > > 如果您的集成使用了[客户配置的 Account](https://docs.stripe.com/api/v2/core/accounts/create.md#v2_create_accounts-configuration-customer),请将代码示例中的 `Customer` 和事件引用替换为等效的 Accounts v2 API 引用。更多信息,请参阅[使用 Account 对象表示客户](https://docs.stripe.com/connect/use-accounts-as-customers.md)。 ```curl curl https://api.stripe.com/v1/customers \ -u "<>:" \ -d "name=Jenny Rosen" \ --data-urlencode "email=jennyrosen@example.com" ``` 成功创建后会返回 [Customer](https://docs.stripe.com/api/customers/object.md) 对象。您可以检查客户 `id` 的对象,并将它的值存储在您的数据库中以供以后检索。 您可以在管理平台的[客户](https://dashboard.stripe.com/customers)页面中找到这些客户。 ## 创建一个 Checkout Session [服务器端] 在您的服务器端,创建一个 *Checkout Session* (A Checkout Session represents your customer's session as they pay for one-time purchases or subscriptions through Checkout. After a successful payment, the Checkout Session contains a reference to the Customer, and either the successful PaymentIntent or an active Subscription) 并将 [ui_mode](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-ui_mode) 设置为 `embedded_page`。您可以通过[行项目](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-line_items)来配置 [Checkout Session](https://docs.stripe.com/api/checkout/sessions/create.md),以包含所需内容,并设置[货币](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-currency)等选项。 您还可以为[现有客户](https://docs.stripe.com/payments/existing-customers.md?platform=web&ui=stripe-hosted)创建 Checkout Session,从而用已知联系信息预填 Checkout 字段,并统一该客户的购买记录。 要让客户返回到您网站上托管的自定义页面,请在 [return_url](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-return_url) 参数中指定该页面的 URL。在 URL 中包含 `{CHECKOUT_SESSION_ID}` 模板变量,以在返回页面上检索会话的状态。在重定向之前,Checkout 会自动将变量替换为 Checkout Session ID。 阅读更多关于[配置返回页面](https://docs.stripe.com/payments/accept-a-payment.md?payment-ui=checkout&ui=embedded-form#return-page)以及[自定义重定向行为](https://docs.stripe.com/payments/checkout/custom-success-page.md?payment-ui=embedded-form)的其他选项。 创建 Checkout Session 后,使用[挂载 Checkout](https://docs.stripe.com/payments/checkout/save-during-payment.md#mount-checkout) 响应中返回的 `client_secret`。 #### Ruby ```ruby # This example sets up an endpoint using the Sinatra framework. require 'json' require 'sinatra' require 'stripe' # Don't put any keys in code. See https://docs.stripe.com/keys-best-practices. # Find your keys at https://dashboard.stripe.com/apikeys. client = Stripe::StripeClient.new('<>') post '/create-checkout-session' do session = client.v1.checkout.sessions.create({ line_items: [{ price_data: { currency: 'usd', product_data: { name: 'T-shirt', }, unit_amount: 2000, }, quantity: 1, }], mode: 'payment',ui_mode: 'embedded_page', return_url: 'https://example.com/checkout/return?session_id={CHECKOUT_SESSION_ID}' }) {clientSecret: session.client_secret}.to_json end ``` ## 挂载 Checkout [客户端] [服务器端] #### HTML + JS [Stripe.js](https://docs.stripe.com/js.md) 是作为 Checkout 的一部分提供的。在您的页面包含 Stripe.js 脚本,方法是将它添加到您的 HTML 文件的 head 部分。接下来,创建一个空的 DOM 节点(容器)用于挂载。 ```html
``` 用您的可发布 API 密钥初始化 Stripe.js。 创建一个异步 `fetchClientSecret` 函数,请求您的服务器创建 Checkout Session 并检索客户端私钥。创建 Checkout 实例时,将该函数传入 `options`: ```javascript // Initialize Stripe.js const stripe = Stripe('<>'); initialize(); // Fetch Checkout Session and retrieve the client secret async function initialize() { const fetchClientSecret = async () => { const response = await fetch("/create-checkout-session", { method: "POST", }); const { clientSecret } = await response.json(); return clientSecret; }; // Initialize Checkout const checkout = await stripe.createEmbeddedCheckoutPage({ fetchClientSecret, }); // Mount Checkout checkout.mount('#checkout'); } ``` #### React 从 npm 安装 [react-stripe-js](https://docs.stripe.com/sdks/stripejs-react.md) 和 Stripe.js 加载程序: ```bash npm install --save @stripe/react-stripe-js @stripe/stripe-js ``` 要使用 Embedded Checkout 组件,请创建一个 `EmbeddedCheckoutProvider`。用您的 API 公钥调用 `loadStripe`,并将返回的 `Promise` 传递给提供程序。 创建一个异步 `fetchClientSecret` 函数,请求您的服务器创建 Checkout Session 并检索客户端私钥。将此函数传入提供程序接受的 `options` 属性。 ```jsx import * as React from 'react'; import {loadStripe} from '@stripe/stripe-js'; import { EmbeddedCheckoutProvider, EmbeddedCheckout } from '@stripe/react-stripe-js'; // Make sure to call `loadStripe` outside of a component’s render to avoid // recreating the `Stripe` object on every render. const stripePromise = loadStripe('pk_test_123'); const App = () => { const fetchClientSecret = React.useCallback(() => { // Create a Checkout Session return fetch("/create-checkout-session", { method: "POST", }) .then((res) => res.json()) .then((data) => data.clientSecret); }, []); const options = {fetchClientSecret}; return (
) } ``` Checkout 在 iframe 中呈现,该 iframe 通过 HTTPS 连接将支付信息安全地发送给 Stripe。 > 避免将 Checkout 放在另一个 iframe 中,因为有些支付方式需要重定向到另一个页面进行付款确认。 ## 保存支付方式 [服务器端] 设置完您的嵌入式 Checkout 集成应用后,为您的集成应用选择一个配置,以保存客户所用的支付方式。 默认情况下,用 Checkout 进行一次性付款时所使用的支付方式将来不能再使用。 ### 保存支付方式,以在会话外扣款 通过传递 [payment_intent_data.setup_future_usage](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-payment_intent_data-setup_future_usage) 实参可以对 Checkout 进行设置,使其保存用于进行一次性付款的支付方式。在您需要捕捉填写的支付方式以便收取滞后费用时(例如取消或未到场费用),这样做非常有帮助。 ```curl curl https://api.stripe.com/v1/checkout/sessions \ -u "<>:" \ -d customer_creation=always \ -d "line_items[0][price_data][currency]=usd" \ -d "line_items[0][price_data][product_data][name]=T-shirt" \ -d "line_items[0][price_data][unit_amount]=2000" \ -d "line_items[0][quantity]=1" \ -d mode=payment \ -d ui_mode=embedded_page \ --data-urlencode "return_url=https://example.com/return" \ -d "payment_intent_data[setup_future_usage]=off_session" ``` 如果您在 `subscription` 模式下使用 Checkout,Stripe 会自动保存支付方式,以便后续收款。使用 `setup_future_usage` 或 `subscription` 模式为客户保存的银行卡支付方式不会出现在 Checkout 的再次购买选项中(更多信息见下文)。我们建议使用[自定义文本](https://docs.stripe.com/payments/checkout/custom-components.md#customize-text)链接到有关已保存支付信息使用的相关条款。 > 全球隐私法非常复杂、微妙。建议在实施 [setup_future_usage](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-payment_intent_data-setup_future_usage) 之前咨询您的法律和隐私团队,因为这可能会影响您的隐私合规框架。参考[欧洲数据保护委员会发布的指导意见](https://edpb.europa.eu/system/files/2021-05/recommendations022021_on_storage_of_credit_card_data_en_1.pdf),了解有关保存支付详情的更多信息。 ### 保存支付方式,以在 Checkout 中预先填充 默认情况下,Checkout 使用 [Link](https://docs.stripe.com/payments/link/checkout-link.md) 为您的客户提供安全保存和重复使用其支付信息的选项。如果您希望自行管理支付方式,请在创建 Checkout Session 时使用 [saved_payment_method_options.payment_method_save](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-saved_payment_method_options-payment_method_save),让您的客户保存支付方式,以便将来在 Checkout 中购物。 ```curl curl https://api.stripe.com/v1/checkout/sessions \ -u "<>:" \ -d customer_creation=always \ -d "line_items[0][price_data][currency]=usd" \ -d "line_items[0][price_data][product_data][name]=T-shirt" \ -d "line_items[0][price_data][unit_amount]=2000" \ -d "line_items[0][quantity]=1" \ -d mode=payment \ -d ui_mode=embedded_page \ --data-urlencode "return_url=https://example.com/return" \ -d "saved_payment_method_options[payment_method_save]=enabled" ``` 在 [payment](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-mode) 或 [subscription](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-mode) 模式下传递此参数会显示一个可选复选框,让客户显式保存其支付方式以备将来购买时使用。当客户选中此复选框时,Checkout 会使用 [allow_redisplay: always](https://docs.stripe.com/api/payment_methods/object.md#payment_method_object-allow_redisplay) 保存支付方式。Checkout 使用该参数来确定将来的购物中是否可以预先填充支付方式。使用 `saved_payment_method_options.payment_method_save` 时,您无需传入 `setup_future_usage` 来保存支付方式。 > #### 使用 Accounts v2 API 表示客户 > > Accounts v2 API 已对 Connect 用户正式发布 (GA),对于其他 Stripe 用户则处于公开预览阶段。所有 Stripe 用户都可以[在管理平台中启用 Accounts v2](https://dashboard.stripe.com/settings/connect/platform-setup)。但是,在调用 Accounts v2 API 时,预览版用户需要[指定预览版本](https://docs.stripe.com/api-v2-overview.md#sdk-and-api-versioning)。 > > 在大多数应用场景下,我们建议[将您的客户建模为客户配置的 Account 对象](https://docs.stripe.com/connect/use-accounts-as-customers.md),而不是使用 [Customer](https://docs.stripe.com/api/customers.md) 对象。 使用 [saved_payment_method_options.payment_method_save](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-saved_payment_method_options-payment_method_save) 需要一个对象来代表您的客户(可以是客户配置的 `Account` 或 `Customer`)。要保存新客户,请将 Checkout 会话的 [customer_creation](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer_creation) 设置为 `always`。否则,会话将不会保存客户或支付方式。 如果未传入 `payment_method_save` 或客户不同意保存支付方式,Checkout 仍会保存在 `subscription` 模式下或使用 `setup_future_usage` 创建的支付方式。这些支付方式的 `allow_redisplay` 值为 `limited`,这可以防止在退货时预先填充它们,并使您遵守卡组织的规则和数据保护法规。了解如何[更改这些模式启用的默认行为](https://support.stripe.com/questions/prefilling-saved-cards-in-checkout)以及如何更改或覆盖 `allow_redisplay` 行为。 > 您可以使用 Checkout 保存银行卡和其他支付方式来进行会话外收款,但 Checkout 仅预填充已保存的银行卡信息。了解如何[预填充保存的银行卡信息](https://support.stripe.com/questions/prefilling-saved-cards-in-checkout)。要在不进行初始付款的情况下保存支付方式,[请在设置模式下使用 Checkout](https://docs.stripe.com/payments/save-and-reuse.md?platform=checkout)。 ### 允许客户移除已保存的支付方式 要让客户移除已保存的支付方式,使其不会在将来的付款中再次出现,请在创建 Checkout Session 时使用 [saved_payment_method_options.payment_method_remove](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-saved_payment_method_options-payment_method_remove)。 #### Accounts v2 ```curl curl https://api.stripe.com/v1/checkout/sessions \ -u "<>:" \ -d "customer_account={{CUSTOMERACCOUNT_ID}}" \ -d "line_items[0][price_data][currency]=usd" \ -d "line_items[0][price_data][product_data][name]=T-shirt" \ -d "line_items[0][price_data][unit_amount]=2000" \ -d "line_items[0][quantity]=1" \ -d mode=payment \ -d ui_mode=embedded_page \ --data-urlencode "return_url=https://example.com/return" \ -d "saved_payment_method_options[payment_method_remove]=enabled" ``` #### Customers v1 ```curl curl https://api.stripe.com/v1/checkout/sessions \ -u "<>:" \ -d customer={{CUSTOMER_ID}} \ -d "line_items[0][price_data][currency]=usd" \ -d "line_items[0][price_data][product_data][name]=T-shirt" \ -d "line_items[0][price_data][unit_amount]=2000" \ -d "line_items[0][quantity]=1" \ -d mode=payment \ -d ui_mode=embedded_page \ --data-urlencode "return_url=https://example.com/return" \ -d "saved_payment_method_options[payment_method_remove]=enabled" ``` 如果支付方式关联到有效订阅,并且客户没有为账单和订阅付款保存默认支付方式,则客户不能删除该支付方式。