Песочница и фикстуры

Аудитория: интеграции, работающие с 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/ticketsList/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, …)
scenariosnake_casenot_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_foundNOT_FOUND404
sb_prod_offlinePRODUCT_UNAVAILABLE422
sb_prod_no_stockDetail ok, 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":"en"}'

POST /v1/products/search

Применяются channel, keyword, page, page_size, language. Фильтры 1688 filter / sort / price принимаются, но игнорируются для mock-строк.

keyword (точное)Результат
обычный текстMock-список с результатами
sb_search_emptyitems: [], total: 0
sb_search_not_foundАлиас пустого результата

Parse / upload-image / search-by-image / freight / analytics

EndpointПримечание для песочницы
Parse URLURL query/path, содержащий sb_*, повторяет поведение detail.
Upload imageВсегда { "image_id": "img_sandbox_mock" } после успешной валидации.
Image searchОпциональный keyword: sb_search_empty даёт пустой список; сочетайте с upload-image для flow-тестов.
Advanced — freight estimateMock внутренней доставки по умолчанию 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_unpaidwait_payment
sb_ord_paidwait_shipment
sb_ord_shippedwait_receive
sb_ord_completedcompleted
sb_ord_cancelledcancelled
sb_ord_refundingwait_shipment (refund_status in progress)
sb_ord_not_found404

POST /v1/orders/pay

order_idРезультатHTTP
sb_ord_unpaidУспешная оплата → логическое состояние paid200
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

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/balanceMock доступного баланса 500000 CNY minor units.
POST /v1/fulfillment/shipping/quotesНужны destination.country_code + вес или габариты; legacy …/shipments/freight/estimate всё ещё работает.
GET /v1/fulfillment/locationsloc_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 / idBehavior
sb_shp_unpaidList + detail PENDING; intercept → SHIPMENT_NOT_INTERCEPTABLE
sb_shp_shippedShipped detail: split boxes, first/last-mile legs, packing files; plus international tracking events. Intercept → REQUESTED
sb_shp_not_foundDetail 404
sb_shp_pay_insufficientPOST …/shipments/sb_shp_pay_insufficient/payINSUFFICIENT_BALANCE
sb_shp_not_cancellableCancel → SHIPMENT_NOT_CANCELLABLE; intercept is allowed (WAIT_SHIP)
sb_shp_signedSigned; intercept → SHIPMENT_NOT_INTERCEPTABLE
sb_shp_interceptedDetail SHIPPED + interception.status: INTERCEPTED; intercept again → SHIPMENT_INTERCEPTION_ALREADY_REQUESTED
Dynamic sbs_*Create / pay / list / detail / cancel / intercept against sandbox storage
sb_parcel_not_foundCreate → 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 valueFieldHTTPerror.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
Cancel idHTTPerror.code
Dynamic sbi_* (after create)200Отменён; связанный package удалён
Same sbi_* again409INBOUND_NOT_EDITABLE
sb_inb_not_found404INBOUND_NOT_FOUND
sb_inb_received409INBOUND_ALREADY_RECEIVED
sb_inb_shipped / sb_inb_consolidated / sb_inb_cancelled409INBOUND_NOT_EDITABLE

Packages · tracking · list

package_idDetail / tracking
Dynamic pkg_*PENDING; tracking начинается с INBOUND_CREATED
sb_pkg_pendingPENDING
sb_pkg_receivedRECEIVED + timeline PHOTO
sb_pkg_exceptionRECEIVED + condition.EXCEPTION
sb_pkg_shippedSHIPPED полный outbound timeline
sb_pkg_not_found404 PACKAGE_NOT_FOUND

Unclaimed packages

Id / triggerПоведение
ucp_01K2ABCDEF1234567890Можно заявить; реальный tracking 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
Wrong tracking ×5 на том же ucp429 CLAIM_ATTEMPTS_EXCEEDED

Returns

IdПоведение
ret_pending_001PENDING; fee=18; confirm успешен
ret_pending_002PENDING; fee=20; confirm с 18 → RETURN_FEE_CHANGED
ret_returned_001RETURNED + tracking
ret_cancelled_001CANCELLED
sb_ret_not_found404 RETURN_NOT_FOUND
sb_ret_fee_not_readyConfirm → RETURN_FEE_NOT_READY
sb_ret_insufficientConfirm → INSUFFICIENT_BALANCE
Create на sb_pkg_shipped409 PACKAGE_NOT_RETURNABLE

Service requests

IdПоведение
svc_photo_completedPHOTO COMPLETED + images
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 edge cases

Finance (transactions / invoices)

FixtureПримечание
txn_01K2ABC001006TOP_UP / VAS / RETURN / SHIPPING / REFUND / STORAGE
inv_01K2ABC001ISSUED (скачиваемый)
inv_01K2ABC002PENDING
inv_01K2ABC003REJECTED

См. Fulfillment finance.

Фикстуры support tickets

Fixture idСценарий
tkt_01K2ABCDEF1234567890PACKAGE · NORMAL · WAITING_FOR_HIOBUY
tkt_01K2ABCDEF9876543210RETURN · URGENT · WAITING_FOR_CUSTOMER
tkt_01K2ABCDEFAPIRESOLVEDAPI · NORMAL · RESOLVED
tkt_01K2ABCDEFSHIPCLOSEDSHIPMENT · NORMAL · CLOSED (без replies)
tkt_not_found404 TICKET_NOT_FOUND

См. Support tickets.

Триггеры платформы: sandbox_trigger

Разрешён только на hio_test_*; production-ключи тихо игнорируют поле.

sandbox_triggerHTTPerror.code
sb_plat_quota_exceeded429QUOTA_EXCEEDED
sb_plat_rate_limited429RATE_LIMIT_EXCEEDED
sb_plat_upstream_error502CHANNEL_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».

Снимок статуса реализации

ФазаПокрытиеПримечания
ShippedProducts, 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

Email support