行为说明
- 价格快照:下单时冻结订阅价格(
price_snapshot),支持二阶段定价(regularPhase+ 可选specialPhase,后者用于试用期)。 - 计费周期映射:
weekly->week/1,monthly->month/1,quarterly->month/3,yearly->year/1。 - PSP 容错:PSP 调用失败时本地订单自动取消,错误透传。
- Session 预填回退:请求体中的
billingDetail和buyerEmail会覆盖 session 上的预填值;两处都缺失时返回 400。 - 邮箱规范化:
buyerEmail使用前先做trim().toLowerCase()规范化。
storeId、productId、billingPeriod、currency。即便传递也会被忽略。
请求体
| 字段 | 类型 | 必需 | 说明 |
|---|---|---|---|
checkoutSessionId | string | 是 | 由 create-checkout-session 返回的 checkout session ID |
billingDetail | object | 条件必填 | 买家账单信息;若 session 未预填则必填 |
billingDetail.country | string | billingDetail 存在时必填 | 国家代码(ISO 3166-1 alpha-2) |
billingDetail.isBusiness | boolean | billingDetail 存在时必填 | 是否企业买家 |
billingDetail.postcode | string | 否 | 邮编 |
billingDetail.state | string | US/CA 必填 | 州 / 省代码 |
billingDetail.businessName | string | isBusiness=true 时必填 | 企业法定名称 |
billingDetail.taxId | string | EU 企业买家必填 | 税号(如 DE123456789) |
buyerEmail | string | 条件必填 | 买家邮箱;若 session 未预填则必填 |
buyerIp | string | 否 | 买家 IP 地址(用于税务计算) |
successUrl | string | 否 | 收银台后跳转 URL;覆盖 session 级别的配置 |
请求示例
成功响应 (200)
响应字段
| 字段 | 类型 | 说明 |
|---|---|---|
checkoutUrl | string | PSP 收银台页面 URL,引导买家跳转完成支付 |
错误响应
重试策略:4xx 一律不要重试 — 修正请求后重发。5xx 指数退避重试(起步 5s,最多 3 次)。
| 状态码 | errors[0].message | 含义 | 推荐处理 |
|---|---|---|---|
| 400 | Invalid JSON body | 请求体不是合法 JSON | 修正请求体后重新提交 |
| 400 | Missing required field: checkoutSessionId | 请求体未提供 checkoutSessionId | 修正请求体后重新提交 |
| 400 | Session product type mismatch: expected subscription | Session 是非订阅产品创建的 | 改用订阅产品创建的 session |
| 400 | Environment mismatch between request and session | 请求 X-Environment 与 session 环境不一致 | 对齐请求环境与 session 环境 |
| 400 | Session missing subscription information (productVersionId or billingPeriod) | Session 缺少必需的订阅字段 | 重新创建 checkout session |
| 400 | Missing billingDetail: provide in request body or pre-fill in checkout session | 请求体与 session 都没有 billingDetail | 在请求体中提供 billingDetail 后重新提交 |
| 400 | State is required for US/CA | US / CA 买家必须填写 billingDetail.state | 补充 billingDetail.state 后重新提交 |
| 401 | Authentication failed | Session token 无效、过期或格式错误 | 通过 Issue Session Token 重新签发 |
| 403 | Session does not belong to this store | Session 属于其他门店 | 检查 session 的门店归属 |
| 409 | Checkout session invalid, please re-enter checkout | Session 不存在或已过期 | 重新创建 checkout session |
| 500 | Internal server error | 服务端意外失败 | 指数退避重试(起步 5s,最多 3 次) |