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.

ConfigurationObjectif
hio_test_*Tests API mock / fixtures
hio_live_* + WH-DEVTests d’intégration entrepôt assigné avec données de test
hio_live_* + autorisation entrepôt productionFulfillment 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é)

DomaineSandbox
Globalresponse_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/ticketsList/detail/reply mockés avec fixtures tkt_*.
WebhooksLes 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

ObjectifSignification
ReproductibleMê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 contratJSON conforme aux champs du schéma standard de production ; valeurs différentes.
Happy path par défautLes ids inconnus retombent sur des mocks de succès génériques.
Échec expliciteUtilisez les ids sb_* ou sandbox_trigger pour forcer erreurs / états limites.

Nommage : sb_{domain}_{scenario}

SegmentRègleExemples
PréfixeToujours sb_sb_prod_not_found
domainNom en minuscules (prod, search, ord, shp, pkg, plat, …)
scenariosnake_casenot_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 idRésultatHTTP
(tout id non-sb_)Produit mock standard200
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 s’appliquent. Filtres 1688 filter / sort / prix acceptés mais ignorés pour les lignes mock.

keyword (exact)Résultat
texte ordinaireListe mock avec résultats
sb_search_emptyitems: [], total: 0
sb_search_not_foundAlias du vide

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

EndpointNote sandbox
Parse URLQuery/path URL contenant sb_* reproduit le comportement detail.
Upload imageToujours { "image_id": "img_sandbox_mock" } après validations réussies.
Image searchkeyword: sb_search_empty optionnel donne une liste vide ; associez à upload-image pour les tests de flux.
Advanced — freight estimateMock fret domestique par défaut 800 minor units aligné avec preview.
Advanced — batch-checkRetourne 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-trendUtilisez 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_idstatus typiqueNotes
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_idRésultatHTTP
sb_ord_unpaidPaiement réussi → état logique 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 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

EndpointNote sandbox
GET /v1/fulfillment/balanceSolde disponible mock 500000 CNY en minor units.
POST /v1/fulfillment/shipping/quotesNécessite destination.country_code + poids ou dimensions ; le legacy …/shipments/freight/estimate fonctionne encore.
GET /v1/fulfillment/locationsloc_wh_001 (Weihai), loc_sz_001 (Shenzhen, en pause), loc_yw_001 (Yiwu).
GET /v1/fulfillment/value-added-servicesListe 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 / 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 retourne un package_id dynamique (pkg_*) — il n’y a pas d’inbound_id séparée.

Valeur déclencheurChampHTTPerror.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
Id cancelHTTPerror.code
Dynamique sbi_* (après create)200Annulé ; package associé écarté
Même sbi_* à nouveau409INBOUND_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
Dynamique pkg_*PENDING ; tracking démarre à INBOUND_CREATED
sb_pkg_pendingPENDING
sb_pkg_receivedRECEIVED + timeline PHOTO
sb_pkg_exceptionRECEIVED + condition.EXCEPTION
sb_pkg_shippedSHIPPED timeline outbound complète
sb_pkg_not_found404 PACKAGE_NOT_FOUND

Unclaimed packages

Id / déclencheurComportement
ucp_01K2ABCDEF1234567890Claimable ; vrai tracking SF123456789012 (liste masquée)
ucp_01K2ABCDEF9876543210Claimable ; YT738800001148
sb_ucp_not_found404 UNCLAIMED_PACKAGE_NOT_FOUND
sb_ucp_already_claimed409 PACKAGE_ALREADY_CLAIMED
sb_ucp_not_claimable409 PACKAGE_NOT_CLAIMABLE
Mauvais tracking ×5 sur la même ucp429 CLAIM_ATTEMPTS_EXCEEDED

Returns

IdComportement
ret_pending_001PENDING ; fee=18 ; confirm réussit
ret_pending_002PENDING ; fee=20 ; confirm avec 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 sur sb_pkg_shipped409 PACKAGE_NOT_RETURNABLE

Service requests

IdComportement
svc_photo_completedPHOTO COMPLETED + images
svc_inspection_failedBASIC_INSPECTION FAILED
svc_video_processingVIDEO PROCESSING
svc_reinforce_pendingPACKAGE_REINFORCEMENT PENDING
svc_wooden_awaitingWOODEN_FRAME en attente de confirmation
sb_svc_not_found404
sb_svc_fee_not_ready / sb_svc_insufficientCas limites confirm

Finance (transactions / invoices)

FixtureNote
txn_01K2ABC001006TOP_UP / VAS / RETURN / SHIPPING / REFUND / STORAGE
inv_01K2ABC001ISSUED (téléchargeable)
inv_01K2ABC002PENDING
inv_01K2ABC003REJECTED

Voir Fulfillment finance.

Fixtures tickets support

Fixture idScénario
tkt_01K2ABCDEF1234567890PACKAGE · NORMAL · WAITING_FOR_HIOBUY
tkt_01K2ABCDEF9876543210RETURN · URGENT · WAITING_FOR_CUSTOMER
tkt_01K2ABCDEFAPIRESOLVEDAPI · NORMAL · RESOLVED
tkt_01K2ABCDEFSHIPCLOSEDSHIPMENT · NORMAL · CLOSED (sans replies)
tkt_not_found404 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_triggerHTTPerror.code
sb_plat_quota_exceeded429QUOTA_EXCEEDED
sb_plat_rate_limited429RATE_LIMIT_EXCEEDED
sb_plat_upstream_error502CHANNEL_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

PhaseCouvertureNotes
ShippedProducts, procurement orders, fulfillment (balance/quotes/shipments/inbounds/packages/unclaimed/returns/locations/VAS/service-requests/finance), support ticketsReflète le sous-ensemble Public API publié sur ce site.
Not yetWebhooks sandbox auto-émis ; extensions catalogue OpenAPI-only non publiéesPré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_EXCEEDED

Lorsque 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

Email support