Песочница и фикстуры
Аудитория: интеграции, работающие с
https://api.hiobuy.com(шлюз Workers) — тот же базовый URL, что и в production.
Тарифы: В бесплатных тарифах доступны документация для самостоятельной работы и Sandbox. Выделенная поддержка по интеграции и фулфилменту доступна на платных тарифах.
Аутентификация: детерминированные фикстуры применяются только к API-ключам с префиксом hio_test_* (key_type: test). Production-ключи hio_live_* никогда не используют правила этой страницы — они всегда обращаются к upstream-маркетплейсам / складам в обычном режиме.
Связанные документы: Authentication · Response format · Errors · Rate limits · Products · Orders · Fulfillment · Webhooks
Важно: тестирование 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 не означает, что приложение выполняет реальный складской fulfillment.
| Конфигурация | Назначение |
|---|---|
hio_test_* | Mock / fixture API testing |
hio_live_* + WH-DEV | Интеграционное тестирование назначенного склада с тестовыми данными |
hio_live_* + авторизация production-склада | Реальный складской fulfillment |
Sandbox Fulfillment endpoints возвращают предопределённые или симулированные данные. Например, sandbox-локации, балансы, посылки, маршруты и статусы могут отличаться от WH-DEV, назначенного вашему приложению.
При проверке WH-DEV-интеграции всегда используйте Production API key.
Покрытие Public API (кратко)
| Область | Песочница |
|---|---|
| Глобально | response_format: upstream отклоняется (только standard). Поле currency в теле отклоняется, как в prod. sandbox_trigger разрешён для test-ключей (фикстуры платформы). Channel OAuth считается авторизованным для hio_test_*. Квоты и rate limits пропускаются для test-ключей. |
/v1/products/* | Search, detail, parse, upload-image, search-by-image, freight estimate, batch-check, аналитика 1688 замокированы, как описано ниже. Расширения только в OpenAPI, не входящие в набор handoff этого сайта, не замокированы. |
/v1/orders/* | Preview, create, detail, pay, cancel, logistics trace, list, purchase query замокированы с magic / dynamic id. |
/v1/fulfillment/* | Balance, quotes, shipments, inbounds, packages, unclaimed, returns, locations, VAS, service-requests, finance замокированы с magic / dynamic id (см. ниже). |
/v1/support/tickets | List/detail/reply замокированы с фикстурами tkt_*. |
| Webhooks | Ресурсы sandbox не отправляют webhooks автоматически. Используйте портал Send test (livemode: false) для проверки приёмника и подписи. |
Цели проектирования
| Цель | Значение |
|---|---|
| Повторяемость | Один и тот же запрос → один и тот же ответ (без случайности в результатах). |
| Документированность | У каждого сценария есть стабильный id или keyword для поиска на этой странице. |
| Соответствие контракту | JSON соответствует полям схемы standard из production; значения отличаются. |
| Happy path по умолчанию | Неизвестные id возвращают generic success mocks. |
| Явный сбой | Используйте id 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. Не добавляйте префикс sb_ к реальным upstream id, если не хотите сработать фикстуру. Некоторые ресурсы fulfillment также используют стабильные id без sb_ (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.
Фикстуры товаров (кратко)
POST /v1/products/detail
См. Product detail. Формат upstream в песочнице не поддерживается.
Срабатывает, когда id, product_id, разобранный url, mi_id или tao_password разрешается в id sb_*.
| Fixture id | Результат | HTTP |
|---|---|---|
(любой id без sb_) | Стандартный mock-товар | 200 |
sb_prod_not_found | NOT_FOUND | 404 |
sb_prod_offline | PRODUCT_UNAVAILABLE | 422 |
sb_prod_no_stock | Detail ok, 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":"en"}'POST /v1/products/search
Применяются channel, keyword, page, page_size, language. Фильтры 1688 filter / sort / price принимаются, но игнорируются для mock-строк.
keyword (точное) | Результат |
|---|---|
| обычный текст | Mock-список с результатами |
sb_search_empty | items: [], total: 0 |
sb_search_not_found | Алиас пустого результата |
Parse / upload-image / search-by-image / freight / analytics
| Endpoint | Примечание для песочницы |
|---|---|
| Parse URL | URL query/path, содержащий sb_*, повторяет поведение detail. |
| Upload image | Всегда { "image_id": "img_sandbox_mock" } после успешной валидации. |
| Image search | Опциональный keyword: sb_search_empty даёт пустой список; сочетайте с upload-image для flow-тестов. |
| Advanced — freight estimate | Mock внутренней доставки по умолчанию 800 minor units, согласовано с preview. |
| Advanced — batch-check | Возвращает upstream-style envelope с mock mpProducts; используйте sb_prod_not_found в mi_id/item_id для списков исключений. |
| Advanced — top keywords/list / daily-sales-trend | Используйте sb_search_empty на category_id / rank_id, где описано, для пустых списков или 404 detail. |
Фикстуры заказов и оплаты (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 (refund_status in progress) | — |
sb_ord_not_found | — | 404 |
POST /v1/orders/pay
order_id | Результат | HTTP |
|---|---|---|
sb_ord_unpaid | Успешная оплата → логическое состояние paid | 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
Preview возвращает фиксированные иллюстративные итоги (пример строки ~4500 + freight ~800 в minor units). Create выдаёт динамические order_id с префиксом sbo_*, сохраняемые в sandbox storage — строки с offer_id: sb_prod_offline / sb_prod_no_stock возвращают 422, как в production.
Cancel / logistics / list / purchase query
По cancel, trace, detail list: неоплаченные sb_ord_* и динамические неоплаченные sbo_* отменяются; фикстуры paid/shipped и т.д. возвращают ORDER_NOT_CANCELLABLE. Logistics возвращает packages для mock sb_ord_shipped / completed; unpaid/paid-await-shipment возвращают packages: []. Список покупателя учитывает product_name: sb_ord_list_empty для пустых mock. Purchase query возвращает upstream envelopes; соответственно не используйте pseudo id для not-found.
Фикстуры fulfillment
Примечание: фикстуры ниже предназначены только для Sandbox API testing. Они не отражают WH-DEV warehouse configuration вашего приложения. Для WH-DEV testing используйте Production API key (
hio_live_*).
Все эндпоинты ниже требуют ключ hio_test_*. Динамические id из create (pkg_*, sbs_*, sbi_*, …) сохраняются в sandbox storage для ключа.
Balance · quotes · locations · VAS catalog
| Endpoint | Примечание для песочницы |
|---|---|
GET /v1/fulfillment/balance | Mock доступного баланса 500000 CNY minor units. |
POST /v1/fulfillment/shipping/quotes | Нужны destination.country_code + вес или габариты; legacy …/shipments/freight/estimate всё ещё работает. |
GET /v1/fulfillment/locations | loc_wh_001 (Weihai), loc_sz_001 (Shenzhen, paused), loc_yw_001 (Yiwu). |
GET /v1/fulfillment/value-added-services | Стабильный прайс-лист CODE; LEGACY_PHOTO_PRINT — INACTIVE → недоступен при запросе. |
Shipments
Live warehouse Public id is the numeric PK as a string (e.g. "115"); order_sn is the warehouse order number. Sandbox create returns sbs_*; fixtures below use sb_shp_*.
| Fixture / id | Behavior |
|---|---|
sb_shp_unpaid | List + detail PENDING; intercept → SHIPMENT_NOT_INTERCEPTABLE |
sb_shp_shipped | Shipped detail: split boxes, first/last-mile legs, packing files; plus international tracking events. Intercept → REQUESTED |
sb_shp_not_found | Detail 404 |
sb_shp_pay_insufficient | POST …/shipments/sb_shp_pay_insufficient/pay → INSUFFICIENT_BALANCE |
sb_shp_not_cancellable | Cancel → SHIPMENT_NOT_CANCELLABLE; intercept is allowed (WAIT_SHIP) |
sb_shp_signed | Signed; intercept → SHIPMENT_NOT_INTERCEPTABLE |
sb_shp_intercepted | Detail SHIPPED + interception.status: INTERCEPTED; intercept again → SHIPMENT_INTERCEPTION_ALREADY_REQUESTED |
Dynamic sbs_* | Create / pay / list / detail / cancel / intercept against sandbox storage |
sb_parcel_not_found | Create → 422 PARCEL_NOT_FOUND |
List path: GET /v1/fulfillment/shipments. Tracking path: GET /v1/fulfillment/shipments/{id}/tracking (language query).
Inbounds (create / cancel)
Create возвращает динамический package_id (pkg_*) — отдельного inbound_id нет.
| Trigger value | Field | 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 |
| Cancel id | HTTP | error.code |
|---|---|---|
Dynamic sbi_* (after create) | 200 | Отменён; связанный package удалён |
Same sbi_* again | 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 |
Packages · tracking · list
package_id | Detail / tracking |
|---|---|
Dynamic pkg_* | PENDING; tracking начинается с INBOUND_CREATED |
sb_pkg_pending | PENDING |
sb_pkg_received | RECEIVED + timeline PHOTO |
sb_pkg_exception | RECEIVED + condition.EXCEPTION |
sb_pkg_shipped | SHIPPED полный outbound timeline |
sb_pkg_not_found | 404 PACKAGE_NOT_FOUND |
Unclaimed packages
| Id / trigger | Поведение |
|---|---|
ucp_01K2ABCDEF1234567890 | Можно заявить; реальный tracking 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 |
| Wrong tracking ×5 на том же ucp | 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 + tracking |
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 |
Create на sb_pkg_shipped | 409 PACKAGE_NOT_RETURNABLE |
Service requests
| Id | Поведение |
|---|---|
svc_photo_completed | PHOTO COMPLETED + images |
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 edge cases |
Finance (transactions / invoices)
| Fixture | Примечание |
|---|---|
txn_01K2ABC001…006 | TOP_UP / VAS / RETURN / SHIPPING / REFUND / STORAGE |
inv_01K2ABC001 | ISSUED (скачиваемый) |
inv_01K2ABC002 | PENDING |
inv_01K2ABC003 | REJECTED |
См. Fulfillment finance.
Фикстуры support tickets
| 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 (без replies) |
tkt_not_found | 404 TICKET_NOT_FOUND |
См. Support tickets.
Триггеры платформы: sandbox_trigger
Разрешён только на hio_test_*; production-ключи тихо игнорируют поле.
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, чтобы реалистичные тела проходили валидацию:
{
"channel": "1688",
"product_id": "123456",
"language": "en",
"sandbox_trigger": "sb_plat_quota_exceeded"
}Специальная auth-фикстура sb_auth_channel_required, сочетаемая с триггерами, может давать CHANNEL_AUTH_REQUIRED (403) для UI-регрессий, несмотря на правило «authorized by default».
Снимок статуса реализации
| Фаза | Покрытие | Примечания |
|---|---|---|
| Shipped | Products, procurement orders, fulfillment (balance/quotes/shipments/inbounds/packages/unclaimed/returns/locations/VAS/service-requests/finance), support tickets | Отражает подмножество Public API, опубликованное на этом сайте. |
| Not yet | Автоматически эмитируемые sandbox webhooks; неопубликованные расширения каталога только в OpenAPI | Предпочитайте портал Send test для webhook CI; не предполагайте, что все live-события включены, пока не объявлено. |
Краткая шпаргалка
sb_prod_not_found → 404 product missing
sb_prod_offline → 422 unavailable
sb_prod_no_stock → 200 detail with zero stock
sb_search_empty → empty search/items
sb_ord_list_empty → empty buyer order list filter
img_sandbox_mock → stable upload-image id
sb_ord_unpaid → detail wait_payment • pay succeeds • cancel ok
sb_ord_pay_declined → pay 402 PAYMENT_DECLINED
sb_ord_paid → pay 409 ALREADY_PAID • trace maybe empty until shipped fixtures
sb_ord_shipped → detail wait_receive • trace populated
sb_ord_cancelled → cancelled state • pay conflicts
sb_shp_unpaid / sb_shp_shipped / sb_shp_signed / sb_shp_intercepted → shipment list / detail / intercept
sb_pkg_received / sb_pkg_shipped → package detail / fulfillment timeline
sb_inbound_exists → inbound create 409 tracking exists
ret_pending_001 → return confirm happy path
ucp_01K2ABCDEF1234567890 → unclaimed claimable
svc_photo_completed → VAS request completed
tkt_01K2ABCDEF1234567890 → support ticket open
sb_plat_quota_exceeded → sandbox_trigger → 429 QUOTA_EXCEEDEDПри добавлении фикстур внутри команды отражайте эту схему нумерации в регрессионных тестах — никогда не меняйте формы JSON standard внутри mock.
Get Support
Need integration help? Contact Developer Support at support@hiobuy.com · Response within 1–2 business days