沙箱环境与测试 Fixture
适用范围:接入
https://api.hiobuy.com(Workers 网关)的集成。Base URL 与生产相同。
套餐: 免费套餐包含自助文档与 Sandbox 访问。专属对接与履约支持在付费套餐中提供。
鉴权: 仅前缀为 hio_test_* 的密钥(key_type: test)会套用本文 Fixture 规则。hio_live_* 生产密钥不适用本页的任何说明,一律走真实上游(市场 / 仓配)。
相关:鉴权 · 响应结构 · 错误 · 限流 · 商品 · 订单 · 履约 · Webhook
重要:Warehouse Fulfillment 测试
Sandbox API(hio_test_*)用于基于 Mock / Fixture 的集成测试。
若 HIOBuy 已为您的应用分配 WH-DEV Warehouse Developer Code,请不要使用 Sandbox API Key 来测试分配给您的仓库配置。
请使用:
Production API Key(hio_live_*)+ WH-DEV
WH-DEV 仍是测试仓库配置。使用 Production API Key 配合 WH-DEV,不代表应用在进行真实仓库履约。
| 配置 | 用途 |
|---|---|
hio_test_* | Mock / Fixture API 测试 |
hio_live_* + WH-DEV | 使用测试仓库数据,验证分配给您的仓库集成 |
hio_live_* + 生产仓库授权 | 真实仓库履约 |
Sandbox Fulfillment 端点返回预定义或模拟数据。例如,沙箱仓点、余额、包裹、线路与包裹状态可能与分配给应用的 WH-DEV 配置不一致。
若您正在验证 WH-DEV 集成,请始终使用 Production API Key。
Public API 覆盖(摘要)
| 域 | 沙箱行为 |
|---|---|
| 全局 | response_format: upstream 拒绝(仅 standard)。currency 与生产一致会拒绝。sandbox_trigger 仅在 test key 下生效。test key 下层级 OAuth 默认视为已授权。配额 / 每分钟限流对 test key 跳过。 |
/v1/products/* | 搜索、详情、解析、上图、图搜、国内运费、batch-check、1688 分析类下文所述端点 有 Mock。未在本站正文覆盖的 OpenAPI 扩展路由 暂不 Mock。 |
/v1/orders/* | Preview、Create、Detail、Pay、Cancel、物流、列表、purchase/query 有 Mock(含 Magic sb_ord_* 与动态 sbo_*)。 |
/v1/fulfillment/* | 余额、报价、运输单、入库预报、包裹、无人认领、退运、仓点、VAS、服务请求、财务 有 Mock(见下文)。 |
/v1/support/tickets | 列表 / 详情 / 回复 有 Mock(tkt_*)。 |
| Webhooks | 沙箱资源 不会 自动推送 Webhook。请用门户 发送测试事件(livemode: false)验证接收端与签名。 |
设计目标
| 目标 | 含义 |
|---|---|
| 可重复 | 固定输入 ⇒ 固定输出(结果无随机漂移)。 |
| 可检索 | 每个场景有可稳定拷贝的 ID / keyword。 |
| 契约对齐 | 字段层级与生产 standard 一致;值不同。 |
| 默认成功 | 未命中 Fixture 时走 happy path。 |
| 显式失败 | 用 sb_* 或 sandbox_trigger 强制错误 / 边界态。 |
命名:sb_{domain}_{scenario}
| 段 | 规则 | 示例 |
|---|---|---|
| 前缀 | 固定 sb_ | sb_prod_not_found |
domain | 小写名词(prod、search、ord、shp、pkg、plat…) | — |
scenario | snake_case | not_found、pay_declined |
字符集:[a-z0-9_],长度 ≤ ~48。非故意触发时勿给真实上游 ID 加 sb_ 前缀。履约另有稳定非 sb_ ID(ret_*、ucp_*、svc_*、tkt_*、inv_*)。
两层失败模型
区分 传输 / API 错误 与 HTTP 200 业务态:
- API 失败 → HTTP 4xx/5xx +
error.code(如NOT_FOUND、PAYMENT_DECLINED)。 - HTTP 200 业务态 → 如
variants[].stock = 0、status: wait_payment。
商品 Fixture(摘要)
POST /v1/products/detail
见 商品详情。沙箱 不支持 upstream 格式。
当 id、product_id、解析出的 url、mi_id 或 tao_password 解析为 sb_* 时触发。
| Fixture id | 结果 | HTTP |
|---|---|---|
(任意非 sb_ id) | 标准 Mock 商品 | 200 |
sb_prod_not_found | NOT_FOUND | 404 |
sb_prod_offline | PRODUCT_UNAVAILABLE | 422 |
sb_prod_no_stock | 详情成功,stock: 0 | 200 |
curl https://api.hiobuy.com/v1/products/detail \
-H "Authorization: Bearer hio_test_..." \
-H "Content-Type: application/json" \
-d '{"channel":"1688","product_id":"sb_prod_not_found","language":"zh"}'POST /v1/products/search
channel、keyword、page、page_size、language 生效。1688 的 filter / sort / 价格筛选 接受但忽略(仍返回 Mock 列表)。
keyword(精确) | 结果 |
|---|---|
| 普通文本 | Mock 列表有结果 |
sb_search_empty | items: [],total: 0 |
sb_search_not_found | 同 empty |
解析 / 上图 / 图搜 / 运费 / 分析
| 端点 | 沙箱说明 |
|---|---|
| URL 解析 | URL 含 sb_* 时与 详情 行为一致。 |
| 图片上传 | 校验通过后固定 { "image_id": "img_sandbox_mock" }。 |
| 以图搜图 | 可选 keyword: sb_search_empty 得空列表;可与上图联调。 |
| 高级 — 运费估算 | 默认国内运费 Mock 800 分,与 preview 对齐。 |
| 高级 — batch-check | 返回 Mock mpProducts;mi_id/item_id 为 sb_prod_not_found 进排除列表。 |
| 高级 — 热词 / 榜单 / 日销 | 在文档所示字段用 sb_search_empty 可空列表或 404。 |
订单与支付 Fixture(Magic ID)
POST /v1/orders/detail
order_id | 典型 status | 说明 |
|---|---|---|
sb_ord_unpaid | wait_payment | — |
sb_ord_paid | wait_shipment | — |
sb_ord_shipped | wait_receive | — |
sb_ord_completed | completed | — |
sb_ord_cancelled | cancelled | — |
sb_ord_refunding | wait_shipment(退款进行中) | — |
sb_ord_not_found | — | 404 |
POST /v1/orders/pay
order_id | 结果 | HTTP |
|---|---|---|
sb_ord_unpaid | 支付成功 → 逻辑已支付 | 200 |
sb_ord_pay_declined | PAYMENT_DECLINED | 402 |
sb_ord_pay_insufficient | PAYMENT_INSUFFICIENT_FUNDS | 402 |
sb_ord_paid | ORDER_ALREADY_PAID | 409 |
sb_ord_cancelled | ORDER_CANCELLED | 409 |
sb_ord_upstream_timeout | CHANNEL_UPSTREAM_ERROR | 502 |
Preview / Create
预览 返回固定示例合计(行约 4500 + 运费约 800 分)。创建 生成动态 sbo_* 订单写入沙箱存储;行级 offer_id: sb_prod_offline / sb_prod_no_stock 返回 422(语义同生产)。
Cancel / 物流 / 列表 / 采购查询
见 取消、轨迹、详情 / 列表:待支付 sb_ord_* 与动态 sbo_* 可取消;已支付 / 已发货等返回 ORDER_NOT_CANCELLABLE。物流对 sb_ord_shipped / completed 有运单;待支付 / 待发货为 packages: []。买家列表可用 product_name: sb_ord_list_empty 得空列表。采购查询 返回上游风格 envelope。
履约 Fixture
说明: 下列 Fixture 仅用于 Sandbox API 测试,不代表您应用的 WH-DEV 仓库配置。WH-DEV 测试请使用 Production API Key(
hio_live_*)。
以下端点均需 hio_test_*。创建产生的动态 ID(pkg_*、sbs_*、sbi_*…)会按密钥持久化在沙箱存储中。
余额 · 报价 · 仓点 · VAS 目录
| 端点 | 沙箱说明 |
|---|---|
GET /v1/fulfillment/balance | Mock 可用余额 500000 分(CNY minor)。 |
POST /v1/fulfillment/shipping/quotes | 需 destination.country_code + 重量或尺寸;旧路径 …/shipments/freight/estimate 仍可用。 |
GET /v1/fulfillment/locations | loc_wh_001(威海)、loc_sz_001(深圳,暂停)、loc_yw_001(义乌)。 |
GET /v1/fulfillment/value-added-services | 稳定 CODE 价目;LEGACY_PHOTO_PRINT 为 INACTIVE,请求时不可用。 |
运输单 Shipments
Live 仓库 Public id 为数字主键字符串(如 "115");order_sn 为仓库单号。沙箱创单返回 sbs_*;下表 Fixture 使用 sb_shp_*。
| Fixture / id | 行为 |
|---|---|
sb_shp_unpaid | 列表 + 详情 为 PENDING;拦截 → SHIPMENT_NOT_INTERCEPTABLE |
sb_shp_shipped | 已发货 详情:分箱、头尾程、打包影像;另有国际 轨迹 事件。拦截 → REQUESTED |
sb_shp_not_found | 详情 404 |
sb_shp_pay_insufficient | POST …/shipments/sb_shp_pay_insufficient/pay → INSUFFICIENT_BALANCE |
sb_shp_not_cancellable | 取消 → SHIPMENT_NOT_CANCELLABLE;拦截允许(WAIT_SHIP) |
sb_shp_signed | 已签收;拦截 → SHIPMENT_NOT_INTERCEPTABLE |
sb_shp_intercepted | 详情 SHIPPED + interception.status: INTERCEPTED;再拦截 → SHIPMENT_INTERCEPTION_ALREADY_REQUESTED |
动态 sbs_* | create / pay / list / detail / cancel / intercept 走沙箱存储 |
sb_parcel_not_found | 创建 → 422 PARCEL_NOT_FOUND |
列表路径:GET /v1/fulfillment/shipments。轨迹路径:GET /v1/fulfillment/shipments/{id}/tracking(language query)。
入库预报(create / cancel)
创建返回动态 package_id(pkg_*)——没有单独的 inbound_id。
| 触发值 | 字段 | HTTP | error.code |
|---|---|---|---|
sb_inbound_shipped | tracking_number | 409 | INBOUND_TRACKING_ALREADY_SHIPPED |
sb_inbound_exists | tracking_number | 409 | INBOUND_TRACKING_ALREADY_EXISTS |
sb_inbound_bad_tracking | tracking_number | 422 | INVALID_TRACKING_NUMBER |
sb_inbound_external_exists | external_order_id | 409 | EXTERNAL_ORDER_ID_ALREADY_EXISTS |
sb_vas_missing | services[].service_code | 422 | VALUE_ADDED_SERVICE_NOT_FOUND |
sb_vas_unavailable | services[].service_code | 422 | VALUE_ADDED_SERVICE_UNAVAILABLE |
sb_vas_outbound | services[].service_code | 422 | VALUE_ADDED_SERVICE_INVALID_STAGE |
| 取消 id | HTTP | error.code |
|---|---|---|
动态 sbi_*(create 后) | 200 | 已取消;关联包丢弃 |
同一 sbi_* 再删 | 409 | INBOUND_NOT_EDITABLE |
sb_inb_not_found | 404 | INBOUND_NOT_FOUND |
sb_inb_received | 409 | INBOUND_ALREADY_RECEIVED |
sb_inb_shipped / sb_inb_consolidated / sb_inb_cancelled | 409 | INBOUND_NOT_EDITABLE |
包裹 · 轨迹 · 列表
package_id | 详情 / 轨迹 |
|---|---|
动态 pkg_* | PENDING;轨迹起点 INBOUND_CREATED |
sb_pkg_pending | PENDING |
sb_pkg_received | RECEIVED + PHOTO 时间线 |
sb_pkg_exception | RECEIVED + condition.EXCEPTION |
sb_pkg_shipped | SHIPPED 完整出库时间线 |
sb_pkg_not_found | 404 PACKAGE_NOT_FOUND |
无人认领包裹
| Id / 触发 | 行为 |
|---|---|
ucp_01K2ABCDEF1234567890 | 可认领;真实单号 SF123456789012(列表脱敏) |
ucp_01K2ABCDEF9876543210 | 可认领;YT738800001148 |
sb_ucp_not_found | 404 UNCLAIMED_PACKAGE_NOT_FOUND |
sb_ucp_already_claimed | 409 PACKAGE_ALREADY_CLAIMED |
sb_ucp_not_claimable | 409 PACKAGE_NOT_CLAIMABLE |
| 同一 ucp 错误单号 ×5 | 429 CLAIM_ATTEMPTS_EXCEEDED |
退运 Returns
| Id | 行为 |
|---|---|
ret_pending_001 | PENDING;fee=18;Confirm 成功 |
ret_pending_002 | PENDING;fee=20;Confirm 传 18 → RETURN_FEE_CHANGED |
ret_returned_001 | RETURNED + 运单 |
ret_cancelled_001 | CANCELLED |
sb_ret_not_found | 404 RETURN_NOT_FOUND |
sb_ret_fee_not_ready | Confirm → RETURN_FEE_NOT_READY |
sb_ret_insufficient | Confirm → INSUFFICIENT_BALANCE |
对 sb_pkg_shipped 创建 | 409 PACKAGE_NOT_RETURNABLE |
服务请求 Service requests
| Id | 行为 |
|---|---|
svc_photo_completed | PHOTO COMPLETED + 图片 |
svc_inspection_failed | BASIC_INSPECTION FAILED |
svc_video_processing | VIDEO PROCESSING |
svc_reinforce_pending | PACKAGE_REINFORCEMENT PENDING |
svc_wooden_awaiting | WOODEN_FRAME 待确认 |
sb_svc_not_found | 404 |
sb_svc_fee_not_ready / sb_svc_insufficient | Confirm 边界 |
财务(流水 / 发票)
| Fixture | 说明 |
|---|---|
txn_01K2ABC001…006 | TOP_UP / VAS / RETURN / SHIPPING / REFUND / STORAGE |
inv_01K2ABC001 | ISSUED(可下载) |
inv_01K2ABC002 | PENDING |
inv_01K2ABC003 | REJECTED |
见 履约财务。
工单 Fixture
| Fixture id | 场景 |
|---|---|
tkt_01K2ABCDEF1234567890 | PACKAGE · NORMAL · WAITING_FOR_HIOBUY |
tkt_01K2ABCDEF9876543210 | RETURN · URGENT · WAITING_FOR_CUSTOMER |
tkt_01K2ABCDEFAPIRESOLVED | API · NORMAL · RESOLVED |
tkt_01K2ABCDEFSHIPCLOSED | SHIPMENT · NORMAL · CLOSED(不可回复) |
tkt_not_found | 404 TICKET_NOT_FOUND |
见 支持工单。
平台触发:sandbox_trigger
仅 hio_test_* 生效;生产密钥静默忽略该字段。
sandbox_trigger | HTTP | error.code |
|---|---|---|
sb_plat_quota_exceeded | 429 | QUOTA_EXCEEDED |
sb_plat_rate_limited | 429 | RATE_LIMIT_EXCEEDED |
sb_plat_upstream_error | 502 | CHANNEL_UPSTREAM_ERROR |
可与普通合法 ID 组合,使 body 仍能通过校验:
{
"channel": "1688",
"product_id": "123456",
"language": "zh",
"sandbox_trigger": "sb_plat_quota_exceeded"
}特殊鉴权 Fixture sb_auth_channel_required 搭配 trigger 可产生 CHANNEL_AUTH_REQUIRED(403),用于 UI 回归(尽管沙箱默认已授权)。
实现状态快照
| 阶段 | 覆盖 | 说明 |
|---|---|---|
| 已上线 | 商品、代购订单、履约(余额/报价/运输单/入库/包裹/无人认领/退运/仓点/VAS/服务请求/财务)、支持工单 | 与本站 Public API 子集对齐。 |
| 尚未 | 沙箱资源自动推送 Webhook;未收录的 OpenAPI 商品扩展 | Webhook CI 请用门户 发送测试事件;勿假定所有 live 事件均已开启。 |
快速对照(复制用)
sb_prod_not_found → 404 商品不存在
sb_prod_offline → 422 下架
sb_prod_no_stock → 200 库存为 0
sb_search_empty → 搜索空结果
sb_ord_list_empty → 买家订单列表为空
img_sandbox_mock → upload-image 固定 ID
sb_ord_unpaid → detail 待支付 · pay 成功 · cancel 可
sb_ord_pay_declined → pay 402 PAYMENT_DECLINED
sb_ord_paid → pay 409 ALREADY_PAID · 未发货轨迹可能为空
sb_ord_shipped → detail 待收货 · 有轨迹
sb_ord_cancelled → 已取消 · pay 冲突
sb_shp_unpaid / sb_shp_shipped / sb_shp_signed / sb_shp_intercepted → 发货单列表 / 详情 / 拦截
sb_pkg_received / sb_pkg_shipped → 包裹详情 / 履约时间线
sb_inbound_exists → 入库 create 409 单号已存在
ret_pending_001 → 退运 Confirm 成功路径
ucp_01K2ABCDEF1234567890 → 无人认领可认领
svc_photo_completed → VAS 请求已完成
tkt_01K2ABCDEF1234567890 → 工单进行中
sb_plat_quota_exceeded → sandbox_trigger → 429 QUOTA_EXCEEDED内部新增 Fixture 时请沿用本编号体系做回归 — 切勿在 Mock 中改动 standard JSON 结构。
获取支持
需要集成帮助?请联系开发者支持 support@hiobuy.com · 预计 1–2 个工作日内回复