بيئة 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/tickets | List/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, …) | — |
scenario | snake_case | not_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_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 / السعر مقبولة لكنها تُتجاهَل لصفوف mock.
keyword (تطابق تام) | النتيجة |
|---|---|
| نص عادي | قائمة mock بنتائج |
sb_search_empty | items: [], total: 0 |
sb_search_not_found | مرادف للفراغ |
Parse / upload-image / search-by-image / freight / analytics
| Endpoint | ملاحظة sandbox |
|---|---|
| Parse URL | query/path URL يحتوي sb_* يعكس سلوك detail. |
| Upload image | دائماً { "image_id": "img_sandbox_mock" } بعد نجاح التحقق. |
| Image search | keyword: sb_search_empty اختياري يُنتج قائمة فارغة؛ ادمجه مع upload-image لاختبارات التدفق. |
| Advanced — freight estimate | mock الشحن المحلي الافتراضي 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_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 + شحن ~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/balance | mock للرصيد المتاح 500000 CNY minor units. |
POST /v1/fulfillment/shipping/quotes | يلزم destination.country_code + الوزن أو الأبعاد؛ لا يزال المسار القديم …/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؛ يبدأ التتبع عند INBOUND_CREATED |
sb_pkg_pending | PENDING |
sb_pkg_received | RECEIVED + timeline PHOTO |
sb_pkg_exception | RECEIVED + condition.EXCEPTION |
sb_pkg_shipped | SHIPPED timeline صادر كامل |
sb_pkg_not_found | 404 PACKAGE_NOT_FOUND |
Unclaimed packages
| Id / trigger | السلوك |
|---|---|
ucp_01K2ABCDEF1234567890 | قابل للمطالبة؛ تتبع حقيقي 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.
fixtures تذاكر الدعم
| 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_*؛ مفاتيح الإنتاج تتجاهل الحقل بصمت.
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 |
ادمج مع معرّفات آمنة حتى تمرّ الأجسام الواقعية التحقق:
{
"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».
لقطة حالة التنفيذ
| المرحلة | التغطية | ملاحظات |
|---|---|---|
| Shipped | Products وprocurement orders وfulfillment (balance/quotes/shipments/inbounds/packages/unclaimed/returns/locations/VAS/service-requests/finance) وsupport tickets | يعكس subset Public API المنشور على هذا الموقع. |
| Not yet | webhooks 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