راهنمای پیاده‌سازی وب‌هوک

۸ از ۱۱v1.2.0

مستند فنی وب‌هوک دیجی‌اکسپرس

پس از پیاده‌سازی 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) باشد و وب‌هوک‌های ارسالی را دریافت نکرده یا در سیستم خود ذخیره نکرده باشد، برای بازیابی و دریافت داده‌های مفقودشده از این متد استفاده می‌شود.

POSThttps://api-demo.digiexpress.ir/api/v2/shipments/webhook-feed-request

نمونه درخواست (Request Body):

json
{
  "shipment_ids_or_shipment_consignor_reference_ids": [
    "string"
  ]
}

جدول پارامترهای ورودی (Request Parameters)

۱ ردیف
shipment_ids_or_shipment_consignor_reference_ids
نوع دادهarray[string]وضعیتاجباری
محل ارسال
(Body (JSON
شرح کارکرد (Description)
آرایه‌ای از شناسه‌های سفارش (سیستمی دیجی‌اکسپرس یا کد مرجع سمت شما) جهت بازیابی وب‌هوک‌های ناموفق.

ساختار پاسخ سرویس فید وب‌هوک (Webhook Feed Response)

این ریسپانس لیستی از سفارش‌ها را به همراه بسته‌ها و تمامی تاریخچه ایونت‌های وب‌هوکی که پیش از این برای آن‌ها رخ داده یا تلاش شده (Try)، به صورت یکجا و ساختاریافته به شما نمایش می‌دهد.

json
{
  "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)
shipmentsarray[object]آرایه‌ای از سفارش‌های یافت شده بر اساس شناسه‌های ارسالی شما.
order_idstringشناسه سفارش (Order ID).
shipment_idstringشناسه یکتا و سیستمی سفارش در دیجی‌اکسپرس.
shipment_consignor_reference_idstringهمان کد مرجع اختصاصی شما (reference_id) در زمان ثبت سفارش.
parcelsarray[object]لیست بسته‌های فیزیکی متعلق به این سفارش (اطلاع‌رسانی‌های سطح بسته).
other_eventsarray[object]رویدادهای عمومی یا کلان سفارش که مستقیماً به یک بسته خاص وابسته نیستند.

جدول جزئیات اطلاعات سطح بسته (parcels)

۴ ردیف
نام فیلد (Field)نوع داده (Type)شرح بیزینسی و کارکرد (Description)
parcel_idstringشناسه اختصاصی و سیستمی بسته در دیجی‌اکسپرس.
parcel_codestringبارکد یا کد فیزیکی روی لیبل بسته.
parcel_reference_idstringکد مرجع اختصاصی بسته در سیستم شما (در صورت مقداردهی در زمان ثبت).
eventsarray[object]آرایه‌ای از تمامی رویدادها و ایونت‌های لجستیکی که برای این بسته رخ داده است.

جدول ساختار رویدادها (events & other_events)

هر آبجکت در آرایه events یا other_events نشان‌دهنده یک ایونت وب‌هوک ارسال‌شده (یا تلاش‌شده) است و فیلدهای زیر را شامل می‌شود:

۱۰ ردیف
نام فیلد (Field)نوع داده (Type)شرح بیزینسی و کارکرد (Description)
webhook_event_idstringشناسه یکتای خودِ آن ایونت وب‌هوک جهت پیگیری سیستمی.
progress_typestringدقیق‌ترین لایه وضعیتی رویداد (مانند PickedUp ،DidInboundInPoint و...).
sequence_numberintegerشماره توالی ایونت؛ نشان‌دهنده ترتیب دقیق زمانی رخ دادن رویدادها در لاجیک لجستیک.
created_atstringزمان دقیق ثبت و ایجاد این ایونت در سیستم.
succeededBooleanوضعیت نهایی ارسال وب‌هوک به سرور شما (true = سرور شما کد ۲۰۰ داده / false = ارسال ناموفق بوده).
payloadstring (Object)بدنه اصلی و دیتای خام وب‌هوک (JSON stringified) که در آن زمان به سمت سرور شما ارسال شده بود.
triesarray[object]تاریخچه و لاگ تمامی تلاش‌های دیجی‌اکسپرس برای ارسال این وب‌هوک به سرور شما.
called_atstringزمان دقیق تلاشی که برای فراخوانی سرور شما صورت گرفته است.
response_codestringکد وضعیت HTTP که سرور شما در آن تلاش بازگردانده است (مثلاً 500 یا 404).
response_bodystringمتن کامل پاسخ یا خطایی که سرور شما در پاسخ به وب‌هوک برگردانده بود.

ساختار فیلدهای پیلود وب‌هوک (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 }}