# 具有 Checkout Sessions API Beta 更改日志的 Element
通过 Checkout Sessions API Beta 集成应用跟踪对 Element 的更改。
> 本文档包含与具有 Checkout Sessions API 的 Element Beta 测试版相关的更改日志。
>
> 如果您使用的是 [Clover](https://docs.stripe.com/changelog/clover.md) 或更高版本,则这个更新日志不适用于您。请参阅 [Stripe 更新日志](https://docs.stripe.com/changelog.md)。
## 迁移至 Clover
### Clover 变更
- (Breaking) [stripe.initCheckout](https://docs.stripe.com/js/custom_checkout/init) 方法现在由异步变为同步。这降低了渲染延迟,使 Elements 能够更早显示骨架加载器。请查阅[更新 initCheckout 使其同步](https://docs.stripe.com/changelog/clover/2025-09-30/update-init-checkout-synchronous.md)了解迁移详细信息。
- (Breaking) 如果已保存支付方式在 Checkout Session 中进行了配置,则会自动在 Payment Element 中启用,无需额外的客户端配置。请查阅[更新已保存支付方式的默认行为](https://docs.stripe.com/changelog/clover/2025-09-30/custom-checkout-saved-payment-method-defaults.md)了解详细信息。
- (Breaking) 加拿大、英国和波多黎各的银行卡支付不再自动收集邮政编码。如果您依赖此数据,请查阅[移除银行卡支付邮政编码](https://docs.stripe.com/changelog/clover/2025-09-30/postal_code_in_card_form_for_non_us_countries.md)。
- (Breaking) 对于 React 集成:
- 导入路径已从 `@stripe/react-stripe-js` 更改为 `@stripe/react-stripe-js/checkout`。
- [useCheckout](https://docs.stripe.com/js/react_stripe_js/checkout/use_checkout) 现在会返回一个不相交的并集,用于描述异步状态(`{type: 'loading'}`、`{type: 'success', checkout: ...}` 或 `{type: 'error', error: ...}`),而非抛出错误。
- [CheckoutProvider](https://docs.stripe.com/js/react_stripe_js/checkout/checkout_provider) 现在会无条件渲染子组件,而不是在 [initCheckout](https://docs.stripe.com/js/custom_checkout/init) 未成功时渲染 `null`。
### Clover 升级
在迁移到 Clover 之前,请首先将[您的集成更新](https://docs.stripe.com/checkout/elements-with-checkout-sessions-api/changelog.md#migrating-to-basil)至 Basil。
- 如果您使用任何 Stripe NPM 包,请务必将 `@stripe/stripe-js` 升级为至少 `8.0.0`,并将 `@stripe/react-stripe-js`升级为至少 `5.0.0`。
- 如果您通过脚本标签加载 Stripe.js,请按如下方式更新标签,即采用[带版本号的 Stripe.js 命名规范](https://docs.stripe.com/sdks/stripejs-versioning.md),将其指向 `clover`:
```html
Checkout
```
- 请将您后端集成的 API 版本更新为至少 `2025-09-30.clover`。
#### HTML + JS
请按以下方式更新您的集成:
1. 请移除任何 `await` 或与 `initCheckout` 相关的 `.then()` 调用。
1. 请将您的 `fetchClientSecret` 函数替换为客户端密钥字符串,或解析为客户端私钥字符串的 Promise。
1. 调用新的异步函数 `checkout.loadActions()` 以访问操作,例如取代了 `session()` 的 `getSession()`,或 `confirm()`。您只需调用 `loadActions()` 一次。
1. 如果您之前将 `initCheckout` 包裹在 `try...catch` 块中,请改为检查 `loadActions()` 解析后的 `type` 值以检查错误。
```javascript
const clientSecret = fetch("/create-checkout-session", {
method: "POST",
headers: { "Content-Type": "application/json" },
})
.then((r) => r.json())
.then((r) => r.clientSecret);
const checkout = stripe.initCheckout({
clientSecret
});
const paymentElement = checkout.createPaymentElement();
paymentElement.mount("#payment-element");
const loadActionsResult = await checkout.loadActions();
if (loadActionsResult.type === 'success') {
const session = loadActionsResult.actions.getSession();
}
```
#### React
请将您的 `@stripe/react-stripe-js` 依赖项升级到至少 `5.0.0` 版本。如果您是从 `4.0.0` 之前的版本升级,请务必阅读 [v4.0.0 发布说明](https://github.com/stripe/react-stripe-js/releases/tag/v4.0.0),了解额外的迁移步骤。
#### 导入变更
更新您的导入以使用新的结账专用入口点:
```jsx
import {useCheckout, PaymentElement} from '@stripe/react-stripe-js/checkout';
```
#### CheckoutProvider 和 useCheckout 变更
请将 `fetchClientSecret` 替换为 `clientSecret`。现在不必先检查 `useCheckout` 是否返回 `type: 'success'` 即可渲染 Elements,这可降低延迟,并让 Elements 能够更早显示骨架加载器。
```jsx
const App = () => {
const promise = useMemo(() => {
return fetch('/create-checkout-session', {
method: 'POST',
headers: { "Content-Type": "application/json" },
})
.then((res) => res.json())
.then((data) => data.clientSecret);
}, []);
return (
);
}
const CheckoutPage = () => {
const {type, ...rest} = useCheckout();
return (
);
}
```
更多详情请参见“[更新 initCheckout 为同步](https://docs.stripe.com/changelog/clover/2025-09-30/update-init-checkout-synchronous.md)”的更新日志条目。
## 迁移到 Basil
### Basil 变更
- (Breaking) 异步方法(如 [confirm](https://docs.stripe.com/js/custom_checkout/confirm) 或 [applyPromotionCode](https://docs.stripe.com/js/custom_checkout/apply_promotion_code))使用不同的架构进行解析:
- 如果成功,更新的会话状态将填充在 `session` 密钥下。以前是在 `success` 密钥下。
- (Breaking) 现在,如果 Checkout Session 上已设置了 [return_url](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-return_url),那么在 [confirm](https://docs.stripe.com/js/custom_checkout/confirm) 上传入 [returnUrl](https://docs.stripe.com/js/custom_checkout/confirm#custom_checkout_session_confirm-options-returnUrl) 时会抛出错误。
- (Breaking) 确认成功后重定向到的返回 URL 之前具有不一致的查询参数。现在删除了额外的参数,URL 仅包含在 [confirm](https://docs.stripe.com/js/custom_checkout/confirm) 上的 [returnUrl](https://docs.stripe.com/js/custom_checkout/confirm#custom_checkout_session_confirm-options-returnUrl) 或 Checkout Session 上的 [return_url](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-return_url) 中提供的内容。
- (Breaking) 改进了订阅模式 Session 的 Checkout Session API 延迟,并修复了阻止客户在首次尝试付款后更新会话的错误
- 此更改会在用户完成付款后创建订阅,因此在 Checkout Session 完成之前,`checkout_session.invoice` 和 `checkout_session.subscription` 为 null。
- 如果您当前仍在使用已弃用的 `payment_intent.invoice` 字段,我们建议使用 `checkout_session.completed` Webhook 来确保账单存在,并通过 `checkout_session.invoice` 或 [Invoice Payment list](https://docs.stripe.com/api/invoice-payment/list.md) 获取关联账单。
- 要了解更多信息,请阅读[2025-03-31.basil API 更新日志](https://docs.stripe.com/changelog/basil/2025-03-31/checkout-legacy-subscription-upgrade.md)。
- 将 [percentOff](https://docs.stripe.com/js/custom_checkout/session_object#custom_checkout_session_object-discountAmounts-percentOff) 添加到 [discountAmounts](https://docs.stripe.com/js/custom_checkout/session_object#custom_checkout_session_object-discountAmounts) 作为显示折扣的选项。
### Basil 升级
在迁移到 Basil 之前,首先[将您的集成更新](https://docs.stripe.com/checkout/elements-with-checkout-sessions-api/changelog.md#beta-changelog)到 `custom_checkout_beta_6`。
- 如果您使用的是任何 Stripe NPM 软件包,则必须先将 `@stripe/stripe-js` 和 `@stripe/react-stripe-js` 分别至少升级到 `7.0.0` 和 `3.6.0`。
- 如果通过脚本标记加载 Stripe.js,而且仍在使用 `v3` 或 `acacia`,请使用[版本化 Stripe.js 命名规范](https://docs.stripe.com/sdks/stripejs-versioning.md) 将标签更新为引用 `basil` 版本,如下所示:
```html
Checkout
```
- 初始化 Stripe.js 时删除 Stripe.js beta 标头。
#### HTML + JS
```js
const stripe = Stripe(
'<>', {
}
);
```
#### React
```javascript
import {loadStripe} from '@stripe/stripe-js';
const stripe = loadStripe("<>", {
});
```
- 删除 API 版本 Beta 标头,并在后端集成指定 API 版本,至少为 `2025-03-31.basil`。
### Before
#### TypeScript
```javascript
// Set your secret key. Remember to switch to your live secret key in production.
// See your keys here: https://dashboard.stripe.com/apikeys
import Stripe from 'stripe';
// Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
const stripe = new Stripe('<>', {
apiVersion: '2026-04-22.dahlia; custom_checkout_beta=v1' as any,
});
```
### After
#### TypeScript
```javascript
// Set your secret key. Remember to switch to your live secret key in production.
// See your keys here: https://dashboard.stripe.com/apikeys
import Stripe from 'stripe';
// Don't put any keys in code. See https://docs.stripe.com/keys-best-practices.
const stripe = new Stripe('<>', {
apiVersion: '2025-03-31.basil' as any,
});
```
## Beta 更改日志
具有 Checkout Sessions API Beta 的 Elements 使用两种 Beta 测试版本:
- 一个Stripe.js Beta 测试头(例如,`custom_checkout_beta_6`),它在您的前端集成设置。
- API 版本 Beta 测试头(例如,`custom_checkout_beta=v1`),该测试头在您的后端集成中设置。
### 前端 Beta 测试版
[初始化 Stripe.js](https://docs.stripe.com/payments/quickstart-checkout-sessions.md) 时指定前端 Beta 测试版本。
#### custom_checkout_beta_6
如果您使用的是任何 Stripe NPM 软件包,则必须先将 `@stripe/stripe-js` 和 `@stripe/react-stripe-js` 至少升级到 `6.1.0` 和 `3.5.0`。
- (Breaking) [total.appliedBalance](https://docs.stripe.com/js/custom_checkout/session_object#custom_checkout_session_object-total-appliedBalance) 的符号已被翻转。现在,正数会增加支付金额,负数会减少支付金额。
- (Breaking) 将 `clientSecret` 替换成了 [fetchClientSecret](https://docs.stripe.com/js/custom_checkout/init#custom_checkout_init-options-clientSecret)。更新您的集成,将解析的异步函数传递到客户端私钥,而不是传递静态值。
- (Breaking) Elements 方法已重命名。
- 如果您使用的是 React Stripe.js,除了升级 `@stripe/react-stripe-js` 之外,不需要进行任何操作。
- 如果您使用的是 HTML/JS:
- 使用 `createPaymentElement()` 而非 `createElement('payment')`。
- 使用 `createBillingAddressElement()` 而非 `createElement('address', {mode: 'billing'})`。
- 使用 `createShippingAddressElement()` 而非 `createElement('address', {mode: 'shipping'})`。
- 使用 `createExpressCheckoutElement()` 而非 `createElement('expressCheckout')`。
- 使用 `getPaymentElement()` 而非 `getElement('payment')`。
- 使用 `getBillingAddressElement()` 而非 `getElement('address', {mode: 'billing'})`。
- 使用 `getShippingAddressElement()` 而非 `getElement('address', {mode: 'shipping'})`。
- 使用 `getExpressCheckoutElement()` 而非 `getElement('expressCheckout')`。
- (Breaking) 更新了与确认相关的字段,以更准确地反映会话状态。
- [canConfirm](https://docs.stripe.com/js/custom_checkout/session_object#custom_checkout_session_object-canConfirm) 现在会响应任何挂载的 Billing Address Element 或 Shipping Address Element。
- [canConfirm](https://docs.stripe.com/js/custom_checkout/session_object#custom_checkout_session_object-canConfirm) 在有进行中的确认操作时,现在会变为 `false`。
- 删除了 `confirmationRequirements`。
- (Breaking) 如果在创建 Checkout Session 时提供了 [customer_email](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer_email),则 [updateEmail](https://docs.stripe.com/js/custom_checkout/update_email) 现在会引发错误。如果您打算预填充客户可以更新的电子邮件地址,请在页面加载后立即调用 `updateEmail`,而不是传递 `customer_email`。
- (Breaking) [returnUrl](https://docs.stripe.com/js/custom_checkout/confirm#custom_checkout_session_confirm-options-returnUrl) 必须是绝对 URL(例如,以 `https://` 开头,而不是以相对 URL 开头,例如 `/success`)。
- (Breaking) 将定价字段更新为嵌套对象,以便于呈现。
- 将数值替换为包含`amount`(格式化的货币字符串,例如 `$10.00`)和 `minorUnitsAmount`(表示货币最小单位值的整数)的对象。如果您已经在读取金额,请改为从 `minorUnitsAmount` 读取。
- 例如,将 `total.total` 替换为 [`total.total.minorUnitsAmount`](https://docs.stripe.com/js/custom_checkout/session_object#custom_checkout_session_object-total-total-minorUnitsAmount)。
- 您必须从 `checkout` 对象中读取 `total.total.amount` 或 `total.total.minorUnitsAmount` 和 `currency` 和 `minorUnitsAmountDivisor` 中的每一个,并显示在 UI 中,否则会引发错误。这有助于在 CheckoutSession 更新时保持结账页面同步,包括添加未来的 Stripe 功能,且只需最少的 UI 代码更改即可。
- 现在可以收集客户税号了。了解如何[收集税号](https://docs.stripe.com/tax/checkout/tax-ids.md)。
- 现在,结账页面底部提供了一个仅限在测试模式使用的助手,为您提供集成指导,并为常见测试场景提供快捷方式。
#### custom_checkout_beta_5
- (Breaking) `initCustomCheckout` 函数已被重命名为 [initCheckout](https://docs.stripe.com/js/custom_checkout/init)
- 在 React Stripe.js 中,`CustomCheckoutProvider` 被已重命名为 `CheckoutProvider`,`useCustomCheckout` 并被已重命名为 `useCheckout`。
- (Breaking)要确认 Express Checkout Element,请调用[confirm](https://docs.stripe.com/js/custom_checkout/confirm),并将[确认事件](https://docs.stripe.com/js/elements_object/express_checkout_element_confirm_event)作为 `expressCheckoutConfirmEvent` 传入。
- 以前,Express Checkout Element 通过调用 `event.confirm()` 来确认。
- (Breaking) 调用 [confirm](https://docs.stripe.com/js/custom_checkout/confirm) 时,Payment Element 和 Address Element 将验证表单输入并呈现任何错误。
- (Breaking) 错误消息已进行标准化和改进。
- 函数解决的返回错误/表示已知情况,例如无效的付款详情或资金不足。这些是可预测的问题,可以通过在结账页面上显示 `message` 来传达给您的客户。
- 函数抛出/拒绝执行时返回的错误,代表集成本身出现的错误,如参数无效或配置错误。这些错误不应展示给您的客户。
- (Breaking) 异步方法(如 [confirm](https://docs.stripe.com/js/custom_checkout/confirm) 或 [applyPromotionCode](https://docs.stripe.com/js/custom_checkout/apply_promotion_code))使用不同的架构进行解析:
- 添加了 `type="success"|"error"`鉴别器字段。
- 如果成功,更新的会话状态将填充在 `success` 密钥下。以前是在 `session` 密钥下。
- 否则,错误将继续填充在 `error` 密钥下。
- 向 [confirm](https://docs.stripe.com/js/custom_checkout/confirm) 添加了 `email`、`phoneNumber`、`billingAddress` 和 `shippingAddress` 选项。
- (Breaking) Address Element 不再自动更新 Session 上的 [billingAddress](https://docs.stripe.com/js/custom_checkout/session_object#custom_checkout_session_object-billingAddress) 或 [shippingAddress](https://docs.stripe.com/js/custom_checkout/session_object#custom_checkout_session_object-shippingAddress) 字段。
- 只要挂载了 Address Element,调用 [confirm](https://docs.stripe.com/js/custom_checkout/confirm) 时都会自动使用表单值。
- 在确认之前,侦听 [change 事件](https://docs.stripe.com/js/element/events/on_change?type=addressElement) 以使用 Address Element 值。
#### custom_checkout_beta_4
- 向 [Session 对象](https://docs.stripe.com/js/custom_checkout/session_object)添加的 [images](https://docs.stripe.com/js/custom_checkout/session_object#custom_checkout_session_object-lineItems-images)。
- 在创建 Payment Element 时添加的[字段](https://docs.stripe.com/js/custom_checkout/create_payment_element#custom_checkout_create_payment_element-options-fields)选项。
- 在创建 Express Checkout Element 时添加的 [paymentMethods](https://docs.stripe.com/js/custom_checkout/create_express_checkout_element#custom_checkout_create_express_checkout_element-options-paymentMethods) 选项。
- (Breaking) 现在,将无效选项传递给 [createElement](https://docs.stripe.com/js/custom_checkout/create_payment_element) 会引发错误。以前,无法识别的选项将被静默忽略。
- (Breaking) [updateEmail](https://docs.stripe.com/js/custom_checkout/update_email) 和 [updatePhoneNumber](https://docs.stripe.com/js/custom_checkout/update_phone_number) 异步应用更改。在客户完成输入完整的值之前调用这些方法可能会导致性能不佳。
- 不要在每个输入的更改事件上调用 `updateEmail` 或 `updatePhoneNumber`,而应等到客户完成输入时,例如在模糊输入时或提交表单进行付款时。
- `updateEmail` 现在验证输入的信息是否为格式正确的电子邮件地址,如果使用了无效的输入,则返回错误。
- `updatePhoneNumber` 仍然不对输入字符串执行任何验证。
#### custom_checkout_beta_3
- 以下字段已添加到 [Session 对象](https://docs.stripe.com/js/custom_checkout/session_object):
- [id](https://docs.stripe.com/js/custom_checkout/session_object#custom_checkout_session_object-id)
- [livemode](https://docs.stripe.com/js/custom_checkout/session_object#custom_checkout_session_object-livemode)
- [businessName](https://docs.stripe.com/js/custom_checkout/session_object#custom_checkout_session_object-businessName)
- 现可复用保存的银行卡。了解如何[保存和复用](https://docs.stripe.com/payments/checkout/save-during-payment.md)支付方式。
- (Breaking) Payment Element 的默认 [layout](https://docs.stripe.com/js/elements_object/create_payment_element#payment_element_create-options-layout) 已更改为 `accordion`。
- 要继续使用以前的默认布局,必须显式指定 `layout='tabs'`。
- (Breaking) [confirm](https://docs.stripe.com/js/custom_checkout/confirm) 的默认行为已更改为在成功确认后始终重定向到您 `return_url`。
- 以前,仅当客户选择基于重定向的支付方式时才会重定向 `confirm`。要继续使用原行为,必须将 [redirect=‘if_required’](https://docs.stripe.com/js/custom_checkout/confirm#custom_checkout_session_confirm-options-redirect) 传递到 `confirm`。
#### custom_checkout_beta_2
- (Breaking)`lineItem.recurring.interval_count` 字段已被删除并替换为 [lineItem.recurring.intervalCount](https://docs.stripe.com/js/custom_checkout/session_object#custom_checkout_session_object-lineItems-recurring-intervalCount)。
- (Breaking)`lineItem.amount` 字段已被删除并替换为以下内容:
- [lineItem.amountSubtotal](https://docs.stripe.com/js/custom_checkout/session_object#custom_checkout_session_object-lineItems-amountSubtotal)
- [lineItem.amountDiscount](https://docs.stripe.com/js/custom_checkout/session_object#custom_checkout_session_object-lineItems-amountDiscount)
- [lineItem.amountTaxInclusive](https://docs.stripe.com/js/custom_checkout/session_object#custom_checkout_session_object-lineItems-amountTaxInclusive)
- [lineItem.amountTaxExclusive](https://docs.stripe.com/js/custom_checkout/session_object#custom_checkout_session_object-lineItems-amountTaxExclusive)
#### custom_checkout_beta_1
*这是最初的前端测试版。*
### 后端版本
[设置服务器库时](https://docs.stripe.com/payments/quickstart-checkout-sessions.md#init-stripe)指定后端 Beta 测试版本。
*后端 Beta 测试版没有变化。*