Environnement sandbox et fixtures
Public : intégrations déployées contre
https://api.hiobuy.com(passerelle Workers) — même URL de base qu’en production.
Auth : les fixtures déterministes s’appliquent uniquement aux clés API préfixées par hio_test_* (key_type: test). Les clés production hio_live_* n’utilisent jamais les règles de cette page — elles accèdent toujours aux marketplaces / entrepôts upstream normalement.
Docs associées : Authentication · Response format · Errors · Rate limits · Products · Orders · Fulfillment · Webhooks
Important : tests Warehouse Fulfillment
L’API Sandbox (hio_test_*) sert aux tests d’intégration par mock et fixtures.
Si HIOBuy a fourni à votre application un WH-DEV Warehouse Developer Code, n’utilisez pas la clé Sandbox API pour tester la configuration d’entrepôt qui vous est assignée.
Utilisez :
Production API Key (hio_live_*) + WH-DEV
WH-DEV reste une configuration d’entrepôt de test. Une Production API key avec WH-DEV ne signifie pas que votre application effectue du fulfillment en production.
| Configuration | Objectif |
|---|---|
hio_test_* | Tests API mock / fixtures |
hio_live_* + WH-DEV | Tests d’intégration entrepôt assigné avec données de test |
hio_live_* + autorisation entrepôt production | Fulfillment entrepôt en production |
Les endpoints Sandbox Fulfillment renvoient des données prédéfinies ou simulées. Par exemple, emplacements, soldes, colis, routes et statuts sandbox peuvent différer de la configuration WH-DEV assignée à votre application.
Pour valider une intégration WH-DEV, utilisez toujours votre Production API key.
Couverture Public API (résumé)
| Domaine | Sandbox |
|---|---|
| Global | response_format: upstream rejeté (standard uniquement). Champ currency dans le corps rejeté comme en prod. sandbox_trigger autorisé pour les clés test (fixtures plateforme). OAuth canal traité comme autorisé pour hio_test_*. Quotas et rate limits ignorés pour les clés test. |
/v1/products/* | Search, detail, parse, upload-image, search-by-image, freight estimate, batch-check, analytics 1688 mockés comme documenté ci-dessous. Extensions OpenAPI-only hors du jeu handoff de ce site non mockées. |
/v1/orders/* | Preview, create, detail, pay, cancel, logistics trace, list, purchase query mockés avec magic / dynamic ids. |
/v1/fulfillment/* | Balance, quotes, shipments, inbounds, packages, unclaimed, returns, locations, VAS, service-requests, finance mockés avec magic / dynamic ids (voir ci-dessous). |
/v1/support/tickets | List/detail/reply mockés avec fixtures tkt_*. |
| Webhooks | Les ressources sandbox n’émettent pas de webhooks automatiquement. Utilisez le portail Send test (livemode: false) pour vérifier le récepteur et la signature. |
Objectifs de conception
| Objectif | Signification |
|---|---|
| Reproductible | Même requête → même réponse (aucune aléatoire dans les résultats). |
| Documenté | Chaque scénario a un id ou keyword stable à rechercher sur cette page. |
| Aligné sur le contrat | JSON conforme aux champs du schéma standard de production ; valeurs différentes. |
| Happy path par défaut | Les ids inconnus retombent sur des mocks de succès génériques. |
| Échec explicite | Utilisez les ids sb_* ou sandbox_trigger pour forcer erreurs / états limites. |
Nommage : sb_{domain}_{scenario}
| Segment | Règle | Exemples |
|---|---|---|
| Préfixe | Toujours sb_ | sb_prod_not_found |
domain | Nom en minuscules (prod, search, ord, shp, pkg, plat, …) | — |
scenario | snake_case | not_found, pay_declined |
Caractères : [a-z0-9_], longueur ≤ ~48. Ne préfixez pas les vrais ids upstream avec sb_ sauf si vous voulez la fixture. Certaines ressources fulfillment utilisent aussi des ids stables hors sb_ (ret_*, ucp_*, svc_*, tkt_*, inv_*).
Deux niveaux d’échec
Distinguez erreurs transport/API et états métier en HTTP 200 :
- Échec API → HTTP 4xx/5xx +
error.code(ex.NOT_FOUND,PAYMENT_DECLINED). - HTTP 200 avec état → ex.
variants[].stock = 0,status: wait_payment.
Fixtures produits (vue d’ensemble)
POST /v1/products/detail
Voir Product detail. Le format upstream est non pris en charge en sandbox.
Déclenché quand id, product_id, url parsée, mi_id ou tao_password se résout en id sb_*.
| Fixture id | Résultat | HTTP |
|---|---|---|
(tout id non-sb_) | Produit mock standard | 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 s’appliquent. Filtres 1688 filter / sort / prix acceptés mais ignorés pour les lignes mock.
keyword (exact) | Résultat |
|---|---|
| texte ordinaire | Liste mock avec résultats |
sb_search_empty | items: [], total: 0 |
sb_search_not_found | Alias du vide |
Parse / upload-image / search-by-image / freight / analytics
| Endpoint | Note sandbox |
|---|---|
| Parse URL | Query/path URL contenant sb_* reproduit le comportement detail. |
| Upload image | Toujours { "image_id": "img_sandbox_mock" } après validations réussies. |
| Image search | keyword: sb_search_empty optionnel donne une liste vide ; associez à upload-image pour les tests de flux. |
| Advanced — freight estimate | Mock fret domestique par défaut 800 minor units aligné avec preview. |
| Advanced — batch-check | Retourne une enveloppe style upstream avec mock mpProducts ; utilisez sb_prod_not_found dans mi_id/item_id pour les listes d’exclusion. |
| Advanced — top keywords/list / daily-sales-trend | Utilisez sb_search_empty sur category_id / rank_id où documenté pour listes vides ou cas 404 detail. |
Fixtures commandes et paiement (magic ids)
POST /v1/orders/detail
order_id | status typique | Notes |
|---|---|---|
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 | Résultat | HTTP |
|---|---|---|
sb_ord_unpaid | Paiement réussi → état logique 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 retourne des totaux illustratifs fixes (ligne exemple ~4500 + fret ~800 en minor units). Create émet des order_id dynamiques préfixés sbo_* persistés en sandbox storage — les lignes référençant offer_id: sb_prod_offline / sb_prod_no_stock retournent 422 comme en production.
Cancel / logistics / list / purchase query
Selon cancel, trace, detail list : sb_ord_* impayés et sbo_* dynamiques impayés s’annulent ; fixtures paid/shipped/etc. retournent ORDER_NOT_CANCELLABLE. Logistics retourne packages pour mocks sb_ord_shipped / completed ; unpaid/paid-await-shipment retournent packages: []. La liste acheteur respecte product_name: sb_ord_list_empty pour mocks vides. Purchase query retourne des enveloppes upstream ; omettez les pseudo-ids not-found en conséquence.
Fixtures fulfillment
Note : les fixtures ci-dessous servent uniquement aux tests Sandbox API. Elles ne représentent pas la configuration WH-DEV de votre application. Pour les tests WH-DEV, utilisez une Production API key (
hio_live_*).
Tous les endpoints ci-dessous exigent une clé hio_test_*. Les ids dynamiques issus de create (pkg_*, sbs_*, sbi_*, …) sont persistés en sandbox storage pour la clé.
Balance · quotes · locations · catalogue VAS
| Endpoint | Note sandbox |
|---|---|
GET /v1/fulfillment/balance | Solde disponible mock 500000 CNY en minor units. |
POST /v1/fulfillment/shipping/quotes | Nécessite destination.country_code + poids ou dimensions ; le legacy …/shipments/freight/estimate fonctionne encore. |
GET /v1/fulfillment/locations | loc_wh_001 (Weihai), loc_sz_001 (Shenzhen, en pause), loc_yw_001 (Yiwu). |
GET /v1/fulfillment/value-added-services | Liste de prix CODE stable ; LEGACY_PHOTO_PRINT est INACTIVE → indisponible à la demande. |
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 retourne un package_id dynamique (pkg_*) — il n’y a pas d’inbound_id séparée.
| Valeur déclencheur | Champ | 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 cancel | HTTP | error.code |
|---|---|---|
Dynamique sbi_* (après create) | 200 | Annulé ; package associé écarté |
Même sbi_* à nouveau | 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 |
|---|---|
Dynamique pkg_* | PENDING ; tracking démarre à INBOUND_CREATED |
sb_pkg_pending | PENDING |
sb_pkg_received | RECEIVED + timeline PHOTO |
sb_pkg_exception | RECEIVED + condition.EXCEPTION |
sb_pkg_shipped | SHIPPED timeline outbound complète |
sb_pkg_not_found | 404 PACKAGE_NOT_FOUND |
Unclaimed packages
| Id / déclencheur | Comportement |
|---|---|
ucp_01K2ABCDEF1234567890 | Claimable ; vrai tracking SF123456789012 (liste masquée) |
ucp_01K2ABCDEF9876543210 | Claimable ; 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 |
| Mauvais tracking ×5 sur la même ucp | 429 CLAIM_ATTEMPTS_EXCEEDED |
Returns
| Id | Comportement |
|---|---|
ret_pending_001 | PENDING ; fee=18 ; confirm réussit |
ret_pending_002 | PENDING ; fee=20 ; confirm avec 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 sur sb_pkg_shipped | 409 PACKAGE_NOT_RETURNABLE |
Service requests
| Id | Comportement |
|---|---|
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 en attente de confirmation |
sb_svc_not_found | 404 |
sb_svc_fee_not_ready / sb_svc_insufficient | Cas limites confirm |
Finance (transactions / invoices)
| Fixture | Note |
|---|---|
txn_01K2ABC001…006 | TOP_UP / VAS / RETURN / SHIPPING / REFUND / STORAGE |
inv_01K2ABC001 | ISSUED (téléchargeable) |
inv_01K2ABC002 | PENDING |
inv_01K2ABC003 | REJECTED |
Voir Fulfillment finance.
Fixtures tickets support
| Fixture id | Scénario |
|---|---|
tkt_01K2ABCDEF1234567890 | PACKAGE · NORMAL · WAITING_FOR_HIOBUY |
tkt_01K2ABCDEF9876543210 | RETURN · URGENT · WAITING_FOR_CUSTOMER |
tkt_01K2ABCDEFAPIRESOLVED | API · NORMAL · RESOLVED |
tkt_01K2ABCDEFSHIPCLOSED | SHIPMENT · NORMAL · CLOSED (sans replies) |
tkt_not_found | 404 TICKET_NOT_FOUND |
Voir Support tickets.
Déclencheurs plateforme : sandbox_trigger
Autorisé uniquement sur hio_test_* ; les clés production ignorent le champ silencieusement.
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 |
Combinez avec des ids bénins pour que les corps réalistes passent la validation :
{
"channel": "1688",
"product_id": "123456",
"language": "en",
"sandbox_trigger": "sb_plat_quota_exceeded"
}La fixture auth spéciale sb_auth_channel_required associée aux triggers peut produire CHANNEL_AUTH_REQUIRED (403) pour les régressions UI malgré la règle « authorized by default ».
Instantané du statut d’implémentation
| Phase | Couverture | Notes |
|---|---|---|
| Shipped | Products, procurement orders, fulfillment (balance/quotes/shipments/inbounds/packages/unclaimed/returns/locations/VAS/service-requests/finance), support tickets | Reflète le sous-ensemble Public API publié sur ce site. |
| Not yet | Webhooks sandbox auto-émis ; extensions catalogue OpenAPI-only non publiées | Préférez le portail Send test pour le CI webhooks ; ne supposez pas que tous les événements live sont activés tant que non annoncé. |
Aide-mémoire rapide
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_EXCEEDEDLorsque vous ajoutez des fixtures en interne, reproduisez ce schéma de numérotation dans les tests de régression — ne modifiez jamais les formes JSON standard dans les mocks.
Get Support
Need integration help? Contact Developer Support at support@hiobuy.com · Response within 1–2 business days