订单 API 参考
概述
本页列出订单模块的状态、端点、参数与错误码。完整流程请见淘宝/1688 下单与支付指南。如何通过 webhook 接收订单更新,另有独立参考页。
适用范围: 已支持多个市场。支付统一以 越南盾、美元或人民币(CNY) 计价——采购钱包以这三种货币之一充值;API 中的余额与订单金额均归一化为统一单位(
*_cny)。
Elim 是负责订单执行与支付的技术平台——不做零售,也不直接面向终端客户。你的系统通过采购钱包向 Elim 付款,Elim 再向平台上的卖家付款。因此每笔订单都有两个相互独立的状态——平台状态(status)和与 Elim 的支付状态(payment_status)——外加一个平台侧支付结果指示(platform_payment_status)。
所有端点均需 JWT 认证(Authorization: Bearer <token>)或 API Key(x-api-key)。见API 请求认证。
平台状态(status)
订单在淘宝 / 1688 侧的处理进度。
| 取值 | 说明 |
|---|---|
creating | 订单刚创建,等待平台确认 |
pending_payment | 平台已生成订单,等待支付 |
paid | 订单已在平台侧支付 |
shipped | 货物已出仓,运输中 |
completed | 订单完成,已确认收货 |
cancelled | 订单已取消 |
unknown | 无法从平台解析出状态 |
creating → pending_payment → paid → shipped → completed
↘ cancelled
Elim 支付状态(payment_status)
用户与 Elim 之间的支付进度。与 status 相互独立。
| 取值 | 说明 | 钱包中的资金 |
|---|---|---|
unpaid | 创建订单时的默认值——尚未发起支付申请 | 未受影响 |
requested | 用户已发起支付申请 | 已冻结(frozen_balance) |
approved | Elim 已审批申请,正在向平台支付 | 仍处于冻结 |
paid | 支付完成 | 已从 balance 扣除 |
rejected | Elim 拒绝申请(rejection_reason 给出原因) | 已释放回来 |
refunded | 已支付的订单退款至钱包 | 已重新计入 balance |
unpaid → requested → approved → paid → refunded
↑ ↓
└──── rejected
在 requested 状态下,用户可自行撤回申请回到 unpaid(见 cancel-payment-request)。进入 approved 后,只能通过退款回退。
平台支付结果(platform_payment_status)
仅在 Elim 向平台发起支付后才有取值。
| 取值 | 说明 |
|---|---|
pending | 正在向平台发送支付指令 |
success | 平台已记录支付 |
failed | 平台报错——Elim 将人工处理 |
unknown | 结果尚未确定 |
界面中请同时显示
status与payment_status。platform_payment_status主要用于出现问题时的诊断。
订单端点
前缀 /v1/orders。限流按秒级时间窗口计。
| 端点 | 方法 | 说明 | 限流 |
|---|---|---|---|
/v1/orders/preview | POST | 预览订单:预估总额、库存检查——不创建订单、不扣款 | 20 / 60s |
/v1/orders | POST | 在平台上创建真实订单 | 10 / 60s |
/v1/orders | GET | 列出当前用户的订单(分页) | 30 / 60s |
/v1/orders/stats | GET | 按时间范围 / 状态汇总的订单统计 | 30 / 60s |
/v1/orders/:id | GET | 订单详情——每次调用都会自动从平台同步最新状态 | 30 / 60s |
/v1/orders/:id/cancel | POST | 在仍可取消的状态下取消订单 | 10 / 60s |
/v1/orders/:id/logistic-detail?package_id=<int> | GET | 中国境内物流追踪(仅淘宝) | 20 / 60s |
预览与创建订单——请求体
{
"platform": "alibaba",
"receiver_address": {
"name": "Nguyen Van A",
"phone": "02812345678",
"mobile": "13800138000",
"address": "广州市天河区体育西路123号",
"province": "广东省",
"city": "广州市",
"area": "天河区",
"town": "天河南街道"
},
"line_items": [
{ "product_ref": "734467086498", "sku_ref": "5578084256927", "quantity": 2, "price": 15.5 }
],
"preview_token": "c5f75ec1-9f8d-4bf6-9de2-048d50fef349",
"idempotency_key": "checkout-2026-08-25-001",
"remark": "给卖家的备注",
"promotion_id": "PROMO123"
}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
platform | string | 是 | taobao 或 alibaba(1688) |
receiver_address | Address | 是 | 中国境内的有效收货地址 |
warehouse_address | Address | 否 | 发货仓库地址 |
line_items | LineItem[] | 是 | 商品清单(见下文) |
preview_token | string | 否 | 来自预览的 token;一次性使用,10 分钟后过期。创建订单时带上以锁定所预览的价格 |
idempotency_key | string | 建议 | 每次结账的防重复键。使用相同键的重复请求返回同一笔订单 |
client_order_id | string | 否 | 你自有系统的订单号(留空则自动生成) |
promotion_id | string | 否 | 优惠码 |
remark | string | 否 | 给卖家的备注 |
line_items[]
每个元素以 product_ref + sku_ref 组合标识商品,直接取自商品搜索 / 详情。
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
product_ref | string | 是 | 来自商品搜索响应的商品 ID 或链接 |
sku_ref | string | 是 | 对应的 SKU ID——淘宝:skus[].id · 1688:skus[].spec_id |
quantity | number | 是 | 数量 |
price | number | 否 | 单价(CNY)——建议提供,以便预览返回准确数字 |
mp_id+mp_skuid(marketplace ID)组合仍向后兼容接受。
receiver_address
| 字段 | 必填 | 说明 |
|---|---|---|
name | 是 | 收货人姓名 |
phone | 是 | 固定电话号码 |
mobile | 是 | 手机号码 |
address | 是 | 详细地址(中文) |
province / city / area | 建议 | 省 / 市 / 区县 |
town | 否 | 街道 / 乡镇 |
预览响应
{
"success": true,
"preview_token": "c5f75ec1-9f8d-4bf6-9de2-048d50fef349",
"currency": "CNY",
"total_product_amount": 31.0,
"total_post_fee": 8.0,
"total_amount": 39.0,
"shops": [
{
"seller_id": "b2b-2201234567",
"seller_name": "广州某某贸易有限公司",
"post_fee": 8.0,
"shop_amount": 31.0,
"items": [
{ "product_id": "734467086498", "sku_id": "5578084256927", "quantity": 2, "unit_price": 15.5, "total_price": 31.0 }
]
}
],
"unavailable_items": []
}
| 字段 | 说明 |
|---|---|
total_product_amount | 商品总额(CNY) |
total_post_fee | 中国境内运费总额 |
total_amount | 应付平台总额 = 商品 + 运费 |
unavailable_items[] | 无法下单的商品(缺货 / SKU 错误 / 已下架)。该数组非空时不要创建订单 |
创建订单响应
{
"status": "pending_payment",
"data": {
"id": "ORD0000000123",
"order_list": [
{
"success": true,
"amount": 39.0,
"post_fee": 8.0,
"lines": [
{ "sub_id": "E2101234567890", "product_id": "734467086498", "sku_id": "5578084256927", "quantity": 2, "amount": 31.0 }
]
}
]
}
}
| 字段 | 说明 |
|---|---|
data.id | 形如 ORD + 10 位数字的内部订单 ID——后续所有操作都用它 |
status | 成功时为 pending_payment;无法确定时为 unknown——中止支付流程,通过订单详情重新核对 |
data.order_list[] | 来自平台的店铺 + 明细——用于生成收据 |
新订单始终处于 payment_status = unpaid。
订单列表——筛选参数
GET /v1/orders
| 参数 | 类型 | 说明 |
|---|---|---|
page | number | 当前页(默认 1) |
size | number | 每页订单数(默认 20) |
platform | string | taobao / alibaba——留空 = 两者 |
status | string | 按平台状态筛选 |
payment_status | string | 按 Elim 支付状态筛选 |
client_order_id | string | 按你自有的订单号筛选 |
created_from / created_to | ISO date | 创建日期范围 |
响应: { total, page, size, items: OrderListItem[] }。
{
"total": 1, "page": 1, "size": 20,
"items": [
{
"id": "ORD0000000123",
"platform": "alibaba",
"status": "paid",
"payment_status": "paid",
"total_amount_cny": 39.0,
"total_amount": 39.0,
"products": [
{ "id": "734467086498", "name": "某某商品", "price": 15.5, "quantity": 2, "img_urls": ["https://..."] }
],
"created_at": "2026-04-09T10:30:00.000Z"
}
]
}
列表中的
line_items/products是下单时的快照。需要最新数据请调用GET /v1/orders/:id。
订单详情——各平台差异
GET /v1/orders/:id——响应前会自动从平台同步状态。
| 平台 | 商品清单 | 物流 |
|---|---|---|
| 1688 | products[] | logistics.logistics_info[] 内嵌在响应中 |
| 淘宝 | line_items[] | 另行调用 GET /v1/orders/:id/logistic-detail?package_id=<int> |
platform 字段在列表响应中即有——保存下来,在调用详情前用于选择展示方式。
package_id 是整数,取自淘宝订单详情响应,而非 ORD... ID。
取消订单——条件
POST /v1/orders/:id/cancel——仅当 status 为 creating 或 pending_payment 时。
若订单尚无平台订单号:
{ "success": true, "message": "Internal order cancelled, no external order to cancel" }。
采购钱包端点
前缀 /v1/purchasing。
| 端点 | 方法 | 说明 |
|---|---|---|
/v1/purchasing/wallet | GET | 钱包余额 |
/v1/purchasing/wallet/transactions | GET | 交易历史(分页) |
/v1/purchasing/exchange-rates | GET | 当前生效汇率 |
GET /v1/purchasing/wallet
{
"balance": 1670.30,
"frozen_balance": 286.50,
"available_balance": 1383.80,
"total_deposited": 5000.00,
"total_spent": 3329.70,
"updated_at": "2026-06-19T00:00:00.000Z"
}
| 字段 | 说明 |
|---|---|
balance | CNY 总余额 |
frozen_balance | 为 requested / approved 订单冻结的部分 |
available_balance | balance − frozen_balance——实际可用金额。用它与订单金额比较 |
total_deposited / total_spent | 累计数据 |
GET /v1/purchasing/wallet/transactions
参数:page、size、type、date_from、date_to。响应:{ total, page, size, items }。
type | 含义 |
|---|---|
deposit | 向钱包充值 |
order_freeze | 发起支付申请时冻结资金 |
order_unfreeze | 撤回申请或被拒绝时释放资金 |
order_deduction | 订单支付完成时扣款 |
order_refund | 订单退款至钱包 |
admin_adjustment | Elim 人工调整余额 |
GET /v1/purchasing/exchange-rates
按货币对(VND→CNY、USD→CNY)返回的生效汇率数组:source_currency、target_currency、rate(市场汇率)、markup_percent、effective_rate(Elim 加价后实际适用的汇率)。
订单支付端点
前缀 /v1/purchasing/orders/:id。:id 取 ORD... 形式。
| 端点 | 方法 | 起始状态 | 目标状态 | 说明 |
|---|---|---|---|---|
/request-payment | POST | unpaid | requested | 确认订单并发起支付申请——在钱包中冻结资金 |
/cancel-payment-request | POST | requested | unpaid | 撤回申请——释放已冻结资金 |
/confirm | POST | unpaid | paid | 直接支付(在已启用处)——立即扣款,不经审批步骤 |
/payment | GET | — | — | 订单支付记录详情 |
POST …/request-payment
{
"success": true,
"order_id": "ORD0000000123",
"frozen_amount": 286.50,
"goods_amount_cny": 281.50,
"shipping_fee_cny": 0,
"service_fee_cny": 5.00
}
钱包余额不足错误——400:
{
"error": "insufficient_balance",
"current_balance": 120.00,
"available_balance": 90.00,
"required": 286.50,
"deficit": 196.50
}
POST …/confirm
{
"order_id": "ORD0000000123",
"goods_amount_cny": 281.50,
"shipping_fee_cny": 0,
"service_fee_cny": 5.00,
"total_amount_cny": 286.50,
"payment_status": "paid",
"wallet_balance_after": 1383.80
}
用 wallet_balance_after 更新显示余额,无需再次调用 GET /v1/purchasing/wallet。
由 Elim 执行的状态流转
用户不会调用这些操作。列出它们是为了说明 payment_status 将如何变化,以及你何时会收到 payment.updated。
| Elim 操作 | 起始 | 目标 | 钱包影响 |
|---|---|---|---|
| 审批申请 | requested | approved | 资金仍冻结 |
| 拒绝申请 | requested | rejected | 释放已冻结资金;rejection_reason 给出原因 |
| 平台支付成功 | approved | paid | 扣除已冻结资金;platform_payment_status = success |
| 平台支付失败 | approved | unpaid | platform_payment_status = failed;Elim 将联系处理 |
| 退款 | paid | refunded | 重新计入 balance;生成 order_refund 交易 |
通过 webhook 接收订单更新
注册 webhook,使订单的 status 或 payment_status 每次变化时 Elim 都会回调你的系统——免去持续轮询状态。与订单模块相关的两个事件:
| 事件 | 何时发送 |
|---|---|
order.updated | 订单 status 变化:从平台同步、定期同步或取消订单 |
payment.updated | payment_status 变化:发起申请、撤回申请、审批、拒绝、平台支付完成/失败或退款 |
Payload 携带一份订单快照:data.order.id、status、payment_status、platform_payment_status、total_amount_cny、updated_at。处理完成后返回 HTTP 2xx。
注册端点、完整 payload 结构、请求头、HMAC 签名校验以及重试策略:见 Webhook 参考。
错误码
| HTTP | 情形 | 你应如何处理 |
|---|---|---|
400 | insufficient_balance | 再充值 deficit 数额的 CNY 后重新发起申请 |
400 | Cannot request payment: current status is "..." | 订单已不在 unpaid |
400 | 平台 ID 格式错误 | 检查 product_ref / sku_ref |
401 | JWT 过期 | 获取新 token |
403 | 访问了不属于本账户的订单 | 仅对自己的订单操作 |
404 | 订单 / 支付记录不存在 | 重新核对 ORD... ID |
422 | LINE_ITEM_SKU_NOT_RESOLVABLE / LINE_ITEM_PRODUCT_NOT_RESOLVABLE(淘宝) | sku_ref / product_ref 错误——从商品详情重新获取 |
429 | 超出限流 | 等待约 60 秒,放慢调用节奏 |
502 | 淘宝/1688 平台无响应 | 重试;不要创建重复订单 |
错误响应遵循 { statusCode, message, error } 结构。message 有时为越南语,可直接展示。
ID 约定
- 内部订单 ID:
ORD+ 10 位数字,例如ORD0000000123。用于所有端点。 - 平台订单号(
order_id): 由淘宝/1688 签发,仅在订单创建成功后才有。 package_id: 整数,用于淘宝物流追踪。
相关链接
- 淘宝/1688 下单与支付指南 —— 分步流程
- Webhook 参考 —— 接收
order.updated/payment.updated更新 - API 请求认证
- 完整 API 参考