沙箱环境与测试 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列表 / 详情 / 回复 有 Mocktkt_*)。
Webhooks沙箱资源 不会 自动推送 Webhook。请用门户 发送测试事件livemode: false)验证接收端与签名。

设计目标

目标含义
可重复固定输入 ⇒ 固定输出(结果无随机漂移)。
可检索每个场景有可稳定拷贝的 ID / keyword。
契约对齐字段层级与生产 standard 一致;值不同。
默认成功未命中 Fixture 时走 happy path。
显式失败sb_*sandbox_trigger 强制错误 / 边界态。

命名:sb_{domain}_{scenario}

规则示例
前缀固定 sb_sb_prod_not_found
domain小写名词(prodsearchordshppkgplat…)
scenariosnake_casenot_foundpay_declined

字符集:[a-z0-9_],长度 ≤ ~48。非故意触发时勿给真实上游 ID 加 sb_ 前缀。履约另有稳定非 sb_ ID(ret_*ucp_*svc_*tkt_*inv_*)。

两层失败模型

区分 传输 / API 错误HTTP 200 业务态

  • API 失败 → HTTP 4xx/5xx + error.code(如 NOT_FOUNDPAYMENT_DECLINED)。
  • HTTP 200 业务态 → 如 variants[].stock = 0status: wait_payment

商品 Fixture(摘要)

POST /v1/products/detail

商品详情。沙箱 不支持 upstream 格式。

idproduct_id、解析出的 urlmi_idtao_password 解析为 sb_* 时触发。

Fixture id结果HTTP
(任意非 sb_ id)标准 Mock 商品200
sb_prod_not_foundNOT_FOUND404
sb_prod_offlinePRODUCT_UNAVAILABLE422
sb_prod_no_stock详情成功,stock: 0200
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

channelkeywordpagepage_sizelanguage 生效。1688 的 filter / sort / 价格筛选 接受但忽略(仍返回 Mock 列表)。

keyword(精确)结果
普通文本Mock 列表有结果
sb_search_emptyitems: []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 mpProductsmi_id/item_idsb_prod_not_found 进排除列表。
高级 — 热词 / 榜单 / 日销在文档所示字段用 sb_search_empty 可空列表或 404。

订单与支付 Fixture(Magic ID)

POST /v1/orders/detail

order_id典型 status说明
sb_ord_unpaidwait_payment
sb_ord_paidwait_shipment
sb_ord_shippedwait_receive
sb_ord_completedcompleted
sb_ord_cancelledcancelled
sb_ord_refundingwait_shipment(退款进行中)
sb_ord_not_found404

POST /v1/orders/pay

order_id结果HTTP
sb_ord_unpaid支付成功 → 逻辑已支付200
sb_ord_pay_declinedPAYMENT_DECLINED402
sb_ord_pay_insufficientPAYMENT_INSUFFICIENT_FUNDS402
sb_ord_paidORDER_ALREADY_PAID409
sb_ord_cancelledORDER_CANCELLED409
sb_ord_upstream_timeoutCHANNEL_UPSTREAM_ERROR502

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/balanceMock 可用余额 500000 分(CNY minor)。
POST /v1/fulfillment/shipping/quotesdestination.country_code + 重量或尺寸;旧路径 …/shipments/freight/estimate 仍可用。
GET /v1/fulfillment/locationsloc_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_insufficientPOST …/shipments/sb_shp_pay_insufficient/payINSUFFICIENT_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}/trackinglanguage query)。

入库预报(create / cancel)

创建返回动态 package_idpkg_*)——没有单独的 inbound_id

触发值字段HTTPerror.code
sb_inbound_shippedtracking_number409INBOUND_TRACKING_ALREADY_SHIPPED
sb_inbound_existstracking_number409INBOUND_TRACKING_ALREADY_EXISTS
sb_inbound_bad_trackingtracking_number422INVALID_TRACKING_NUMBER
sb_inbound_external_existsexternal_order_id409EXTERNAL_ORDER_ID_ALREADY_EXISTS
sb_vas_missingservices[].service_code422VALUE_ADDED_SERVICE_NOT_FOUND
sb_vas_unavailableservices[].service_code422VALUE_ADDED_SERVICE_UNAVAILABLE
sb_vas_outboundservices[].service_code422VALUE_ADDED_SERVICE_INVALID_STAGE
取消 idHTTPerror.code
动态 sbi_*(create 后)200已取消;关联包丢弃
同一 sbi_* 再删409INBOUND_NOT_EDITABLE
sb_inb_not_found404INBOUND_NOT_FOUND
sb_inb_received409INBOUND_ALREADY_RECEIVED
sb_inb_shipped / sb_inb_consolidated / sb_inb_cancelled409INBOUND_NOT_EDITABLE

包裹 · 轨迹 · 列表

package_id详情 / 轨迹
动态 pkg_*PENDING;轨迹起点 INBOUND_CREATED
sb_pkg_pendingPENDING
sb_pkg_receivedRECEIVED + PHOTO 时间线
sb_pkg_exceptionRECEIVED + condition.EXCEPTION
sb_pkg_shippedSHIPPED 完整出库时间线
sb_pkg_not_found404 PACKAGE_NOT_FOUND

无人认领包裹

Id / 触发行为
ucp_01K2ABCDEF1234567890可认领;真实单号 SF123456789012(列表脱敏)
ucp_01K2ABCDEF9876543210可认领;YT738800001148
sb_ucp_not_found404 UNCLAIMED_PACKAGE_NOT_FOUND
sb_ucp_already_claimed409 PACKAGE_ALREADY_CLAIMED
sb_ucp_not_claimable409 PACKAGE_NOT_CLAIMABLE
同一 ucp 错误单号 ×5429 CLAIM_ATTEMPTS_EXCEEDED

退运 Returns

Id行为
ret_pending_001PENDING;fee=18;Confirm 成功
ret_pending_002PENDING;fee=20;Confirm 传 18 → RETURN_FEE_CHANGED
ret_returned_001RETURNED + 运单
ret_cancelled_001CANCELLED
sb_ret_not_found404 RETURN_NOT_FOUND
sb_ret_fee_not_readyConfirm → RETURN_FEE_NOT_READY
sb_ret_insufficientConfirm → INSUFFICIENT_BALANCE
sb_pkg_shipped 创建409 PACKAGE_NOT_RETURNABLE

服务请求 Service requests

Id行为
svc_photo_completedPHOTO COMPLETED + 图片
svc_inspection_failedBASIC_INSPECTION FAILED
svc_video_processingVIDEO PROCESSING
svc_reinforce_pendingPACKAGE_REINFORCEMENT PENDING
svc_wooden_awaitingWOODEN_FRAME 待确认
sb_svc_not_found404
sb_svc_fee_not_ready / sb_svc_insufficientConfirm 边界

财务(流水 / 发票)

Fixture说明
txn_01K2ABC001006TOP_UP / VAS / RETURN / SHIPPING / REFUND / STORAGE
inv_01K2ABC001ISSUED(可下载)
inv_01K2ABC002PENDING
inv_01K2ABC003REJECTED

履约财务

工单 Fixture

Fixture id场景
tkt_01K2ABCDEF1234567890PACKAGE · NORMAL · WAITING_FOR_HIOBUY
tkt_01K2ABCDEF9876543210RETURN · URGENT · WAITING_FOR_CUSTOMER
tkt_01K2ABCDEFAPIRESOLVEDAPI · NORMAL · RESOLVED
tkt_01K2ABCDEFSHIPCLOSEDSHIPMENT · NORMAL · CLOSED(不可回复)
tkt_not_found404 TICKET_NOT_FOUND

支持工单

平台触发:sandbox_trigger

hio_test_* 生效;生产密钥静默忽略该字段。

sandbox_triggerHTTPerror.code
sb_plat_quota_exceeded429QUOTA_EXCEEDED
sb_plat_rate_limited429RATE_LIMIT_EXCEEDED
sb_plat_upstream_error502CHANNEL_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_REQUIRED403),用于 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 个工作日内回复

发送邮件