Used to check for browser translation.
用于检测浏览器翻译。
ブラウザの翻訳を検出する
使用指南

Checkout 会话


Checkout 会话创建一个由 PaymentKit 托管的安全页面,用于收集支付信息。它是处理一次性付款(payment 模式)和设置周期性计费(subscription 模式)的基础组件。会话负责协调整个结账流程,从显示订单项到处理支付确认和重定向。

创建会话前,通常需要先配置好你的产品。更多信息,请参阅产品与价格指南。要了解如何在成功结账后管理生成的订阅,请参阅订阅指南。

结账流程#

此流程涉及你的应用程序前端和后端与 PaymentKit API 的交互。用户将被重定向至 PaymentKit 托管的页面以完成支付,这确保了敏感的支付信息绝不会由你的服务器直接处理。

用户PaymentKit API你的服务器客户端用户PaymentKit API你的服务器客户端请求购买商品payment.checkout.sessions.create({...}){ id: "cs_xxx", url: "https://pay.arcblock.io/..." }{ checkoutUrl: "https://pay.arcblock.io/..." }重定向至 checkoutUrl输入支付信息并付款重定向至 success_urlWebhook 事件 ("checkout.session.completed")根据 webhook 完成订单

创建 Checkout 会话#

创建一个新的 Checkout 会话。创建成功后,你可以将用户重定向至响应对象中返回的 url

参数

名称

类型

描述

success_url

string

必填。 客户成功付款后将被重定向到的 URL。

cancel_url

string

必填。 客户取消付款后将被重定向到的 URL。

line_items

object[]

必填。 对象数组,每个对象代表一个待购商品。见下方的 line_items 结构。

mode

string

必填。 会话模式。必须是 paymentsubscriptionsetup 之一。

customer_id

string

与此会话关联的现有客户的 ID。

subscription_data

object

modesubscription 时使用的数据。见下方的 subscription_data 结构。

expires_at

number

会话过期的 Unix 时间戳(秒)。会话必须在此时间之前完成。

metadata

object

一组可以附加到此对象的键值对。可用于存储附加信息。

allow_promotion_codes

boolean

在结账页面上启用优惠码。

line_items 结构

名称

类型

描述

price_id

string

必填。 Price 对象的 ID。

quantity

number

必填。 要购买的价格对应的数量。

subscription_data 结构

名称

类型

描述

trial_period_days

number

试用期持续天数。

service_actions

object[]

在订阅管理页面上向用户显示的自定义操作数组。

请求示例

import payment from '@blocklet/payment-js';

async function createSession() {
try {
const session = await payment.checkout.sessions.create({
success_url: 'https://example.com/success',
cancel_url: 'https://example.com/cancel',
mode: 'subscription',
line_items: [
{ price_id: 'price_xxx', quantity: 1 }
],
subscription_data: {
service_actions: [
{
type: 'notification',
text: { en: 'View Documentation', zh: '查看文档' },
link: 'https://docs.example.com',
triggerEvents: ['customer.subscription.started']
}
]
},
expires_at: Math.floor(Date.now() / 1000) + (60 * 30) // 30 分钟后过期
});
console.log('Checkout 会话 URL:', session.url);
// 将你的客户重定向到 session.url
} catch (error) {
console.error('创建 checkout 会话时出错:', error.message);
}
}

createSession();

响应示例

{
"id": "cs_xxx",
"object": "checkout.session",
"livemode": false,
"url": "https://pay.arcblock.io/checkout/cs_xxx",
"status": "open",
"mode": "subscription",
"success_url": "https://example.com/success",
"cancel_url": "https://example.com/cancel",
"customer_id": null,
"line_items": {
"object": "list",
"data": [
{
"id": "li_xxx",
"price_id": "price_xxx",
"quantity": 1
}
]
},
"expires_at": 1729245600,
"payment_status": "unpaid"
}

检索 Checkout 会话#

获取先前已创建的 Checkout 会话的详细信息。

参数

名称

类型

描述

id

string

必填。 Checkout 会话的唯一标识符。

请求示例

import payment from '@blocklet/payment-js';

async function retrieveSession(sessionId) {
try {
const session = await payment.checkout.sessions.retrieve(sessionId);
console.log('会话状态:', session.status);
console.log('支付状态:', session.payment_status);
} catch (error) {
console.error('检索会话时出错:', error.message);
}
}

retrieveSession('cs_xxx');

响应示例

{
"id": "cs_xxx",
"object": "checkout.session",
"status": "complete",
"payment_status": "paid",
"customer_id": "cus_xxx",
"subscription_id": "sub_xxx",
"livemode": false,
"url": null,
"line_items": { ... },
"created_at": "2024-10-18T10:00:00.000Z"
}

列出 Checkout 会话#

返回一个分页的 Checkout 会话列表。

参数

名称

类型

描述

customer_id

string

仅返回指定客户 ID 的会话。

status

string

仅返回具有指定状态的会话。可以是 opencompleteexpired

payment_intent_id

string

仅返回指定 Payment Intent 的会话。

subscription_id

string

仅返回指定 Subscription 的会话。

page

number

分页的页码。默认为 1。

pageSize

number

每页的项目数。默认为 20。

请求示例

import payment from '@blocklet/payment-js';

async function listCompletedSessions(customerId) {
try {
const sessions = await payment.checkout.sessions.list({
customer_id: customerId,
status: 'complete',
pageSize: 5
});
console.log(`为客户找到 ${sessions.count} 个已完成的会话。`);
sessions.list.forEach(session => {
console.log(`- 会话 ID: ${session.id}`);
});
} catch (error) {
console.error('列出会话时出错:', error.message);
}
}

listCompletedSessions('cus_xxx');

响应示例

{
"count": 15,
"list": [
{
"id": "cs_yyy",
"object": "checkout.session",
"status": "complete",
"payment_status": "paid",
"customer_id": "cus_xxx"
},
{
"id": "cs_zzz",
"object": "checkout.session",
"status": "complete",
"payment_status": "paid",
"customer_id": "cus_xxx"
}
]
}

使 Checkout 会话过期#

如果一个 Checkout 会话仍处于 open 状态,则可以使其过期。一旦过期,它将无法用于支付。

参数

名称

类型

描述

id

string

必填。 要使其过期的 Checkout 会话的 ID。

请求示例

import payment from '@blocklet/payment-js';

async function expireSession(sessionId) {
try {
const session = await payment.checkout.sessions.expire(sessionId);
console.log(`会话 ${session.id} 已过期。状态: ${session.status}`);
} catch (error) {
console.error('使会话过期时出错:', error.message);
}
}

expireSession('cs_abc');

响应示例

{
"id": "cs_abc",
"object": "checkout.session",
"status": "expired",
"payment_status": "unpaid",
"livemode": false
}

付款后履行订单#

虽然将用户重定向到 success_url 可以提供即时反馈,但这并非履行订单的安全方式。客户可以将成功 URL 添加到书签,并在不付款的情况下直接访问它。

要可靠且安全地管理支付后逻辑,你应该使用 Webhooks。通过监听 checkout.session.completed 事件,你的服务器可以在支付成功时从 PaymentKit 接收通知,从而安全地提供服务或发货。

有关详细指南,请参阅 Webhooks


本指南介绍了 Checkout 会话的生命周期。现在你可以为你的客户创建支付页面了。有关所有可用参数和方法的完整列表,请访问 Checkout 会话 API 参考