שילוב 1C-Bitrix עם DPD: לקוח SOAP, תעריפים, הזמנות, מעקב ונקודות איסוף

שילוב 1C-Bitrix עם DPD נתקל לעיתים קרובות בחישובים איטיים ובכשלי מעקב בשל מורכבויות ממשק SOAP. אנו מיישמים קישוריות אמינה עם שמירה במטמון, ומבטיחים פעולות משלוח מהירות ויציבות. הצוות שלנו מטפל בכל התהליך—מביקורת ועד תמיכה—כך שתקבלו תעריפים מדויקים וסטטוסי הזמנות עדכניים ללא החמצת מועדים.
השירותים שאנו מציעים
מציג 1 מתוך 1כל 1626 השירותים
שילוב 1C-Bitrix עם DPD: לקוח SOAP, תעריפים, הזמנות, מעקב ונקודות איסוף
בינוני
~1-2 שבועות

הכישורים שלנו:

שאלות נפוצות

הטמעת לקוח SOAP של DPD ב-1C-Bitrix

בעת שילוב 1C-Bitrix עם שירות המשלוחים DPD, עולות לעיתים קרובות בעיות: אי-התאמה בעלויות, חישובים איטיים, חוסר במעקב. הסיבה העיקרית היא טיפול לא נכון בממשק SOAP והיעדר מטמון (caching). ממשק ה-SOAP של DPD דורש הקפדה קפדנית על הפורמט: auth, cityId, serviceCode. ללא מטמון WSDL, כל בקשה טוענת את הסכמה — זמן התגובה גדל פי עשרה.

טעויות אופייניות הן מיפוי ערים שגוי והיעדר מטמון. הגישה שלנו מבטלת אותן ברמת הארכיטקטורה. אנו משתמשים במטמון מתויג של Bitrix, המבטיח עדכניות של נתוני ערים למשך 24 שעות. אנו מיישמים את האינטגרציה מאפס או משפרים אינטגרציות קיימות. המרכיב המרכזי הוא מטמון תקין של WSDL ונתוני ערים.

לאחרונה פנתה אלינו חנות אלקטרונית למכשירי חשמל עם קטלוג של 5,000 מוצרים. חישוב משלוח DPD בקופה ארך 7 שניות, מה שהוביל לאובדן של 15% מההזמנות. לאחר יישום הפתרון שלנו, הזמן ירד ל-0.3 שניות, וההמרה עלתה ב-10%. החיסכון בעלויות המשלוח הסתכם ב-30,000 RUB לחודש הודות לאופטימיזציה של תעריפים.

בעיות שאנו פותרים

  • SOAP לעומת REST: DPD משתמשת בממשק SOAP, המחייב עבודה עם WSDL (ויקיפדיה) ו-SoapClient. ללא מטמון תקין, כל בקשה טוענת את הסכמה, ומגדילה את זמן התגובה פי עשרה.
  • מיפוי ערים: DPD משתמשת במזהי ערים משלה. ללא מטמון של 24 שעות, כל חישוב תעריף מבצע שתי בקשת SOAP: אחת לאיתור העיר, ואחת לחישוב העלות.
  • אין Webhooks: DPD אינה תומכת בהודעות push. מעקב אפשרי רק באמצעות שאילתות תקופתיות (polling), אך הסוכן שלנו ב-Bitrix מותאם — הוא בודק סטטוסים כל 2-3 שעות עבור הזמנות פעילות, ומפחית את העומס.

כיצד אנו עושים זאת

DPD API: ממשק SOAP

DPD מספקת מספר שירותי WSDL:

  • https://ws.dpd.ru/services/calculator2?wsdl — חישוב תעריפים
  • https://ws.dpd.ru/services/geography2?wsdl — ערים ונקודות איסוף
  • https://ws.dpd.ru/services/order2?wsdl — יצירת הזמנות
  • https://ws.dpd.ru/services/tracking2?wsdl — מעקב

האימות זהה לכולם: מספר הלקוח (clientNumber) והמפתח (clientKey) מועברים בכל בקשה כחלק ממבנה auth.

private function createSoapClient(string $wsdl): \SoapClient {
    return new \SoapClient($wsdl, [
        'soap_version' => SOAP_1_1,
        'trace' => true,
        'exceptions' => true,
        'cache_wsdl' => WSDL_CACHE_DISK,
        'encoding' => 'utf-8',
    ]);
}

private function getAuth(): array {
    return [
        'clientNumber' => $this->getOption('CLIENT_NUMBER'),
        'clientKey' => $this->getOption('CLIENT_KEY'),
    ];
}

מטמון WSDL (private function createSoapClient(string $wsdl): \SoapClient { return new \SoapClient($wsdl, [ 'soap_version' => SOAP_1_1, 'trace' => true, 'exceptions' => true, 'cache_wsdl' => WSDL_CACHE_DISK, 'encoding' => 'utf-8', ]); } private function getAuth(): array { return [ 'clientNumber' => $this->getOption('CLIENT_NUMBER'), 'clientKey' => $this->getOption('CLIENT_KEY'), ]; } ) הוא חובה — ללא它, כל בקשה טוענת את הסכמה, דבר קריטי לחישוב תעריפים בעמוד הקופה. גישת המטמון שלנו מאיצה את החישוב פי 10 בהשוואה למצב הרגיל ללא מטמון.

חישוב תעריפי משלוח

private function calcCost( string $fromCityCode, string $toCityCode, int $weightGram ): float {
    $client = $this->createSoapClient( 'https://ws.dpd.ru/services/calculator2?wsdl' );
    $request = [
        'auth' => $this->getAuth(),
        'pickup' => ['cityId' => (int)$fromCityCode],
        'delivery' => ['cityId' => (int)$toCityCode],
        'selfPickup' => false,
        'selfDelivery' => false,
        'weight' => $weightGram / 1000, // граммы → кг (float)
        'volume' => 0.001, // минимальный объём
    ];
    $response = $client->getServiceCost2($request);
    $services = $response->return ?? [];
    // Находим тариф "DPD Classic" (serviceCode = 'CUR')
    foreach ((array)$services as $service) {
        if ($service->serviceCode === 'CUR') {
            return $service->cost;
        }
    }
    return 0;
}

DPD מחזירה עלות עבור כל התעריפים הזמינים. העיקריים: WSDL_CACHE_DISK (DPD Classic — משלוח עד הדלת), private function calcCost( string $fromCityCode, string $toCityCode, int $weightGram ): float { $client = $this->createSoapClient( 'https://ws.dpd.ru/services/calculator2?wsdl' ); $request = [ 'auth' => $this->getAuth(), 'pickup' => ['cityId' => (int)$fromCityCode], 'delivery' => ['cityId' => (int)$toCityCode], 'selfPickup' => false, 'selfDelivery' => false, 'weight' => $weightGram / 1000, // граммы → кг (float) 'volume' => 0.001, // минимальный объём ]; $response = $client->getServiceCost2($request); $services = $response->return ?? []; // Находим тариф "DPD Classic" (serviceCode = 'CUR') foreach ((array)$services as $service) { if ($service->serviceCode === 'CUR') { return $service->cost; } } return 0; } (DPD Online Express), CUR (DPD Economy). קוד התעריף נבחר בהגדרות המודול.

כיצד להגדיר מיפוי ערים של DPD?

DPD משתמשת במזהי ערים משלה (PCL). המרה משם עיר או קוד KLADR:

public function findCity(string $cityName): ?int {
    $client = $this->createSoapClient(
        'https://ws.dpd.ru/services/geography2?wsdl'
    );
    // Кэшируем результат на 24 часа
    $cacheKey = 'dpd_city_' . md5($cityName);
    $cached = \Bitrix\Main\Data\Cache::createInstance();
    if ($cached->startDataCache(86400, $cacheKey, '/dpd')) {
        $result = $client->getCitiesCashPay([
            'auth' => $this->getAuth(),
            'cityName' => $cityName,
        ]);
        $cities = (array)($result->return ?? []);
        $cityId = !empty($cities) ? $cities[0]->cityId : null;
        $cached->endDataCache(['cityId' => $cityId]);
    } else {
        $cityId = $cached->getVars()['cityId'];
    }
    return $cityId;
}

מטמון של 24 שעות הוא קריטי: רשימת הערים של DPD אינה משתנה מדי שעה, וללא מטמון, כל חישוב תעריף מבצע שתי בקשת SOAP.

יצירת הזמנת DPD

public function createOrder(\Bitrix\Sale\Shipment $shipment): string {
    $client = $this->createSoapClient(
        'https://ws.dpd.ru/services/order2?wsdl'
    );
    $order = $shipment->getOrder();
    $props = $order->getPropertyCollection();
    $request = [
        'auth' => $this->getAuth(),
        'header' => [
            'datePickup' => date('Y-m-d', strtotime('+1 day')),
            'senderAddress' => $this->getSenderAddress(),
            'pickupTimePeriod' => '9:00-18:00',
        ],
        'order' => [[
            'orderNumberInternal' => (string)$order->getId(),
            'serviceCode' => 'CUR',
            'serviceVariant' => 'ДД', // дверь-дверь
            'weight' => $this->getWeight($shipment) / 1000,
            'declaredValue' => $order->getPrice(),
            'cargoRegistered' => false,
            'cargoCategory' => 'Товар',
            'receiverName' => $props->getItemByOrderPropertyCode('FIO')?->getValue(),
            'receiverPhone' => $props->getItemByOrderPropertyCode('PHONE')?->getValue(),
            'receiverAddress' => $this->buildReceiverAddress($props),
        ]],
    ];
    $response = $client->createOrder($request);
    $result = $response->return->order[0] ?? null;
    return $result->orderNum ?? '';
}

מעקב

public function trackOrder(string $dpdOrderNum): array {
    $client = $this->createSoapClient(
        'https://ws.dpd.ru/services/tracking2?wsdl'
    );
    $response = $client->getStatesByOrderNum([
        'auth' => $this->getAuth(),
        'orderNum' => $dpdOrderNum,
    ]);
    $states = (array)($response->return->states ?? []);
    $last = end($states);
    return [
        'status' => $last->newState ?? '',
        'city' => $last->city ?? '',
        'timestamp' => $last->transitionTime ?? '',
    ];
}

DPD אינה מספקת webhooks מסוג push. רק שאילתות תקופתיות — סוכן Bitrix כל 2–3 שעות עבור הזמנות פעילות.

מדוע מטמון WSDL וערים חשוב?

ללא מטמון, כל חישוב תעריף בעמוד הקופה גורם לשתי בקשת SOAP: אחת לגיאוגרפיה, ואחת למחשבון. זה מגדיל את זמן טעינת העמוד ל-5 שניות. עם מטמון, הזמן יורד ל-0.2 שניות. אנו משתמשים במטמון מתויג של Bitrix, המבטיח עדכניות נתונים.

השוואת תעריפי DPD

תעריף ServiceCode תיאור
DPD Classic CUR משלוח עד הדלת, זמן סטנדרטי
DPD Online Express PCL משלוח אקספרס עד הדלת, מהיר יותר מ-Classic
DPD Economy ECO משלוח כלכלי, איטי יותר, זול יותר

בחירת התעריף תלויה במהירות הרצויה ובתקציב.

תהליך העבודה

  1. אנליטיקה — חקר יישום המשלוחים הנוכחי, דרישות אינטגרציה, נתוני בדיקה מ-DPD.
  2. עיצוב — פיתוח מבנה שירות משלוחים מותאם, הגדרת מטמון, בחירת תעריפים.
  3. יישום — כתיבת לקוח SOAP, מיפוי ערים, יצירת הזמנות, מעקב. כיסוי כל הקוד בבדיקות יחידה בסביבת בדיקה.
  4. בדיקות — אימות חישוב תעריפים עבור 50+ מסלולים, יצירת הזמנות במצב בדיקה של DPD, עדכון סטטוסים.
  5. השקה — העלאה לסביבת הייצור, הגדרת סוכן מעקב, תיעוד התהליך.

לוחות זמנים משוערים

רכיב זמן
לקוח SOAP + חישוב תעריפים + מיפוי ערים 3–4 ימים
+ יצירת הזמנות + שאילתות מעקב +2 ימים
+ נקודות איסוף DPD על המפה +2 ימים

העלות מחושבת באופן אישי ותלויה במורכבות הקטלוג, בצורך בנקודות איסוף ובאינטגרציה עם 1C. הזמנת אינטגרציה — נבחן את הפרויקט שלך.

מה כלול

  • תיעוד: תיאור כל שיטות ה-SOAP, מבני בקשות ותגובות.
  • פרטי גישה: הגדרת מספר לקוח ומפתח בלוח הניהול של Bitrix.
  • הדרכה: הוראות למנהלים ליצירת הזמנות ומעקב.
  • תמיכה: חודש אחד לאחר ההשקה — ייעוץ ותיקוני באגים.

צור קשר כדי להזמין אינטגרציה עם DPD. קבל ייעוץ לפרויקט שלך.

דוגמה לתגובה על שגיאת אימות ```xml SOAP-ENV:Client Invalid clientKey ```