# Checkout 迁移指南

了解如何迁移到 Stripe 的最新集成。
![](https://b.stripecdn.com/docs-statics-srv/assets/migration.4db0b4061fb36d6a43762c3f23ef9c00.png)

旧版 Checkout 会向客户展示了一个模态对话框，用于收集卡片信息，并将生成的令牌或来源返回到您的网站。相比之下，[Payment Link](https://docs.stripe.com/payment-links.md) 和当前版本的 [Checkout](https://docs.stripe.com/payments/checkout.md) 是由 Stripe 托管的智能支付页面，可用来创建付款或*订阅* (A Subscription represents the product details associated with the plan that your customer subscribes to. Allows you to charge the customer on a recurring basis)。两种集成都支持 Apple Pay、Google Pay、动态 *3DS 验证* (3D Secure (3DS) provides an additional layer of authentication for credit card transactions that protects businesses from liability for fraudulent card payments)、*Connect* (Connect is Stripe's solution for multi-party businesses, such as marketplace or software platforms, to route payments between sellers, customers, and other recipients)、重用当前*客户* (Customer objects represent customers of your business. They let you reuse payment methods and give you the ability to track multiple payments)，以及很多其他功能。如果 Payment Link 和 Checkout 不适合您的用例，您还可[对比其他支付集成](https://docs.stripe.com/payments/online-payments.md#compare-features-and-availability)。

## Before you begin

如果您使用的是 Stripe 的 [SDK](https://docs.stripe.com/sdks.md)，请升级到最新版本。

## 选择您的业务模式

要从旧版 Checkout 迁移，请按照最能代表您的业务模式的指南进行。每个指南都会推荐一个集成路径，并附有示例代码。

- [动态产品目录和定价](https://docs.stripe.com/payments/checkout/migration.md#api-products)

  如果您有一个很大的产品目录，或需要支持动态生成行项目（例如捐款或税）。

- [动态订阅](https://docs.stripe.com/payments/checkout/migration.md#api-subscriptions)

  如果您是一家 SaaS 提供商，需要给客户计费，且需要高级功能支持。

- [Connect 平台和交易市场](https://docs.stripe.com/payments/checkout/migration.md#connect)

  如果您运营的是一个交易市场，连接服务提供者与客户。

- [保存支付方式供以后使用](https://docs.stripe.com/payments/checkout/migration.md#setup-mode)

  如果您运营的业务仅在服务完成后才向客户收款。

- [固定定价简单产品目录](https://docs.stripe.com/payments/checkout/migration.md#simple-products)

  如果您销售价格事先确定了的若干种产品。

- [简单订阅](https://docs.stripe.com/payments/checkout/migration.md#simple-subscriptions)

  如果您是一家 SaaS 提供商，执行月度订阅计划。

在参考相关指南的同时，您还可以参考[转换表](https://docs.stripe.com/payments/checkout/migration.md#parameter-conversion)，了解特定参数和配置选项之间的映射关系。

## 动态产品目录和定价

如果您销售的产品需要动态确定金额或行项目（例如，大的产品目录或捐款），则请查看[接受一次性付款](https://docs.stripe.com/payments/accept-a-payment.md?integration=checkout)。

使用旧版 Checkout 时，您需要在客户端创建令牌或来源，然后传递到您的服务器来创建收款。当前版本的 Checkout 的服务器集成逆转了此流程 — 在您的服务器上创建一个 Session，将客户重定向到 Checkout，在支付完成后客户再被重定向回您的应用。

### 升级前

使用旧版 Checkout 时，您需要显示动态金额和订阅并向客户收集银行卡信息。

```html
<form action="/purchase" method="POST">
  <script
    src="https://checkout.stripe.com/checkout.js"
    class="stripe-button"
    data-key="<<YOUR_PUBLISHABLE_KEY>>"
    data-name="Custom t-shirt"
    data-description="Your custom designed t-shirt"
    data-amount="{{ORDER_AMOUNT}}"
    data-currency="usd">
  </script>
</form>
```

接下来，将生成的令牌或来源发送到您的服务器，然后收款。

#### curl

```bash
curl https://api.stripe.com/v1/customers \
  -u <<YOUR_SECRET_KEY>>: \
  -d "email"="customer@example.com" \
  -d "source"="{{STRIPE_TOKEN}}"
curl https://api.stripe.com/v1/charges \
  -u <<YOUR_SECRET_KEY>>: \
  -d "customer"="{{CUSTOMER_ID}}" \
  -d "description"="Custom t-shirt" \
  -d "amount"="{{ORDER_AMOUNT}}" \
  -d "currency"="usd"
```

### 升级后

在您的网站上添加一个结账按钮，调用一个服务器端点来创建 [Checkout Session](https://docs.stripe.com/api/checkout/sessions/create.md)。

```html
<html>
  <head>
    <title>Buy cool new product</title>
  </head>
  <body>
    <!-- Use action="/create-checkout-session.php" if your server is PHP based. -->
    <form action="/create-checkout-session" method="POST">
      <button type="submit">Checkout</button>
    </form>
  </body>
</html>
```

Checkout Session 是客户被重定向到支付表单时所看到的内容的程序化展示。可通过多种选项对它进行配置，例如：

- 要扣款的[行项目](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-line_items)
- 要使用的货币

包含一个 `success_url` 并提供您网站上的某个页面的 URL，客户在完成付款后被重定向到此页面。

```curl
curl https://api.stripe.com/v1/checkout/sessions \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d "line_items[0][price_data][currency]=usd" \
  -d "line_items[0][price_data][product_data][name]=Custom 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"
```

在创建 Checkout Session 后，将客户重定向到在响应中返回的 [URL](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-url)。如果您需要在付款后为所购买的商品履单，请参阅[履行 Checkout 和支付链接付款](https://docs.stripe.com/checkout/fulfillment.md)。

## 动态订阅

如果您提供的订阅服务需要动态确定，或需要其他高级功能支持，则请查看[设置订阅](https://docs.stripe.com/billing/subscriptions/build-subscriptions.md)。

使用旧版 Checkout 时，您需要在客户端创建令牌或来源，然后传递到您的服务器来创建客户和订阅。当前版本的 Checkout 逆转了此流程 — 先在您的服务器上创建一个 Session，将客户重定向到 Checkout，成功后，客户再被重定向回您的应用。

### 升级前

使用旧版 Checkout 时，您需要显示订阅信息并收集客户的银行卡信息。

```html
<form action="/subscribe" method="POST">
  <script
    src="https://checkout.stripe.com/checkout.js"
    class="stripe-button"
    data-key="<<YOUR_PUBLISHABLE_KEY>>"
    data-name="Gold Tier"
    data-description="Monthly subscription with 30 days trial"
    data-amount="2000"
    data-label="Subscribe">
  </script>
</form>
```

接下来，将生成的令牌或来源发送到您的服务器，创建客户和订阅。

#### curl

```bash
curl https://api.stripe.com/v1/customers \
  -u <<YOUR_SECRET_KEY>>: \
  -d "email"="customer@example.com" \
  -d "source"="{{STRIPE_TOKEN}}"
curl https://api.stripe.com/v1/subscriptions \
  -u <<YOUR_SECRET_KEY>>: \
  -d "customer"="{{CUSTOMER_ID}}" \
  -d "items[0][price]"="{PRICE_ID}" \
  -d "trial_period_days"=30
```

### 升级后

在您的网站上添加一个结账按钮，调用一个服务器端点来创建 [Checkout Session](https://docs.stripe.com/api/checkout/sessions/create.md)。

```html
<html>
  <head>
    <title>Subscribe to cool new service</title>
  </head>
  <body>
    <!-- Use action="/create-checkout-session.php" if your server is PHP based. -->
    <form action="/create-checkout-session" method="POST">
      <button type="submit">Subscribe</button>
    </form>
  </body>
</html>
```

Checkout Session 是客户被重定向到支付表单时所看到的内容的程序化展示。可通过多种选项对它进行配置，例如：

- 要扣款的[行项目](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-line_items)
- 要使用的货币

包含一个 `success_url` 并提供您网站上的某个页面的 URL，客户在完成付款后被重定向到此页面。

```curl
curl https://api.stripe.com/v1/checkout/sessions \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d "line_items[0][price]={{PRICE_ID}}" \
  -d "line_items[0][quantity]=1" \
  -d "subscription_data[trial_period_days]=30" \
  -d mode=subscription \
  --data-urlencode "success_url=https://example.com/success"
```

在创建 Checkout Session 后，将客户重定向到在响应中返回的 [URL](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-url)。创建客户和订阅后，客户被重定向到 `success_url`。如果您需要在付款后为所购买的服务履单，请参阅[履行 Checkout 和支付链接付款](https://docs.stripe.com/checkout/fulfillment.md)。

## Connect 平台和交易市场

如果您运营的是 Connect 平台或交易市场，并且需要创建涉及 Connect 子账户的付款，则考虑使用当前版本的 Checkout。

以下示例演示用 Checkout Sessions API 处理直接收款。也可以结合使用 Checkout 和 Connect 以及[定向收款](https://docs.stripe.com/connect/destination-charges.md?platform=web&ui=stripe-hosted) 和 [独立收款和转账](https://docs.stripe.com/connect/separate-charges-and-transfers.md?platform=web&ui=stripe-hosted)。

### 升级前

使用旧版 Checkout 时，您需要在客户端向客户收集银行卡信息。

```html
<form action="/purchase" method="POST">
  <script
    src="https://checkout.stripe.com/checkout.js"
    class="stripe-button"
    data-key="<<YOUR_PUBLISHABLE_KEY>>"
    data-name="Food Marketplace"
    data-description="10 cucumbers from Roger's Farm"
    data-amount="2000">
  </script>
</form>
```

接下来，将生成的令牌或来源发送到您的服务器，并代 Connect 子账户收款。

#### curl

```bash
curl https://api.stripe.com/v1/charges \
  -u <<YOUR_SECRET_KEY>>: \
  -d "source"="{{TOKEN_ID}}" \
  -d "description"="10 cucumbers from Roger\"s Farm" \
  -d "amount"=2000 \
  -d "currency"="usd" \
  -d "application_fee_amount"=200 \
  -H "Stripe-Account: {{CONNECTED_STRIPE_ACCOUNT_ID}}"
```

### 升级后

在您的网站上添加一个结账按钮，调用一个服务器端点来创建 [Checkout Session](https://docs.stripe.com/api/checkout/sessions/create.md)。

```html
<html>
  <head>
    <title>Roger's Farm</title>
  </head>
  <body>
    <!-- Use action="/create-checkout-session.php" if your server is PHP based. -->
    <form action="/create-checkout-session" method="POST">
      <button type="submit">Checkout</button>
    </form>
  </body>
</html>
```

Checkout Session 是客户被重定向到支付表单时所看到的内容的程序化展示。可通过多种选项对它进行配置，例如：

- 要扣款的[行项目](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-line_items)
- 要使用的货币

包含一个 `success_url` 并提供您网站上的某个页面的 URL，客户在完成付款后被重定向到此页面。

```curl
curl https://api.stripe.com/v1/checkout/sessions \
  -u "<<YOUR_SECRET_KEY>>:" \
  -H "Stripe-Account: {{CONNECTEDACCOUNT_ID}}" \
  -d "line_items[0][price_data][currency]=usd" \
  --data-urlencode "line_items[0][price_data][product_data][name]=Cucumbers from Roger's Farm" \
  -d "line_items[0][price_data][unit_amount]=200" \
  -d "line_items[0][quantity]=10" \
  -d "payment_intent_data[application_fee_amount]=200" \
  -d mode=payment \
  --data-urlencode "success_url=https://example.com/success"
```

在创建 Checkout Session 后，将客户重定向到在响应中返回的 [URL](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-url)。如果您需要在付款后为所购买的商品或服务履单，请参阅[履行 Checkout 和支付链接付款](https://docs.stripe.com/checkout/fulfillment.md)。

## 保存支付方式供以后使用

如果您提供的服务不立即向客户收款，则请查看[设置未来付款](https://docs.stripe.com/payments/save-and-reuse.md?platform=checkout)。

使用旧版 Checkout 时，您需要在客户端创建令牌或来源，然后传递到您的服务器进行保存以供将来使用。当前版本的 Checkout 逆转了此流程 — 先在您的服务器上创建一个 Session，将客户重定向到 Checkout，成功后，客户再被重定向回您的应用。

### 升级前

使用旧版 Checkout 时，您需要显示收款信息并向客户收集银行卡信息。

```html
<form action="/subscribe" method="POST">
  <script
    src="https://checkout.stripe.com/checkout.js"
    class="stripe-button"
    data-key="<<YOUR_PUBLISHABLE_KEY>>"
    data-name="Cleaning Service"
    data-description="Charged after your home is spotless"
    data-amount="2000">
  </script>
</form>
```

接下来，将生成的令牌或来源发送到您的服务器，最终创建收款。

#### curl

```bash
curl https://api.stripe.com/v1/customers \
  -u <<YOUR_SECRET_KEY>>: \
  -d "email"="customer@example.com" \
  -d "source"="{{STRIPE_TOKEN}}"
curl https://api.stripe.com/v1/charges \
  -u <<YOUR_SECRET_KEY>>: \
  -d "customer"="{{CUSTOMER_ID}}" \
  -d "description"="Cleaning service" \
  -d "amount"="{{ORDER_AMOUNT}}" \
  -d "currency"="usd"
```

### 升级后

在您的网站上添加一个结账按钮，调用一个服务器端点来创建 [Checkout Session](https://docs.stripe.com/api/checkout/sessions/create.md)。

```html
<html>
  <head>
    <title>Cleaning service</title>
  </head>
  <body>
    <!-- Use action="/create-checkout-session.php" if your server is PHP based. -->
    <form action="/create-checkout-session" method="POST">
      <button type="submit">Subscribe</button>
    </form>
  </body>
</html>
```

Checkout Session 是客户被重定向到支付表单时所看到的内容的程序化展示。可通过多种选项对它进行配置，例如：

- 要扣款的[行项目](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-line_items)
- 要使用的货币

包含一个 `success_url` 并提供您网站上的某个页面的 URL，客户在完成付款设置后被重定向到此页面。

```curl
curl https://api.stripe.com/v1/checkout/sessions \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d mode=setup \
  -d currency=usd \
  --data-urlencode "success_url=https://example.com/success?session_id={CHECKOUT_SESSION_ID}"
```

创建 Checkout Session 后，将您的客户重定向到响应中返回的 [URL](https://docs.stripe.com/api/checkout/sessions/object.md#checkout_session_object-url) 以获取支付方式的详细信息。客户完成流程后将被重定向到 `success_url`。当您准备好收款时，从 Checkout Session 中[检索 SetupIntent](https://docs.stripe.com/payments/checkout/save-and-reuse.md?payment-ui=stripe-hosted#retrieve-checkout-session)，并使用它来准备交易。

## 固定价格的简单产品目录

如果您以固定定价销售产品（如 T 恤或电子书），请查看[支付链接](https://docs.stripe.com/payment-links/create.md) 指南。您可能已经使用旧版 Checkout 在客户端创建令牌或来源，然后将其传递到您的服务器来创建收款。

### 升级前

使用旧版 Checkout 时，您需要显示金额和订阅并向客户收集银行卡信息。

```html
<form action="/pay" method="POST">
  <script
    src="https://checkout.stripe.com/checkout.js"
    class="stripe-button"
    data-key="<<YOUR_PUBLISHABLE_KEY>>"
    data-name="T-shirt"
    data-description="Comfortable cotton t-shirt"
    data-amount="500"
    data-currency="usd">
  </script>
</form>
```

接下来，将生成的令牌或来源发送到您的服务器，创建客户和收款。

#### Curl

```bash
curl https://api.stripe.com/v1/customers \
  -u <<YOUR_SECRET_KEY>>: \
  -d "email"="{{STRIPE_EMAIL}}" \
  -d "source"="{{STRIPE_TOKEN}}"
curl https://api.stripe.com/v1/charges \
  -u <<YOUR_SECRET_KEY>>: \
  -d "customer"="{{CUSTOMER_ID}}" \
  -d "description"="T-shirt" \
  -d "amount"=500 \
  -d "currency"="usd"
```

### 升级后

创建一个表示项目的[产品](https://docs.stripe.com/api/products.md) 和[价格](https://docs.stripe.com/api/prices.md)。下例创建了产品内联。您也可以在[管理平台](https://dashboard.stripe.com/test/products) 中创建这些对象。

```curl
curl https://api.stripe.com/v1/prices \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d currency=usd \
  -d unit_amount=500 \
  -d "product_data[name]=T-shirt"
```

用产品和价格在管理平台中创建一个[支付联接](https://dashboard.stripe.com/payment-links/create)。创建链接后，点击**购买按钮**以配置设计并生成代码，您可将其复制粘贴到您的网站。

#### HTML

```html
<body>
  <h1>Purchase your new kit</h1>
  <!-- Paste your embed code script here. -->
  <script
    async
    src="https://js.stripe.com/v3/buy-button.js">
  </script>
  <stripe-buy-button
    buy-button-id="{{BUY_BUTTON_ID}}"
    publishable-key="<<YOUR_PUBLISHABLE_KEY>>"
  >
  </stripe-buy-button>
</body>
```

## 简单订阅

如果您提供的是简单的订阅服务（例如软件的每月访问权限），请参阅第 2 版的[支付链接](https://docs.stripe.com/payment-links/create.md) 指南。您可能已经在使用旧版 Checkout 时在客户端创建令牌或来源，然后传递到您的服务器来创建客户和订阅。

### 升级前

使用旧版 Checkout 时，您需要显示订阅信息并收集客户的银行卡信息。

```html
<form action="/subscribe" method="POST">
  <script
    src="https://checkout.stripe.com/checkout.js"
    class="stripe-button"
    data-key="<<YOUR_PUBLISHABLE_KEY>>"
    data-name="Gold Tier"
    data-description="Monthly subscription"
    data-amount="2000"
    data-currency="usd"
    data-label="Subscribe">
  </script>
</form>
```

接下来，将生成的令牌或来源发送到您的服务器，创建客户和订阅。

#### Curl

```bash
curl https://api.stripe.com/v1/customers \
  -u <<YOUR_SECRET_KEY>>: \
  -d "email"="{{STRIPE_EMAIL}}" \
  -d "source"="{{STRIPE_TOKEN}}"
curl https://api.stripe.com/v1/subscriptions \
  -u <<YOUR_SECRET_KEY>>: \
  -d "customer"="{{CUSTOMER_ID}}" \
  -d "items[][price]"="{PRICE_ID}" \
  -d "items[][quantity]"=1
```

### 升级后

创建一个表示订阅的[产品](https://docs.stripe.com/api/products.md) 和[价格](https://docs.stripe.com/api/prices.md)。下例中创建了产品内联。您也可以在[管理平台](https://dashboard.stripe.com/test/products) 中创建这些对象。

```curl
curl https://api.stripe.com/v1/prices \
  -u "<<YOUR_SECRET_KEY>>:" \
  -d currency=usd \
  -d unit_amount=2000 \
  -d "recurring[interval]=month" \
  -d "product_data[name]=Gold Tier"
```

用产品和价格在管理平台中创建一个[支付联接](https://dashboard.stripe.com/payment-links/create)。创建链接后，点击**购买按钮**以配置设计并生成代码，您可将其复制粘贴到您的网站。

#### HTML

```html
<body>
  <h1>Purchase your new kit</h1>
  <!-- Paste your embed code script here. -->
  <script
    async
    src="https://js.stripe.com/v3/buy-button.js">
  </script>
  <stripe-buy-button
    buy-button-id="{{BUY_BUTTON_ID}}"
    publishable-key="<<YOUR_PUBLISHABLE_KEY>>"
  >
  </stripe-buy-button>
</body>
```

## 参数转换

当前版本的 Checkout 支持旧版 Checkout 的大部分功能。但是，它们使用的 API 不同。下表是旧版和当前版本之间的参数和配置选项映射。有关配置选项的完整列表，请查看 [Checkout Sessions](https://docs.stripe.com/api/checkout/sessions.md)。

| 旧版本                | 当前版本                                                                 | 集成提示                                                                                                                                                                                                     |
| ------------------ | -------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `allowRememberMe`  | 不支持                                                                  | 通过指定 `customer` 参数创建 [Checkout Session](https://docs.stripe.com/api/checkout/sessions/create.md)，您可以重复使用现有客户。您还可以启用 [Link](https://docs.stripe.com/payments/link/checkout-link.md)，以允许客户安全地保存并重复使用其支付信息。 |
| `amount`           | 已自动计算所有 `line_items` 的总和                                             | 总金额是您传递到 Checkout 的行项目的和。                                                                                                                                                                                |
| `billingAddress`   | `Session.billing_address_collection`                                 | Checkout 在需要时自动收集账单地址，达到预防欺诈或合规的目的。将该参数设置为 `required`，则会始终收集账单地址。                                                                                                                                        |
| `closed`           | 当客户想要关闭 Checkout 时，他们会关闭浏览器标签页。                                      |
| `currency`         | `Session.currency`                                                   |                                                                                                                                                                                                          |
| `description`      | `Session.line_items.description` 或 `product.description`             | 如果指定价格，则 Checkout 会自动计算并生成付款频率的描述。如果指定 `Session.line_items`，则 Checkout 会显示每个行项目的 `name`。                                                                                                                 |
| `email`            | `Session.customer_email`                                             | 如果您已经知道客户的邮件地址，则在创建 Checkout Session 时可以预先填充 [customer_email](https://docs.stripe.com/api/checkout/sessions/create.md#create_checkout_session-customer_email)。                                           |
| `image`            | **公司品牌**：在管理平台中上传您的徽标或图标。

  **产品图片**：用 `product.images` 指定每个行项目的图片。 | Checkout 会针对贵商家的[品牌](https://docs.stripe.com/payments/checkout/customization/appearance.md#branding)和销售的产品使用特定的图片。Checkout 会默认显示您的徽标，并退回到您的商家名称旁的商家图标。                                                   |
| `key`              | 不再是向 Checkout 传递的参数                                                  |                                                                                                                                                                                                          |
| `locale`           | `Session.locale`                                                     | 创建 Checkout Session 时，您可以指定一个受支持的[语言环境](https://docs.stripe.com/payments/checkout/custom-components.md#localization)。                                                                                    |
| `name`             | `Session.line_items` 中指定的价格的 `product.name`                          | 如果指定一个价格，则 Checkout 显示属于该价格的产品的名称。如果指定 `Session.line_items`，则 Checkout 会显示每个行项目的 `name`。                                                                                                                 |
| `panelLabel`       | `submit_type`                                                        | Checkout 会根据您销售的项目自动定制按钮文本。对于一次性付款，请使用 [submit_type](https://docs.stripe.com/payments/checkout/custom-components.md#submit-button) 自定义按钮文本。                                                              |
| `shippingAddress`  | `session.shipping_address_collection`                                | 通过传递要配送到的 `allowed_countries` 的一个数组[收集收货地址信息](https://docs.stripe.com/payments/collect-addresses.md?payment-ui=checkout)。                                                                                |
| `token` 或 `source` | `success_url`                                                        | 完成付款时，JavaScript 已不再有回调。由于您的客户是在另一个页面付款的，请设置 `success_url` 以在他们完成付款后将其重定向。                                                                                                                               |
| `zipCode`          | Checkout 自动收集                                                        | Checkout 在需要时自动收集邮编，达到预防欺诈或合规的目的。                                                                                                                                                                        |

## See also

- [添加更多支付方式](https://docs.stripe.com/payments/payment-methods/overview.md)
- [收集地址和电话号码](https://docs.stripe.com/payments/collect-addresses.md)
