مستند فنی وبهوک دیجیاکسپرس
پس از پیادهسازی APIهای موردنیاز، مرحله بعدی در فرآیند Integration، پیادهسازی Webhook است.
دیجیاکسپرس تمامی رویدادهای مهم از جمله نتیجه مسیریابی (موفق یا ناموفق) و همچنین تغییرات وضعیت سفارشها و بستهها در طول فرآیند عملیاتی را از طریق Webhook اطلاعرسانی میکند.
مکانیزم اطلاع رسانی های دیجیاکسپرس
دیجیاکسپرس برای اطلاعرسانی در خصوص «مسیریابی موفق یا ناموفق» و «هرگونه تغییر وضعیت در چرخه لجستیکی سفارشها و بستهها»، درخواستهای خود را در قالب متدهای POST یا PUT به آدرس (URL) معرفیشده از سمت شما ارسال میکند.
توالی و زمانبندی ارسال رویدادها (Event Sequencing)
رعایت توالی: ترتیب رویدادهای لجستیکی رخداده برای هر مرسوله همواره رعایت شده و ایونتها به صورت ترتیبی ارسال میشوند.
احتمال تاخیر: به هر دلیلی ممکن است سرویس ارسال آپدیتها در بستر وبهوک با اختلال موقت مواجه شود و این اطلاعرسانیها با تاخیر به سمت شما ارسال گردند.
پاسخ مورد انتظار سرور فرستنده (Consignor Response)
- پاسخ موفق: در صورت دریافت و پردازش موفقیتآمیز پیلود وبهوک، سرور شما باید کد وضعیت 200 OK برگرداند.
- پاسخ ناموفق: در غیر این صورت (بروز هرگونه خطا)، باید کد خطای متناسب (Error Code) به همراه متن ریسپانس به دیجیاکسپرس بازگردانده شود.
- عدم وجود مکانیزم تکرار (No Retry Policy): در حال حاضر هیچگونه مکانیزم (Retry) در سیستم وجود ندارد؛ یعنی در صورتی که آپدیتهای ارسالی به هر دلیلی توسط سرور فرستنده دریافت نشوند، مجدداً ارسال نخواهند شد.
الزامات و قواعد توسعه در سمت فرستنده (Consignor Development Requirements)
- انعطافپذیری در برابر مقادیر جدید: سیستم پذیرنده شما باید کاملاً منعطف طراحی شود. در صورت مواجهه با فیلدها، پارامترها یا Progress Typeهای ناشناخته و جدید در آینده، سیستم نباید دچار اختلال یا کرش (Crash) شود و صرفاً باید آنها را نادیده (Ignore) بگیرد.
- توسعهپذیری پیلودها: این احتمال وجود دارد که در آینده فیلدهای جدیدی به پیلودهای فعلی اضافه شوند یا پیلودهای عملیاتی کاملاً جدیدی توسعه یافته و از طریق وبهوک ارسال گردند؛ ساختار سیستم شما باید پذیرای این تغییرات باشد.
- نکته بسیار مهم (عدم وابستگی به لاجیکهای ترتیبی): به هیچ عنوان نباید فرآیندهای وبهوک را به لاجیکها و اعتبارسنجیهای ترتیبی در دیتابیس یا سیستم خود مشروط کنید. به عنوان مثال، نباید این منطق را قرار دهید که «حتماً اول باید ایونت در حال ارسال (Delivering) دریافت شود تا سیستم اجازه ثبت ایونت تحویل شد (Delivered) را بدهد». به دلایل مختلف عملیاتی در زنجیره تأمین، ممکن است برخی از وضعیتهای میانی به صورت سیستمی نادیده گرفته شده (Skip) و مستقیم وبهوک نهایی (مانند Delivered) ارسال شود؛ در این حالت سیستم شما نباید خطایی صادر کند.
سرویس فید وبهوک (Webhook Feed API)
اگر سرور کانساینر به هر دلیلی قطع (Down) باشد و وبهوکهای ارسالی را دریافت نکرده یا در سیستم خود ذخیره نکرده باشد، برای بازیابی و دریافت دادههای مفقودشده از این متد استفاده میشود.
https://api-demo.digiexpress.ir/api/v2/shipments/webhook-feed-requestنمونه درخواست (Request Body):
{
"shipment_ids_or_shipment_consignor_reference_ids": [
"string"
]
}جدول پارامترهای ورودی (Request Parameters)
- محل ارسال
- (Body (JSON
- شرح کارکرد (Description)
- آرایهای از شناسههای سفارش (سیستمی دیجیاکسپرس یا کد مرجع سمت شما) جهت بازیابی وبهوکهای ناموفق.
ساختار پاسخ سرویس فید وبهوک (Webhook Feed Response)
این ریسپانس لیستی از سفارشها را به همراه بستهها و تمامی تاریخچه ایونتهای وبهوکی که پیش از این برای آنها رخ داده یا تلاش شده (Try)، به صورت یکجا و ساختاریافته به شما نمایش میدهد.
{
"shipments": [
{
"order_id": "string",
"shipment_id": "string",
"shipment_consignor_reference_id": "string",
"parcels": [
{
"parcel_id": "string",
"parcel_code": "string",
"parcel_reference_id": "string",
"events": [
{
"payload": [
"string"
],
"tries": [
{
"response_code": "string",
"response_body": "string",
"called_at": "string"
}
],
"succeeded": true,
"webhook_event_id": "string",
"created_at": "string",
"progress_type": "string",
"sequence_number": 0
}
]
}
],
"other_events": [
{
"payload": [
"string"
],
"tries": [
{
"response_code": "string",
"response_body": "string",
"called_at": "string"
}
],
"succeeded": true,
"webhook_event_id": "string",
"created_at": "string",
"progress_type": "string",
"sequence_number": 0
}
]
}
]
}جدول اجزای اصلی دیتای پاسخ (Response Object Layers)
| نام فیلد (Field) | نوع داده (Type) | شرح بیزینسی و کارکرد (Description) |
|---|---|---|
| shipments | array[object] | آرایهای از سفارشهای یافت شده بر اساس شناسههای ارسالی شما. |
| order_id | string | شناسه سفارش (Order ID). |
| shipment_id | string | شناسه یکتا و سیستمی سفارش در دیجیاکسپرس. |
| shipment_consignor_reference_id | string | همان کد مرجع اختصاصی شما (reference_id) در زمان ثبت سفارش. |
| parcels | array[object] | لیست بستههای فیزیکی متعلق به این سفارش (اطلاعرسانیهای سطح بسته). |
| other_events | array[object] | رویدادهای عمومی یا کلان سفارش که مستقیماً به یک بسته خاص وابسته نیستند. |
جدول جزئیات اطلاعات سطح بسته (parcels)
| نام فیلد (Field) | نوع داده (Type) | شرح بیزینسی و کارکرد (Description) |
|---|---|---|
| parcel_id | string | شناسه اختصاصی و سیستمی بسته در دیجیاکسپرس. |
| parcel_code | string | بارکد یا کد فیزیکی روی لیبل بسته. |
| parcel_reference_id | string | کد مرجع اختصاصی بسته در سیستم شما (در صورت مقداردهی در زمان ثبت). |
| events | array[object] | آرایهای از تمامی رویدادها و ایونتهای لجستیکی که برای این بسته رخ داده است. |
جدول ساختار رویدادها (events & other_events)
هر آبجکت در آرایه events یا other_events نشاندهنده یک ایونت وبهوک ارسالشده (یا تلاششده) است و فیلدهای زیر را شامل میشود:
| نام فیلد (Field) | نوع داده (Type) | شرح بیزینسی و کارکرد (Description) |
|---|---|---|
| webhook_event_id | string | شناسه یکتای خودِ آن ایونت وبهوک جهت پیگیری سیستمی. |
| progress_type | string | دقیقترین لایه وضعیتی رویداد (مانند PickedUp ،DidInboundInPoint و...). |
| sequence_number | integer | شماره توالی ایونت؛ نشاندهنده ترتیب دقیق زمانی رخ دادن رویدادها در لاجیک لجستیک. |
| created_at | string | زمان دقیق ثبت و ایجاد این ایونت در سیستم. |
| succeeded | Boolean | وضعیت نهایی ارسال وبهوک به سرور شما (true = سرور شما کد ۲۰۰ داده / false = ارسال ناموفق بوده). |
| payload | string (Object) | بدنه اصلی و دیتای خام وبهوک (JSON stringified) که در آن زمان به سمت سرور شما ارسال شده بود. |
| tries | array[object] | تاریخچه و لاگ تمامی تلاشهای دیجیاکسپرس برای ارسال این وبهوک به سرور شما. |
| called_at | string | زمان دقیق تلاشی که برای فراخوانی سرور شما صورت گرفته است. |
| response_code | string | کد وضعیت HTTP که سرور شما در آن تلاش بازگردانده است (مثلاً 500 یا 404). |
| response_body | string | متن کامل پاسخ یا خطایی که سرور شما در پاسخ به وبهوک برگردانده بود. |
ساختار فیلدهای پیلود وبهوک (Payload Structure)
تمامی اطلاعرسانیهای عملیاتی به صورت مجزا به ازای هر بسته (Per Parcel) ارسال میشود.
شناسهها و فیلدهای زمانی اصلی
- occurred_at: زمان دقیق وقوع رویداد یا تغییر وضعیت لجستیکی.
- shipment_id: شناسه یکتا و سیستمی سفارش در دیجیاکسپرس.
- reference_id: کد مرجع ارسالی توسط شما در زمان ثبت سفارش (consignor_unique_reference_id).
- parcel_id: شناسه اختصاصی هر بسته در دیجیاکسپرس.
occurred_at زمان وقوع رویداد عملیاتی است. created_at در Webhook Feed زمان ثبت یا ایجاد Webhook Event در سیستم دیجیاکسپرس را نشان میدهد.
فیلدهای وضعیتی و لاگین عملیاتی
- shipment_status: وضعیت کلی و کلان سفارش (مانند Delivering ،Delivered ،Canceled).
- parcel_status: وضعیت اختصاصی بسته فیزیکی.
- progress_type: دقیقترین لایه وضعیتی رویداد (مانند Pickup ،Inbound و...).
اطلاعات موقعیتی و ارتباطی
- point_name: نام هاب یا انبار جاری پذیرشکننده بسته (Inbound / Outbound).
- is_final_point: مقدار بولین (True/False)؛ مشخص میکند انبار جاری آخرین ایستگاه پیش از توزیع به مشتری است یا خیر.
- pod_code: کد تحویل مرسوله (تولیدشده توسط کلاینت در مرحله ثبت، یا تولید خودکار سیستم در مرحله پیدا شدن مسیر).
- sms_content: متن کامل پیامک ارسالشده به مشتری در صورت بروز وضعیت SMSWasSent.
مقادیر، ابعاد و فرآیند رزرو ظرفیت
- weight / volume: وزن و حجم بسته.
- estimated / remaining: میزان کل ظرفیت رزرو شده بر اساس فیلدهای تخمین ظرفیت و میزان باقیمانده آن پس از معرفی بستههای نهایی.
- cod_amount: مبلغ نقدی قابل دریافت در محل از مشتری (Cash on Delivery).
فیلدهای مدیریت عدم موفقیت (Failure Reasons)
- pickup_failure_reason: علت عدم موفقیت در جمعآوری بسته از مبدا.
- last_mile_failure_reason: علت عدم موفقیت در تحویل بسته به مشتری نهایی.
- return_failure_reason: علت عدم موفقیت در بازگرداندن بسته به انبار فرستنده.
نگاشت دقیق مقادیر وضعیتها (Shipment Status & Progress Type Map)
لایه ثبت سفارش (Register) و مدیریت ظرفیت
- AwaitingForCandidateRoutesInquiryResult | RequestedRouteForEstimatedCapacity سفارش بدون پارسل ثبت شده و در حال بررسی اولیه ظرفیت است.
- AwaitingForRouteSelectionAmongFoundOnes | FoundCandidateRouteToSelectForEstimatedCapacity مسیرهای پیشنهادی یافت شده و سیستم در انتظار انتخاب مسیر است.
- AwaitingForSelectedRouteToBeStarted | ParcelSelectedInitialRoute بعد از تایید نهایی مسیر پیدا شده (ثبت سفارش موفق).
- SittingIdleDueToRegistrationFailure | RouteRequestFailedForEstimatedCapacity / ParcelRouteRequestFailed عدم امکان ثبت سفارش به دلیل مشکلات سیستم یا تایماوت.
- SittingIdleCauseNoRoutesWereFound | NoRouteWereFoundForEstimatedCapacity / ParcelNoRouteWereFound رد سفارش به دلیل عدم یافتن مسیر یا پر بودن ظرفیت.
لایه اضافه و حذف بسته (Add & Remove Parcel)
- AwaitingForSelectedRouteToBeStarted | ParcelWasAddedToShipment پارسل با موفقیت به سفارش اضافه شد و در انتظار شروع بازه ارسال است.
- AwaitingForSelectedRouteToBeStarted | ParcelWasRemovedFromShipment پارسل از سفارش حذف شد (در صورتی که سفارش همچنان بستههای دیگری داشته باشد).
- AwaitingForAddingParcel | ParcelWasRemovedFromShipment پارسل حذف شد و سفارش مجدداً در وضعیت انتظار برای افزودن بسته قرار گرفت.
- SittingIdleCauseNoParcelWasAddedToShipment | NoParcelWasAddedToShipment زمان پیکاپ شروع شده اما هیچ پارسلی به سفارش اضافه نشده؛ فرآیند متوقف گردید.
لایه فرآیند ارسال و توزیع (Delivering & Delivered)
- InTheRoadBeingDelivering | InPersonReceiveFailed: عدم دریافت بسته در مرکز سورت (رسپشن فیل).
- InTheRoadBeingDelivering | PickedUp: جمعآوری موفقیتآمیز مرسوله از فرستنده.
- InTheRoadBeingDelivering | InPersonReceived: تحویل سفارش در انبار/کانتر توسط خود فرستنده.
- InTheRoadBeingDelivering | PickupEnd: اتمام راید جمعآوری (پیکاپ).
- InTheRoadBeingDelivering | DidInboundInPoint: پذیرش فیزیکی بسته در هاب یا شعبه.
- InTheRoadBeingDelivering | DidOutboundFromPoint: خروج فیزیکی بسته از هاب یا شعبه.
- InTheRoadBeingDelivering | MidMileRideStart: شروع سفر میانی بینشهری یا بینانباری.
- InTheRoadBeingDelivering | MidMileRideEnd: پایان سفر میانی و رسیدن ناوگان به مقصد واسط.
- InTheRoadBeingDelivering | InPersonHandedOver: خروج مرسوله از شعبه جهت تحویل حضوری به مشتری (In-Person).
- InTheRoadBeingDelivering | LastMileRideStart: شروع حرکت سفیر تحویل به سمت مشتری (لستمایل).
- InTheRoadBeingDelivering | LastMileRideEnd: پایان راید توزیع نهایی.
- InTheRoadBeingDelivering | FinalRide: شروع آخرین مرحله حرکت ناوگان تحویل.
- InTheRoadBeingDelivering | ParcelWasDeliveredToRecipient: تحویل موفقیتآمیز یک بسته از سفارش به مشتری.
- WasDeliveredToRecipient | ParcelWasDeliveredToRecipient: تحویل موفقیتآمیز تمامی بستههای سفارش و اتمام فرآیند.
لایه عدم موفقیت، لغو، هماهنگی و عودت (Failures, Cancel & Returns)
- PickupFailed | ParcelPickupFailed: عدم موفقیت در جمعآوری مرسوله از فرستنده (قبل از پیکاپ).
- ConsignorCanceledBeforeInPersonReceiveOrPickup | ParcelCancelledByConsignorBeforeDeliveringStarted: لغو سفارش به درخواست کلاینت قبل از پیکاپ یا رسید در هاب.
- ConsignorCanceledAfterInPersonReceiveOrPickup | ParcelCancelledByConsignorWhileDelivering: لغو سفارش پس از پیکاپ یا دریافت مرسوله (بسته وارد چرخه عودت میشود).
- InTheRoadBeingDelivering | ParcelFailedToBeDelivered: عدم تحویل موفق بسته به مشتری (ورود به فرآیند کالسنتر).
- InTheRoadBeingDelivering | ParcelWasCoordinatedToCustomer: ثبت زمان یا آدرس جدید تحویل پس از تماس پشتیبانی با مشتری.
- InTheRoadBeingDelivering | ParcelWasCoordinatedToConsignorLatLngAddress: هماهنگی عودت بار به آدرس/لوکیشن فرستنده.
- InTheRoadBeingDelivering | ParcelWasCoordinatedToConsignorInPersonShippingPoint: هماهنگی جهت تحویل حضوری عودت توسط فرستنده در پوینت.
- InTheRoadBeingDelivering | ParcelWasReturnedToConsignor: بازگشت موفقیتآمیز یک بسته مرجوعی به فرستنده.
- Returned | ParcelWasReturnedToConsignor: بازگشت تمامی بستهها به فرستنده و اتمام چرخه عودت سفارش.
- InTheRoadBeingDelivering | CustomerDidNotAnswerToNegotiateCoordination: عدم پاسخگویی مشتری به تماس کالسنتر برای تعیین زمان جدید.
- InTheRoadBeingDelivering | SMSWasSent: اطلاعرسانی ارسال موفقیتآمیز پیامک به مشتری.
- InTheRoadBeingDelivering | LastMilestoneProviderBarcode: بارکد پستی مرسوله.
جداول دلایل عدم موفقیت (Failure Reasons Enums)
دلایل عدم موفقیت در جمعآوری (pickup_failure_reason)
| علت فارسی رویداد | مقدار انگلیسی ثابت (Enum) |
|---|---|
| انصراف سلر از ارسال مرسوله | RecipientRejectedParcel |
| لیبل نداشتن مرسوله | PackageDoesNotHaveLabel |
| آماده نبودن بستهبندی مرسوله | RecipientPackageWasNotReady |
| عدم حضور مشتری (فرستنده) در محل | RecipientDidNotRespondToDoorKnock |
دلایل عدم موفقیت در تحویل به مشتری (last_mile_failure_reason)
| علت فارسی رویداد | مقدار انگلیسی ثابت (Enum) |
|---|---|
| آدرس نادرست | ParcelWasReturnedCauseAddressWasWrong |
| انصراف مشتری از دریافت مرسوله | RecipientRejectedParcel |
| سفارش خارج از محدوده سرویسدهی | ParcelAddressWasOutsideSupportedZone |
| سفیر سفارش را از انبار تحویل نگرفته است | DriverDidNotReceivedParcelFromWarehouse |
| عدم ارائه کد تحویل (POD) توسط مشتری | RecipientRefusedToProvideProofOfDelivery |
| عدم امکان تحویل (تصادف، خرابی ناوگان و...) | WasUnableToProceed |
| عدم حضور مشتری در محل | RecipientDidNotRespondToDoorKnock |
عودت ناموفق به فرستنده (return_failure_reason)
در صورتی که بسته فیزیکی به انبار شما برسد اما به دلایلی (مانند بسته بودن انبار) نتوانید آن را دریافت کنید، وبهوک با این فیلد ارسال شده و چرخه هماهنگی عودت (Coordinated to Consigner) مجدداً تکرار میگردد.
لینک مستندات جانبی وبهوک دیجیاکسپرس
برای دسترسی به دیتای دقیقتر، نمونه پیلودها و کدهای وضعیت وبهوک که ممکن است در این داک به آنها اشاره نشده باشد، لطفاً از طریق لینک مستندات جانبی وبهوک دیجیاکسپرس آخرین نسخه جداول فنی را بررسی نمایید.
پیوست اول: جدول رویدادهای وبهوک و پیامکهای اطلاعرسانی متناظر
کنساینرهای محترم میتوانند با استفاده از جدول زیر، ارتباط بین رویدادهای ارسالی در پیلود وبهوک (Progress Types) و پیامکهای سیستم دیجیاکسپرس را جهت مپینگ و فرآیندهای کاستومر سرویس خود بررسی نمایند.
| زمان ارسال / شرط رویداد | پراگرس تایپ متناظر در وبهوک (Progress Type) | متن پیامک اطلاعرسانی |
|---|---|---|
| زمانی که عملیات میخواهد پارسل را به سلر عودت دهد | ParcelWasCoordinatedToConsignorLatLngAddress | {{ recipientFirstName }} عزیز بسته با بارکد {{ parcelCode }} در حال عودت به شما در روز {{ promisedDatePersianSpokenFormat }} بازه زمانی {{ timeScopeSpokenFormat }} میباشد. کد تحویل {{ parcelPod }} در زمان دریافت به مامور تحویل دیجیاکسپرس ارائه کنید. با تشکر از همراهی شما |
| هنگام کووردینیت پارسل برای ارسال مجدد به مشتری | ParcelWasCoordinatedToCustomer | {{ customerFirstName }} عزیز متأسفانه امکان تحویل مرسوله شما از طرف {{ consignorName }} در بازه زمانی انتخابی فراهم نشد. ضمن عذرخواهی به اطلاع میرسانیم که مرسوله در تاریخ {{ promisedDatePersianSpokenFormat }} و بازه زمانی{{ timeScopeSpokenFormat}} بدست شما خواهد رسید. لطفاً هنگام دریافت مرسوله، کد تحویل {{ parcelPod }} را به سفیر ارائه دهید. شماره مرسوله {{ ShipmentCode }} لینک پیگیری مرسوله: {{ TrackingURL }} با تشکر از همراهی شما |
| هنگام پیکاپ موفق و هنگام شروع اخرین راید به سمت مشتری | PickedUp FinalRide | {{ recipientFullName }} عزیز، لطفاً هنگام دریافت مرسوله را از طرف {{ consignorName }}، کد تحویل {{ parcelPod }} را به سفیر ارائه دهید. شماره مرسوله: {{ ShipmentCode }} لینک پیگیری مرسوله: {{ TrackingURL }} |
| هنگام تحویل مرسوله به دفتر پستی جهت ادامه مسیر در پست | — | {{ recipientFullName }} عزیز، مرسوله شما برای ارسال، به اداره پست تحویل داده شد. میتوانید مرسوله خود رو از طریق آدرس زیر رهگیری کنید. شماره مرسوله: {{ ShipmentCode }} لینک پیگیری مرسوله: {{ TrackingURL }} |
| هنگام تحویل ناموفق به مشتری | ParcelFailedToBeDelivered | {{ customerFirstName }} عزیز، متأسفانه امکان تحویل مرسوله شما از طرف {{ consignorName }} در این بازه فراهم نشد. در حال هماهنگی برای ارسال مجدد مرسوله هستیم و زمان جدید تحویل بهزودی به اطلاع شما خواهد رسید. شماره مرسوله: {{ ShipmentCode }} لینک پیگیری مرسوله: {{ TrackingURL }} از صبوری و همراهی شما سپاسگزاریم |
| هنگام تاخیر در تحویل به مشتری | — | {{ customerFirstName }} عزیز، از تأخیر ایجادشده در روند ارسال مرسوله شما آگاه هستیم و بابت این موضوع پوزش میخواهیم. مرسوله شما در حال بررسی و پیگیری است و در صورت هرگونه بهروزرسانی، وضعیت ارسال به اطلاع شما خواهد رسید. شماره مرسوله: {{ShipmentCode}} لینک پیگیری مرسوله: {{ TrackingURL }} از صبوری شما سپاسگزاریم |
| بعد از دلیورد شدن مرسوله به مشتری | ParcelWasDeliveredToRecipient | دیجیاکسپرس مشتری گرامی ، برای بهبود کیفیت خدمات ارسال ، لطفا با استفاده از لینک زیر نظر خود را با ما در میان بگذارید. با سپاس {{ FlexSurveyLink }} |