跳转到主要内容
基于已有的 checkout session 创建一次性购买订单,并返回托管的 PSP 支付 URL。
POST /v1/actions/onetime-order/create-order
认证方式: Session Token — 见 Customer Endpoints(customer 或 shopper 角色)

收银台流程

  1. 商户首先调用 创建 Checkout Session 锁定产品版本、价格与币种,拿到 sessionId
  2. 买家进入托管收银台页(或商户自建页面)确认账单信息
  3. 调用此接口完成下单 — 服务端冻结价格、根据 billingDetail 计算税额、写入订单并创建 PSP checkout
  4. 买家跳转到返回的 checkoutUrl 完成支付
  • 价格快照:下单时冻结价格,后续产品调价不影响本订单
  • 税额计算:根据 billingDetail(国家、US/CA 的州、EU 企业的 VAT)计算税额
  • PSP 容错:PSP 调用失败时订单会自动回滚,可以安全重试
  • 邮箱规范化:服务端在税额计算、订单存储、Session 回写以及 PSP 调用前会对 buyerEmailtrim().toLowerCase() 规范化,Foo@Bar.COMfoo@bar.com 视为同一买家

请求体

字段类型必需说明
checkoutSessionIdstring由「创建 Checkout Session」返回的会话 ID
billingDetailobject条件买家账单信息(见下)。Session 中未预填时必填
buyerEmailstring条件买家邮箱。Session 中未预填时必填;session token 已携带买家身份时被忽略
buyerIpstring买家 IP 地址(用于细化税额计算)
successUrlstring覆盖 session 上配置的支付成功跳转 URL
storeIdproductIdcurrency 已锁定在 checkout session 上,请求体中传入会被忽略。

Billing Detail 对象

字段类型必需说明
countrystringISO 3166-1 alpha-2 国家代码
isBusinessboolean是否企业购买
postcodestring邮编
statestring条件USCA 必填
businessNamestring条件isBusinesstrue 时必填
taxIdstring条件EU 国家 + isBusinesstrue 时必填(VAT 税号)

请求示例

import { WaffoPancake } from "@waffo/pancake-ts";

const client = new WaffoPancake({
  sessionToken: window.WAFFO_SESSION_TOKEN, // 由商户门户注入
  environment: "prod",
});

const result = await client.orders.createOnetime({
  checkoutSessionId: "cs_550e8400-e29b-41d4-a716-446655440000",
  buyerEmail: "customer@example.com",
  billingDetail: {
    country: "US",
    isBusiness: false,
    state: "CA",
  },
  successUrl: "https://example.com/thank-you",
});

console.log(result.checkoutUrl); // "https://checkout.stripe.com/c/pay/cs_xxx"

成功响应 (200)

{
  "data": {
    "checkoutUrl": "https://checkout.stripe.com/c/pay/cs_xxx"
  }
}

响应字段

字段类型说明
checkoutUrlstring托管 PSP 支付 URL — 引导买家跳转此处完成支付

错误响应

重试策略:4xx 一律不要重试 — 修正请求后重发。5xx 指数退避重试(起步 5s,最多 3 次)。
状态码errors[0].message含义推荐处理
400Invalid JSON body请求体不是合法 JSON修正请求体后重新提交
400Missing required field: checkoutSessionId未提供 checkoutSessionId修正请求体后重新提交
400Session product type mismatch: expected onetimeSession 是订阅产品创建的重新创建一次性 session 再重试
400Environment mismatch between request and sessionX-Environment 与 session 环境不一致使用匹配的环境后重新提交
400Missing billingDetail: provide in request body or pre-fill in checkout session请求和 session 都没有 billingDetail提供 billingDetail 后重新提交
400State is required for US/CAbillingDetail 校验失败修正 billingDetail 后重新提交
400Missing buyerEmail: provide in request body or pre-fill in checkout session请求和 session 都没有买家邮箱提供 buyerEmail 后重新提交
401Authentication failedSession token 无效、过期或格式错误通过 Issue Session Token 重新签发
403Session does not belong to this storeSession 属于其他门店使用调用方门店的 session
409Checkout session invalid, please re-enter checkoutSession 不存在或已过期重新创建 checkout session 并重启流程
500Internal server error服务端意外失败指数退避重试(起步 5s,最多 3 次)