הטמעת לקוח 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 | משלוח כלכלי, איטי יותר, זול יותר |
בחירת התעריף תלויה במהירות הרצויה ובתקציב.
תהליך העבודה
- אנליטיקה — חקר יישום המשלוחים הנוכחי, דרישות אינטגרציה, נתוני בדיקה מ-DPD.
- עיצוב — פיתוח מבנה שירות משלוחים מותאם, הגדרת מטמון, בחירת תעריפים.
- יישום — כתיבת לקוח SOAP, מיפוי ערים, יצירת הזמנות, מעקב. כיסוי כל הקוד בבדיקות יחידה בסביבת בדיקה.
- בדיקות — אימות חישוב תעריפים עבור 50+ מסלולים, יצירת הזמנות במצב בדיקה של DPD, עדכון סטטוסים.
- השקה — העלאה לסביבת הייצור, הגדרת סוכן מעקב, תיעוד התהליך.
לוחות זמנים משוערים
| רכיב | זמן |
|---|---|
| לקוח SOAP + חישוב תעריפים + מיפוי ערים | 3–4 ימים |
| + יצירת הזמנות + שאילתות מעקב | +2 ימים |
| + נקודות איסוף DPD על המפה | +2 ימים |
העלות מחושבת באופן אישי ותלויה במורכבות הקטלוג, בצורך בנקודות איסוף ובאינטגרציה עם 1C. הזמנת אינטגרציה — נבחן את הפרויקט שלך.
מה כלול
- תיעוד: תיאור כל שיטות ה-SOAP, מבני בקשות ותגובות.
- פרטי גישה: הגדרת מספר לקוח ומפתח בלוח הניהול של Bitrix.
- הדרכה: הוראות למנהלים ליצירת הזמנות ומעקב.
- תמיכה: חודש אחד לאחר ההשקה — ייעוץ ותיקוני באגים.
צור קשר כדי להזמין אינטגרציה עם DPD. קבל ייעוץ לפרויקט שלך.

