设置未来付款
Setup Intents API 允许您在不先付款的情况下保存客户的支付详情。如果您想先让客户入驻,设置他们的支付方式,然后将来在他们离线时对他们扣款,那么这样做就非常有用。
可以用这个集成设置经常性付款或创建一次性付款,稍后再确定最终金额(通常在客户收到您的服务后)。
合规
You’re responsible for your compliance with all applicable laws, regulations, and network rules when saving a customer’s payment details. These requirements generally apply if you want to save your customer’s payment method for future use, such as displaying a customer’s payment method to them in the checkout flow for a future purchase or charging them when they’re not actively using your website or app. Add terms to your website or app that state how you plan to save payment method details and allow customers to opt in.
When you save a payment method, you can only use it for the specific usage you have included in your terms. To charge a payment method when a customer is offline and save it as an option for future purchases, make sure that you explicitly collect consent from the customer for this specific use. For example, include a “Save my payment method for future use” checkbox to collect consent.
To charge them when they’re offline, make sure your terms include the following:
- 客户同意您代其对指定的交易发起一次或一系列付款。
- 预期的付款时间和频率(例如,收款是计划的分期付款、订阅付款还是计划外充值)。
- 如何确定付款金额。
- 如果支付方式是用于支付订阅服务,那即同意您的取消政策。
请务必让客户书面同意这些条款并做好记录。
备注
如果您需要采用手动服务器端确认方式,或者您的集成需要单独提供支付方式,请参阅我们的替代指南。
启用支付方式
查看您的支付方式设置,启用您想支持的支付方式。您至少需要启用一个支付方式才能在下一步中创建 SetupIntent。
默认情况下,Stripe 启用了银行卡和其他常见的支付方式,可以帮助您接触更多客户,但建议您开启与您的业务和客户相关的其他支付方式。查看支付方式集成选项,了解支持的产品和支付方式,并查看我们的定价页面,了解收费情况。
创建一个 Customer服务器端
要为将来的付款设置支付方式,就必须将它绑定到 Customer。当客户在您的网站上创建账户时,创建 Customer
对象。Customer
对象允许重复使用支付方式并跟踪多笔付款。
创建 SetupIntent服务器端
备注
如果您想在创建 SetupIntent 前呈现 Payment Element,请参阅收集支付详情后再创建 Intent。
SetupIntent 为一个对象,代表您为未来的付款设置客户的支付方式的意图。结账过程中向客户显示的支付方式也会包含在 SetupIntent 上。您可以让 Stripe 自动从您的管理平台拉取支付方式,也可以手动列出。
除非您的集成应用在提供支付方式时需要有代码选项,否则 Stripe 推荐使用自动选项。这是因为 Stripe 会评估货币、支付方式限制及其他参数,来确定支持的支付方式列表。如果某些支付方式会提高转化率且与货币和客户位置最相关,这些支付方式会排在最前面。排序靠后的支付方式隐藏在溢出菜单下方。
检索客户端私钥
SetupIntent 中包含的是一个客户端私钥,用于在客户端安全地完成支付流程。有不同的方法可以将客户端私钥传递到客户端。
收集付款详情客户端
您已经可以用 Payment Element 收集付款详情了。Payment Element 是一个预构建的 UI 组件,它简化了很多种支付方式的付款详情收集工作。
Payment Element 中包含一个 iframe,它通过一个 HTTPS 连接安全地将支付信息发送到 Stripe。结账页面上的地址也必须以 https://
开头,不能是 http://
,否则您的集成不能工作。您不这样做也可以测试您的集成应用,但在您准备好接受真实付款时记得启用 HTTPS。
Payment Element 呈现一个动态表单,您的客户可在这里选择一个支付方式。对于每个支付方式,表单会自动请求客户填写必要的支付详情。
自定义外观
自定义 Payment Element,使其匹配您的网站设计风格,方法是在创建 Elements
提供程序时向 options
传递外观对象。
申请 Apple Pay 商家令牌
如果您接受 Apple Pay 付款,那么我们建议将 Apple Pay 接口配置为返回商家令牌,以支持商家发起的交易 (MIT)。在 Payment Element 中申请相关的商家令牌类型。下例显示的是一个延期付款商家令牌请求。
const paymentElement = elements.create('payment', { applePay: { deferredPaymentRequest: { paymentDescription: 'My deferred payment', managementURL: 'https://example.com/billing', deferredBilling: { amount: 2500, label: 'Deferred Fee', deferredPaymentDate: new Date('2024-01-05') }, } }, // Other options });
配置货币
使用 automatic_payment_methods 的 SetupIntent,以及在创建 Elements
提供者时将货币传递到 options
后,会影响 Payment Element 呈现的支付方式。Payment Element 会呈现在 Stripe 管理平台中启用的支持提供的货币的支付方式。前往支付方式集成选项,查看具体支持哪些。
收集地址
默认情况下,Payment Element 仅收集必要的账单地址信息。收集客户完整的账单地址(例如,计算数字商品和服务的税额)或收货地址时,使用 Address Element。
向 Stripe 提交支付详情客户端
使用 Payment Element 收集的详情,用 stripe.confirmSetup 完成设置。为该函数提供一个 return_url,以便 Stripe 知道在用户完成设置后对他们进行重定向。我们可能会先将他们重定向到一个中间站点,如银行授权页面,然后才将他们重定向到 return_url
。
如果您的客户保存他们的银行卡详情,则在设置成功后,我们会立即将他们重定向到 return_url
。如果您不想对银行卡付款重定向,可以将 redirect 设置到 if_required
。这样就会只对使用基于重定向支付方式的客户进行重定向。
确保 return_url
对应于您的网站上提供 SetupIntent
的状态的页面。Stripe 提供了以下 URL 查询参数来验证将客户重定向到 return_url
时的状态。您还可以在提供 return_url
时附加自己的查询参数,并且它们会在重定向过程中持续存在。
参数 | 描述 |
---|---|
setup_intent | SetupIntent 的唯一标识符。 |
setup_intent_client_secret | SetupIntent 对象的客户端私钥。 |
您可以用 stripe.retrieveSetupIntent,通过 setup_intent_client_secret
查询参数来检索 SetupIntent。成功确认 SetupIntent 会将得到的 PaymentMethod
Id(在 result.setupIntent.payment_method`` 中)保存至所提供的
Customer`。
注意
如果您有可以用来跟踪客户浏览器会话的工具,那么您可能需要将 stripe.com
域名添加到推荐人列表。重定向会导致一些工具创建新的会话,从而阻止您跟踪完整的会话。
以后对保存的支付方式扣款服务器端
合规
在保存客户的支付详情时,您需要负责遵守所有适用的法律、法规和卡组织规则。向您的最终客户显示过往支付方式以供未来购买时,确保您所列出的支付方式已从客户那里收集保存支付方式详情以供未来具体使用的同意书。对于客户绑定的支付方式,要区分哪些可以哪些不可以作为保存的支付方式供未来购物使用,请使用 allow_redisplay 参数。
When you’re ready to charge your customer off-session, use the Customer and PaymentMethod IDs to create a PaymentIntent. To find a payment method to charge, list the payment methods associated with your customer. This example lists cards but you can list any supported type.
当您有 Customer 和 PaymentMethod ID 时,创建一个包含付款金额和货币的 PaymentIntent。设置几个其他参数来进行会话外付款:
- 将 off_session 设置为
true
,以指示客户其在尝试付款时并不在您的结账流程中,并且无法完成合作伙伴(如发卡行、银行或其他支付机构)提出的身份验证请求。如果在您的结账流程中,合作伙伴要求进行验证,Stripe 将使用之前的会话内交易中的客户信息请求豁免。如果不满足豁免条件,PaymentIntent 可能会抛出一个错误。 - 将 PaymentIntent 的 confirm 属性的值设置为
true
,这样就会在创建 PaymentIntent 时立即进行确认。 - 将 payment_method 设置为 PaymentMethod 的 Id,并将 customer 设置为 Customer 的 ID。
付款尝试失败时,请求也会失败,并显示 402 HTTP 状态码,PaymentIntent 的状态为 requires_payment_method。您必须通知客户返回到您的应用程序(例如,发送电子邮件或应用程序内通知)来完成付款。
查看 Stripe API 库中生成的错误代码。如果付款因 authentication_required 拒付代码而失败,则使用被拒绝的具有 confirmPayment 的 PaymentIntent 的客户端私钥来允许客户授权付款。
const form = document.getElementById('payment-form'); form.addEventListener('submit', async (event) => { event.preventDefault(); const {error} = await stripe.confirmPayment({ // The client secret of the PaymentIntent clientSecret, confirmParams: { return_url: 'https://example.com/order/123/complete', }, }); if (error) { // This point will only be reached if there is an immediate error when // confirming the payment. Show error to your customer (for example, payment // details incomplete) const messageContainer = document.querySelector('#error-message'); messageContainer.textContent = error.message; } else { // Your customer will be redirected to your `return_url`. For some payment // methods like iDEAL, your customer will be redirected to an intermediate // site first to authorize the payment, then redirected to the `return_url`. } });
备注
stripe.confirmPayment
可能需要几秒才能完成。该时间内,禁止表单重复提交,并显示一个类似于微调器的等待指示器。如果收到错误,则向客户显示,重新启用表单,然后隐藏掉等待指示器。如果客户必须执行额外的步骤来完成付款,如身份验证,Stripe.js 将引导其完成该流程。
如果付款因其他原因失败,如资金不足,则将客户跳转到一个付款页面来输入新的支付方式信息。您可以重新使用现有的 PaymentIntent 来用新的支付详情来重新尝试付款。
测试集成应用
用测试付款详情和测试重定向页面验证您的集成。点击下方选项卡,查看每个支付方式的详情。
测试对保存的 SEPA 借记 PaymentMethod 的收款
用 iDEAL、Bancontact 或 Sofort 确认 SetupIntent ,生成一个可重复使用的 SEPA 直接借记 PaymentMethod。SEPA 直接借记是一种延迟通知型支付方式,它几天后会变为 succeeded
或 requires_payment_method
状态,在此之前会变为一个中间 processing
状态。
向您的客户披露 Stripe
Stripe 收集有关客户与 Elements 互动的信息,以向您提供服务、防范欺诈并改进其服务。这包括使用 Cookie 和 IP 地址来识别客户在单次结账会话中看到的 Elements。您有责任披露并获得 Stripe 以这些方式使用数据所需的所有权利和许可。有关更多信息,请访问我们的隐私中心。