调至内容部分
创建账户或登录
Stripe 文档徽标
/
询问人工智能
创建账户登录
开始
付款
销售收入
平台和交易市场
资金管理
开发人员资源
API 和 SDK帮助
概览
关于 Stripe 支付
升级您的集成
支付分析
线上付款
概览查找您的用例Use Managed Payments
使用 Payment Link
Use a prebuilt checkout page
Build a custom integration with Elements
构建应用内集成
线下支付
Terminal
支付方式
添加支付方式
管理支付方式
用 Link 更快结账
    概览
    Instant Bank Payments
    Link 上的 Klarna
    一览
    在 Checkout 中使用 Link
    Link 与 Web Element
    Link 与 Mobile Element
    Link 和 Invoicing 一起使用
    集成指南
    Link 支付集成
    构建包含 Link 的自定义结账页面
    使用 Element 和 Link 设置未来付款
支付场景
处理多种货币
自定义支付流程
灵活收单
编排
超越支付功能
成立公司
加密货币
智能体商务 (Agentic Commerce)
Financial Connections
Climate
了解欺诈
Radar 欺诈保护
管理争议
验证身份
美国
简体中文
首页付款Faster checkout with Link

构建包含 Link 的自定义结账页面

用 Payment Element 或 Link Authentication Element 集成 Link。

本指南将引导您了解如何通过 Payment Intents API 和 Payment Element 或 Link Authentication Element 通过 Link 接受付款。

您可以通过三种方式针对 Link 验证和注册保护客户电子邮件地址:

  • **传递电子邮件地址:**您可以使用 defaultValues 向 Payment Element 传递电子邮件地址。如果您已经在结账流程中收集了客户的邮件地址和/或电话号码,则我们建议采用这种方法。
  • **收集电子邮件地址:**您可以直接在 Payment Element 中收集电子邮件地址。如果您在结账流程中的任何环节都未收集电子邮件地址,我们建议使用这种方法。
  • **Link Authentication Element:**您可以用 Link Authentication Element 创建单个的邮件地址输入字段,以收集邮件地址并进行 Link 验证。如果您使用的是 Address Element,则建议您这样做。
在结账过程中直接在 Payment Element 中通过 Link 进行验证或注册

收集客户的电子邮件地址以进行 Link 验证或注册

设置 Stripe
服务器端

首先,创建 Stripe 账户或登录。

用我们的官方库从您的应用程序访问 Stripe API:

Command Line
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
# Available as a gem sudo gem install stripe
Gemfile
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
# If you use bundler, you can add this line to your Gemfile gem 'stripe'

创建 PaymentIntent
服务器端

Stripe 使用一个 PaymentIntent 对象来表示您向客户收款的意图,跟踪整个过程中的收费尝试和付款状态变化。

整个支付流程概览

如果您收集银行卡详情以使用 Setup Intents 供未来使用,请手动列出支付方式,而非使用动态支付方式。要在没有动态支付方式的情况下使用 Link,请更新您的集成,将 link 传递到 payment_method_types。

创建 PaymentIntent 时,使用动态支付方式动态为客户提供最相关的支付方式,包括 Link。要使用动态支付方式,不要包含 payment_method_types 参数。您也可以启用 automatic_payment_methods。

注意

当您的集成未设置 payment_method_types 参数时,某些支付方式会自动开启,包括银行卡和钱包。

要使用动态支付方式将 Link 添加到您的 Element 集成,请执行以下操作:

  1. 在您的管理平台的支付方式设置中,开启 Link。
  2. 如果您的现有集成可手动列出支付方式,请从您的集成中删除 payment_method_types参数。

检索客户端私钥

PaymentIntent 中包含的是一个客户端私钥,用于在客户端安全地完成支付流程。有不同的方法可以将客户端私钥传递到客户端。

使用浏览器的 fetch 功能,从您的服务器上的端点获取客户端私钥。如果您的客户端是单页应用,特别是用现代的前端框架(例如 React)搭建的情况,则该方法最为合适。创建服务于客户端私钥的服务器端点:

main.rb
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
get '/secret' do intent = # ... Create or retrieve the PaymentIntent {client_secret: intent.client_secret}.to_json end

然后在客户端用 JavaScript 获取客户端私钥:

(async () => { const response = await fetch('/secret'); const {client_secret: clientSecret} = await response.json(); // Render the form using the clientSecret })();

收集客户电子邮件地址

Link 通过客户的电子邮件地址对其进行验证。根据您的结账流程,您有以下选项:将电子邮件传递给 Payment Element、直接在 Payment Element 中收集电子邮件,或使用 Link Authentication Element。在这些选项中,Stripe 建议在客户电子邮件地址可用时将其传递给 Payment Element。

如果您满足以下_任一_条件:

  • 您想要一个可收集邮件地址并进行 Link 身份验证的优化组件。
  • 您需要从客户那里收集收货地址。

然后使用实现以下元素的集成流程:Link Authentication Element、Payment Element 和可选的 Address Element。

启用了 Link 的结账页面的开头显示 Link Authentication Element,随后是 Address Element,最后是 Payment Element。对于多页结账流程,您也可以按此顺序在不同页面上显示 Link Authentication Element。

使用多个元素创建支付表单

使用多个元素创建支付表单

集成的工作方式如下:

设置您的支付表单
客户端

现在,您可以用 Elements 预构建的 UI 组件设置您的自定义支付表单了。支付页面上的地址也必须以 https:// 开头,不能是 http://,否则您的集成不能工作。您可以在不使用 HTTPS 的情况下测试您的集成。准备好进行真实收款时启用 HTTPS。

Link Authentication Element 会呈现一个电子邮件地址输入框。当 Link 将客户电子邮件与现有 Link 账户匹配时,它会向客户的手机发送安全的一次性代码以进行验证。如果客户成功通过验证,Stripe 会自动显示其 Link 保存的地址和支付方式供其使用。

此集成还会创建 Payment Element,后者会呈现一个动态表单,允许客户选择支付方式类型。该表单会自动收集客户所选支付方式类型的所有必要支付详细信息。Payment Element 还会为已通过验证的客户处理 Link 保存的支付方式的显示。

设置 Stripe Elements

从 npm 公共注册表安装 React Stripe.js 和 Stripe.js 加载器。

Command Line
npm install --save @stripe/react-stripe-js @stripe/stripe-js

在您的支付页面,用 Elements 组件包住您的支付表单,传递上一步中的 client secret。如果您已经在表单的另一部分收集了客户的邮件地址,请将您当前输入的内容替换为 linkAuthenticationElement​。

如果您不收集邮件地址,请将 linkAuthenticationElement​ 添加到您的结账流程中。必须将 linkAuthenticationElement 放在 ShippingAddressElement(如果您收集收货地址,则可选)和 Link 的 PaymentElement 之前,以便在 ShippingAddressElement 和 PaymentElement 中为您的客户自动填充 Link 中保存的详情。您还可以传入 appearance option,自定义 Elements,使其匹配您网站的设计。

如果您有客户的电子邮件,请将其传递给 linkAuthenticationElement 的 defaultValues 选项。这会预填其电子邮件地址并启动 Link 验证流程。

如果您有其他客户信息,请将其传递给 PaymentElement 的 defaultValues.billingDetails 对象。尽可能预填信息可简化客户的 Link 账户创建和重复使用。

然后,在支付表单中呈现 linkAuthenticationElement 和 PaymentElement 组件:

Checkout.jsx
import {loadStripe} from "@stripe/stripe-js"; import { Elements, LinkAuthenticationElement, PaymentElement, } from "@stripe/react-stripe-js"; const stripe = loadStripe(
'pk_test_TYooMQauvdEDq54NiTphI7jx'
); // Customize the appearance of Elements using the Appearance API. const appearance = {/* ... */}; // Enable the skeleton loader UI for the optimal loading experience. const loader = 'auto';

linkAuthenticationElement、PaymentElement 和 ShippingAddressElement 无需位于同一页面上。如果您有一个流程,其中客户联系信息、收货详细信息和支付详细信息在不同步骤中显示给客户,则您可以在相应的步骤或页面中显示每个元素。在联系信息收集步骤中,将 linkAuthenticationElement 作为电子邮件输入表单包含在内,以确保客户可以充分利用 Link 提供的收货和支付自动填充功能。

如果您在结账流程的早期收集了带有 Link Authentication Element 的客户电子邮件,则无需在收货或支付页面再次显示该电子邮件。

检索电子邮件地址

您可以使用 linkAuthenticationElement 组件上的 onChange 属性检索电子邮件地址详细信息。每当用户更新电子邮件字段或自动填充已保存的客户电子邮件时,onChange 处理程序就会触发。

<linkAuthenticationElement onChange={(event) => { setEmail(event.value.email); }} />

预填客户电子邮件地址

Link Authentication Element 接受电子邮件地址。一旦客户用 defaultValues 选项登录支付页面,提供客户的电子邮件地址将触发 Link 验证流程。

<linkAuthenticationElement options={{defaultValues: {email: 'foo@bar.com'}}}/>

可选预填其他客户数据
客户端

如果有的话,预填客户信息可以进一步简化结账流程并减少手动数据输入。

如果您使用的是 Link Authentication Element,请将 defaultValues.billingDetails 对象添加到 Payment Element 以预填客户的姓名、电话号码及其收货地址。通过尽可能预填客户的信息,您可以简化 Link 账户的创建和重复使用。

Link 中的预填信息选择加入表单。

预填客户的电子邮件地址、电话号码和姓名以简化 Link 注册流程

您可以为 defaultValues.billingDetails 对象提供以下值:

值必填格式
name可选字符串
phone可选字符串
address可选带有 postal_code 和 country 字段的 JSON 对象。所有字段均为字符串。

一个预填了所有值的 Payment Element 类似于以下示例:

<PaymentElement options={{ defaultValues: { billingDetails: { name: 'John Doe', phone: '888-888-8888', address: { postal_code: '10001', country: 'US', } }, }, }} />;

可选收集收货地址
客户端

要收集地址,请创建一个空的 DOM 节点,以便 Address Element 可以呈现到这里。必须在 Link Authentication Element 之后显示 Address Element,Link 才能自动填充客户保存的地址详情:

Checkout.jsx
import {loadStripe} from "@stripe/stripe-js"; import { Elements, LinkAuthenticationElement, AddressElement, PaymentElement, } from "@stripe/react-stripe-js"; const stripe = loadStripe(
'pk_test_TYooMQauvdEDq54NiTphI7jx'
); // Customize the appearance of Elements using the Appearance API. const appearance = {/* ... */}; // Enable the skeleton loader UI for the optimal loading experience. const loader = 'auto'; const CheckoutPage = ({clientSecret}) => ( <Elements stripe={stripe} options={{clientSecret, appearance, loader}}> <CheckoutForm /> </Elements> ); export default function CheckoutForm() { return ( <form> <h3>Contact info</h3> <LinkAuthenticationElement /> <h3>Shipping</h3> <AddressElement options={{mode: 'shipping', allowedCountries: ['US']}} /> <h3>Payment</h3> <PaymentElement /> <button type="submit">Submit</button> </form> ); }

在 PaymentElement 前显示 AddressElement。PaymentElement 会动态检测由 AddressElement 收集的地址数据,隐藏不必要的字段,并在必要时收集额外的账单地址详情。

检索地址信息

当客户提交付款时,AddressElement 将自动传递收货地址,但您也可以用 onChange 属性在前端检索地址详情。每当用户更新 Address Element 中的任何字段,或选择保存的地址时,onChange 处理程序都会发送一个事件:

<AddressElement onChange={(event) => { setAddressState(event.value); }} />

预填充收货地址

使用 defaultValues 预填充地址信息,加速客户结账过程。

<AddressElement options={{ mode: 'shipping', defaultValues: { name: 'Jane Doe', address: { line1: '354 Oyster Point Blvd', line2: '', city: 'South San Francisco', state: 'CA', postal_code: '94080', country: 'US', } } }}>

可选自定义外观
客户端

将这些 Elements 添加到您的页面后,您可以自定义它们的 appearance,使其适合您设计的其余部分:

定制元素的外观

定制元素的外观

向 Stripe 提交付款
客户端

用 stripe.confirmPayment 完成付款,使用从不同 Elements 表单收集的客户信息完成付款。为该函数提供一个 return_url,告诉 Stripe 在用户完成付款后将他们重定向到何处。

您的用户可能会先被重定向到一个中间站点,如银行授权页面,然后 Stripe 将其重定向到 return_url。

默认情况下,付款成功时,银行卡和银行付款将立即重定向到 return_url。如果不想重定向到 return_url,可以用 if_required 来更改行为。

Checkout.jsx
import {loadStripe} from "@stripe/stripe-js"; import { useStripe, useElements, Elements, LinkAuthenticationElement, PaymentElement, // If collecting shipping AddressElement, } from "@stripe/react-stripe-js"; const stripe = loadStripe(
'pk_test_TYooMQauvdEDq54NiTphI7jx'
); const appearance = {/* ... */}; // Enable the skeleton loader UI for the optimal loading experience. const loader = 'auto'; const CheckoutPage =({clientSecret}) => ( <Elements stripe={stripe} options={{clientSecret, appearance, loader}}> <CheckoutForm /> </Elements> ); export default function CheckoutForm() { const stripe = useStripe(); const elements = useElements(); const handleSubmit = async (event) => { event.preventDefault(); const {error} = await stripe.confirmPayment({ elements, confirmParams: { return_url: "https://example.com/order/123/complete", }, }); if (error) { // handle error } }; return ( <form onSubmit={handleSubmit}> <h3>Contact info</h3> <LinkAuthenticationElement /> {/* If collecting shipping */} <h3>Shipping</h3> <AddressElement options={{mode: 'shipping', allowedCountries: ['US']}} /> <h3>Payment</h3> <PaymentElement /> <button type="submit">Submit</button> </form> ); }

return_url 对应于您的网站上的一个页面,在您呈现返回页面时提供 PaymentIntent 的付款状态。当 Stripe 将客户重定向到 return_url 时,您可以使用以下 URL 查询参数来验证付款状态。您还可以在提供 return_url 时附上自己的查询参数。这些查询参数会在重定向过程中持续存在。

参数描述
payment_intentPaymentIntent 的唯一标识符
payment_intent_client_secretPaymentIntent 对象的 client secret。

可选分离授权和捕获
服务器端

Link 支持单独授权和捕获。您必须在授权后的 7 天内捕获已授权的 Link 付款。否则,授权会被自动取消,您将无法捕获这笔付款。

告诉 Stripe 仅授权

要表明您想将单独授权和捕获,那么在创建 PaymentIntent 时将 capture_method 设置为 manual。该参数可指示 Stripe 仅授权客户支付方式卡上的金额。

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/payment_intents \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d "payment_method_types[]"=link \ -d "payment_method_types[]"=card \ -d amount=1099 \ -d currency=usd \ -d capture_method=manual

捕获资金

授权成功后,PaymentIntent 的 status 变为 requires_capture。要捕获授权资金,请发出 PaymentIntent capture 请求。默认会捕获授权的总金额——不能超出,但可以少于这个金额。

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/payment_intents/
{{PAYMENT_INTENT_ID}}
/capture
\ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d amount_to_capture=750

Optional 取消授权

如果需要取消授权,您可以取消 PaymentIntent。

处理支付后事件
服务器端

付款完成时,Stripe 会发送一个 payment_intent.succeeded 事件。用 Webhook 接收这些事件并运行操作,例如,向客户发送订单确认邮件、在数据库中记录订单,或启动配送流程。

配置您的集成来侦听这些事件,而不是等待来自客户端的回调。当您等待来自客户端的回调时,客户可能在回调执行之前关闭浏览器窗口或退出应用。通过设置您的集成来侦听异步事件,您就能够使用单一集成接受不同类型的支付方式。

除了处理 payment_intent.succeeded 事件外,您还可以在使用 Payment Element 收款时处理另外两个重要事件:

活动描述操作
payment_intent.succeeded在客户成功完成支付时从 Stripe 发送。向客户发送订单确认通知,并履行他们的订单。
payment_intent.payment_failed在客户尝试支付但支付未成功时从 Stripe 发送。如果一笔付款从 processing 变为 payment_failed,则让客户再尝试一次。

测试集成

注意

不要在沙盒 Link 账户中存储真实用户数据。将其视为可公开的数据,因为这些测试账户与您的公钥有关。

目前 Link 仅支持用信用卡、借记卡以及符合条件的美国银行账户进行购买。Link 需要域名注册。

您可以用任意有效的邮件地址为 Link 创建沙盒账户。下表显示的是 Stripe 接受的在验证沙盒账户时可使用的一次性固定密码值:

值结果
非下方所列的任意 6 位数成功
000001错误,验证码无效
000002错误,验证码已过期
000003错误,超过了最大尝试次数

要测试具体的支付方式,请参考 Payment Element 测试示例。

多个资金来源

由于 Stripe 增加了额外的资金来源支持,因此您不需要更新您的集成。Stripe 会自动为它们提供与卡和银行账户支付相同的交易结算时间和担保。

卡验证和 3DS 验证

Link 支持对银行卡付款进行 3DS 2.0 验证。3DS2 要求客户在支付时,在发卡行那里完成额外的验证步骤。成功通过 3DS 验证的付款包含在责任转移范围内。

要在沙盒中用 Link 触发 3DS 2.0 验证流程,请使用以下测试卡(可输入任意的 CVC、邮编和未来的有效期):。

在沙盒环境中,身份验证过程显示一个模拟身份验证页面。在该页面,您可以授权或取消付款。授权付款 模拟的是身份验证成功的场景,并将您重定向到指定的返回 URL。点击失败按钮会模拟验证尝试不成功的场景。

有关更多详情,请参考 3DS 验证页面。

注意

测试 3DS 流程时,只有 3DS2 的测试卡才会在 Link 上触发验证。

可选显示客户保存的数据
服务器端
客户端

除了显示您为客户保存的地址和支付方式外,您还可以显示他们通过 Link 保存的数据。

如果某个客户有多种保存的支付方式,那么除了该客户在 Link 上保存的任何支付方式外,Stripe 还会显示保存到 客户 的三张最近使用的银行卡。

客户保存数据预览

要实现这一点,请创建一个临时密钥并将其与 客户 ID 一起发送到您的前端。有关 customer 对象的信息是敏感信息,您不能在 Stripe.js 中直接检索它。Ephemeral Key 授予对 customer 数据的临时访问权限。

Command Line
curl
Ruby
Python
PHP
Node.js
No results
curl https://api.stripe.com/v1/ephemeral_keys \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
\ -H "Stripe-Version: 2025-10-29.clover" \ -d "customer"="{{CUSTOMER_ID}}" \ curl https://api.stripe.com/v1/payment_intents \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
\ -d "amount"=1099 \ -d "currency"="usd" \ -d "customer"="{{CUSTOMER_ID}}" \ -d "payment_method_types[]"="link" \ -d "payment_method_types[]"="card"

在客户端,用 clientSecret 获取 customerOptions。

(async () => { const response = await fetch('/secret'); const {clientSecret, customerOptions} = await response.json(); })

然后,将 customerOptions.ephemeralKey 和 customerOptions.customer 的值传递到 Elements 组上的 customerOptions 选项。加载 Stripe 实例时,还必须传递 elements_customers_beta_1 Beta 标志。

Checkout.jsx
import {loadStripe} from "@stripe/stripe-js"; import { useStripe, useElements, Elements, LinkAuthenticationElement, PaymentElement, } from "@stripe/react-stripe-js"; const stripe = loadStripe(
'pk_test_TYooMQauvdEDq54NiTphI7jx'
, { apiVersion: '2025-10-29.clover', betas: ['elements_customers_beta_1'], }); const appearance = {/* ... */}; const loader = 'auto'; const CheckoutPage =({ clientSecret, customerOptions, }) => ( <Elements stripe={stripe} options={{ clientSecret, appearance, loader, customerOptions, }}> <CheckoutForm /> </Elements> );

可选保存 Link 支付方式
服务器端
客户端

您可以保存 Link 支付方式用于未来的会话外支付或订阅,但不能用于未来的会话内支付。为此,您必须将其绑定到客户。当客户在您的公司创建账户时,创建 customer 对象。然后,在创建您的 PaymentIntent 时指定该 customer。

当新客户与您的公司进行第一笔交易时,在 Stripe 中创建一个 customer 对象来存储其数据以备将来使用。

Command Line
cURL
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/payment_intents \ -u "
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:"
\ -d amount=1099 \ -d currency=usd \ -d "automatic_payment_methods[enabled]"=true \ -d customer=
"{{CUSTOMER_ID}}"
\ -d setup_future_usage=off_session

在最新版本的 API 中,指定 automatic_payment_methods 参数是可选的,因为 Stripe 默认启用其功能。

准备好再次对您的客户收款时,使用 customer 和生成的 PaymentMethod ID 创建一个新的 PaymentIntent。将 off_session 设置为 true。如果在客户未主动使用您的网站或应用时需要验证,这会导致 PaymentIntent 发送错误。

Command Line
curl
Stripe CLI
Ruby
Python
PHP
Java
Node.js
Go
.NET
No results
curl https://api.stripe.com/v1/payment_intents \ -u
sk_test_BQokikJOvBiI2HlWgH4olfQ2
:
\ -d amount=1099 \ -d currency=usd \ # In the latest version of the API, specifying the `automatic_payment_methods` parameter is optional because Stripe enables its functionality by default. -d "automatic_payment_methods[enabled]"=true \ -d customer="{{CUSTOMER_ID}}" \ -d payment_method="{{PAYMENT_METHOD_ID}}" \ -d return_url="https://example.com/order/123/complete" \ -d off_session=true \ -d confirm=true

向您的客户披露 Stripe

Stripe 收集有关客户与 Elements 互动的信息,以向您提供服务、防范欺诈并改进其服务。这包括使用 Cookie 和 IP 地址来识别客户在单次结账会话中看到的 Elements。您有责任披露并获得 Stripe 以这些方式使用数据所需的所有权利和许可。有关更多信息,请访问我们的隐私中心。

另见

  • 什么是 Link
  • Link with Elements
  • Payment Element 中的 Link
  • 探索 Link Authentication Element
  • 不同支付集成中的 Link
此页面的内容有帮助吗?
是否
  • 需要帮助?联系支持。
  • 查看我们的更改日志。
  • 有问题?联系销售。
  • LLM? Read llms.txt.
  • Powered by Markdoc