بيئة Sandbox والـ fixtures

الجمهور: التكاملات الموجّهة إلى https://api.hiobuy.com (بوابة Workers) — نفس base URL كما في الإنتاج.

المصادقة: تُطبَّق الـ fixtures الحتمية فقط على مفاتيح API ذات البادئة hio_test_* (key_type: test). مفاتيح الإنتاج hio_live_* لا تستخدم أبداً قواعد هذه الصفحة — بل تصل دائماً إلى upstream marketplaces / المستودعات بشكل طبيعي.

وثائق ذات صلة: Authentication · Response format · Errors · Rate limits · Products · Orders · Fulfillment · Webhooks

مهم: اختبار Warehouse Fulfillment

Sandbox API (hio_test_*) مخصص لاختبارات التكامل المعتمدة على mock والـ fixtures.

إذا زوّد HIOBuy تطبيقك بـ WH-DEV Warehouse Developer Code، لا تستخدم مفتاح Sandbox API لاختبار إعداد المستودع المخصص لك.

استخدم:

Production API Key (hio_live_*) + WH-DEV

WH-DEV ما زال إعداد مستودع اختباري. استخدام Production API key مع WH-DEV لا يعني أن تطبيقك ينفّذ fulfillment مستودع حقيقي.

الإعدادالغرض
hio_test_*اختبار API mock / fixtures
hio_live_* + WH-DEVاختبار تكامل المستودع المخصص ببيانات مستودع اختبارية
hio_live_* + تفويض مستودع الإنتاجfulfillment مستودع حقيقي

تعيد نقاط Sandbox Fulfillment بيانات محددة مسبقًا أو محاكاة. على سبيل المثال، مواقع المستودع والأرصدة والطرود ومسارات الشحن وحالات الطرود في sandbox قد تختلف عن إعداد WH-DEV المخصص لتطبيقك.

عند التحقق من تكامل WH-DEV، استخدم دائمًا Production API key.

تغطية Public API (ملخص)

المجالSandbox
عامresponse_format: upstream مرفوض (standard فقط). حقل currency في body مرفوض كما في prod. sandbox_trigger مسموح لمفاتيح test (fixtures المنصة). Channel OAuth يُعامل كمُصرَّح لـ hio_test_*. تُتخطى الحصص وrate limits لمفاتيح test.
/v1/products/*Search وdetail وparse وupload-image وsearch-by-image وfreight estimate وbatch-check وanalytics 1688 مُحاكاة (mock) كما هو موثّق أدناه. امتدادات OpenAPI-only خارج مجموعة handoff لهذا الموقع غير مُحاكاة.
/v1/orders/*Preview وcreate وdetail وpay وcancel وlogistics trace وlist وpurchase query مُحاكاة بمعرّفات magic / dynamic.
/v1/fulfillment/*Balance وquotes وshipments وinbounds وpackages وunclaimed وreturns وlocations وVAS وservice-requests وfinance مُحاكاة بمعرّفات magic / dynamic (انظر أدناه).
/v1/support/ticketsList/detail/reply مُحاكاة بـ fixtures من نوع tkt_*.
Webhooksموارد sandbox لا ترسل webhooks تلقائيًا. استخدم بوابة Send test (livemode: false) للتحقق من المستقبل والتوقيع.

أهداف التصميم

الهدفالمعنى
قابل للتكرارنفس الطلب → نفس الاستجابة (بلا عشوائية في النتائج).
موثّقلكل سيناريو معرّف أو keyword ثابت يمكن البحث عنه في هذه الصفحة.
متوافق مع العقدJSON يطابق حقول مخطط standard من الإنتاج؛ القيم تختلف.
Happy path افتراضيالمعرّفات غير المعروفة تعود إلى mocks نجاح عامة.
فشل صريحاستخدم معرّفات sb_* أو sandbox_trigger لإجبار الأخطاء / حالات الحافة.

التسمية: sb_{domain}_{scenario}

الجزءالقاعدةأمثلة
البادئةدائماً sb_sb_prod_not_found
domainاسم بصيغة lowercase (prod, search, ord, shp, pkg, plat, …)
scenariosnake_casenot_found, pay_declined

الأحرف: [a-z0-9_]، الطول ≤ ~48. لا تُضِف بادئة sb_ لمعرّفات upstream حقيقية إلا إذا قصدت الـ fixture. تستخدم بعض موارد fulfillment أيضاً معرّفات مستقرة غير 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.

fixtures المنتجات (مختصر)

POST /v1/products/detail

راجع Product detail. صيغة upstream غير مدعومة في sandbox.

يُفعَّل عندما يُحل id, product_id أو url المُحلَّلة أو mi_id أو tao_password إلى معرّف sb_*.

Fixture idالنتيجةHTTP
(أي معرّف غير 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 / السعر مقبولة لكنها تُتجاهَل لصفوف mock.

keyword (تطابق تام)النتيجة
نص عاديقائمة mock بنتائج
sb_search_emptyitems: [], total: 0
sb_search_not_foundمرادف للفراغ

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

Endpointملاحظة sandbox
Parse URLquery/path URL يحتوي sb_* يعكس سلوك detail.
Upload imageدائماً { "image_id": "img_sandbox_mock" } بعد نجاح التحقق.
Image searchkeyword: sb_search_empty اختياري يُنتج قائمة فارغة؛ ادمجه مع upload-image لاختبارات التدفق.
Advanced — freight estimatemock الشحن المحلي الافتراضي 800 minor units متوافق مع preview.
Advanced — batch-checkيُرجع envelope بأسلوب upstream مع 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.

fixtures الطلبات والدفع (magic ids)

POST /v1/orders/detail

order_idstatus نموذجيملاحظات
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دفع ناجح → حالة paid منطقية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

Preview يُرجع إجماليات توضيحية ثابتة (سطر نموذجي ~4500 + شحن ~800 minor units). Create يُصدِر قيم order_id ديناميكية ببادئة sbo_* محفوظة في sandbox storage — الأسطر التي تشير إلى offer_id: sb_prod_offline / sb_prod_no_stock تُرجع 422 كما في الإنتاج.

Cancel / logistics / list / purchase query

وفق cancel وtrace وdetail list: sb_ord_* غير المدفوعة وsbo_* الديناميكية غير المدفوعة تُلغى؛ fixtures paid/shipped وغيرها تُرجع ORDER_NOT_CANCELLABLE. Logistics يُرجع packages لـ mocks sb_ord_shipped / completed؛ unpaid/paid-await-shipment تُرجع packages: []. قائمة المشتري تحترم product_name: sb_ord_list_empty للـ mocks الفارغة. Purchase query يُرجع upstream envelopes؛ تجنّب pseudo ids الخاصة بـ not-found حسب الحاجة.

fixtures الـ Fulfillment

ملاحظة: الـ fixtures أدناه لاختبار Sandbox API فقط. لا تمثل إعداد WH-DEV لمستودع تطبيقك. لاختبار WH-DEV، استخدم Production API key (hio_live_*).

تتطلّب جميع نقاط النهاية أدناه مفتاح hio_test_*. تُحفَظ المعرّفات الديناميكية من create (pkg_*, sbs_*, sbi_*, …) في sandbox storage للمفتاح.

Balance · quotes · locations · VAS catalog

Endpointملاحظة sandbox
GET /v1/fulfillment/balancemock للرصيد المتاح 500000 CNY minor units.
POST /v1/fulfillment/shipping/quotesيلزم destination.country_code + الوزن أو الأبعاد؛ لا يزال المسار القديم …/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؛ يبدأ التتبع عند INBOUND_CREATED
sb_pkg_pendingPENDING
sb_pkg_receivedRECEIVED + timeline PHOTO
sb_pkg_exceptionRECEIVED + condition.EXCEPTION
sb_pkg_shippedSHIPPED timeline صادر كامل
sb_pkg_not_found404 PACKAGE_NOT_FOUND

Unclaimed packages

Id / triggerالسلوك
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
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.

fixtures تذاكر الدعم

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_*؛ مفاتيح الإنتاج تتجاهل الحقل بصمت.

sandbox_triggerHTTPerror.code
sb_plat_quota_exceeded429QUOTA_EXCEEDED
sb_plat_rate_limited429RATE_LIMIT_EXCEEDED
sb_plat_upstream_error502CHANNEL_UPSTREAM_ERROR

ادمج مع معرّفات آمنة حتى تمرّ الأجسام الواقعية التحقق:

{
  "channel": "1688",
  "product_id": "123456",
  "language": "en",
  "sandbox_trigger": "sb_plat_quota_exceeded"
}

fixture auth خاص sb_auth_channel_required مع triggers قد يُنتج 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يعكس subset Public API المنشور على هذا الموقع.
Not yetwebhooks sandbox المُرسَلة تلقائيًا؛ امتدادات catalogue OpenAPI-only غير المنشورةفضّل بوابة Send test لـ webhook CI؛ لا تفترض تفعيل كل live events حتى الإعلان.

ورقة غش سريعة للنسخ

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

عند إضافة fixtures داخلياً، عكس نظام الترقيم هذا في اختبارات الانحدار — لا تُغيّر أبداً أشكال JSON standard داخل mocks.

Get Support

Need integration help? Contact Developer Support at support@hiobuy.com · Response within 1–2 business days

Email support