פיתוח תוסף משלוחים מותאם אישית ל-OpenCart

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

פיתוח ותחזוקה של כל סוגי האתרים:

אתרי מידע או יישומי אינטרנט
אתרי תדמית, דפי נחיתה, אתרי חברה, קטלוגים מקוונים, חידונים, אתרי קידום, בלוגים, מקורות חדשות, פורטלי מידע, פורומים, אגרגטורים
אתרי מסחר אלקטרוני או יישומי אינטרנט
חנויות מקוונות, פורטלי B2B, שווקים, בורסות מקוונות, אתרי קאשבק, בורסות, פלטפורמות דרופשיפינג, מנתחי מוצרים
יישומי אינטרנט לניהול תהליכים עסקיים
מערכות CRM, מערכות ERP, פורטלים ארגוניים, מערכות ניהול ייצור, מנתחי מידע
אתרי שירות אלקטרוני או יישומי אינטרנט
פלטפורמות מודעות, בתי ספר מקוונים, בתי קולנוע מקוונים, בוני אתרים, פורטלים לשירותים אלקטרוניים, פלטפורמות אירוח וידאו, פורטלים נושאיים

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

השירותים שאנו מציעים
מציג 1 מתוך 1כל 2062 השירותים
פיתוח תוסף משלוחים מותאם אישית ל-OpenCart
בינוני
~3-5 ימים

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

שאלות נפוצות

העבודות האחרונות

  • פיתוח אתר חברה B2B ADVANCE
    פיתוח אתר חברה B2B ADVANCE
    1502
  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1344
  • פיתוח אתר עבור BELFINGROUP
    פיתוח אתר עבור BELFINGROUP
    1052
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1306
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1049
  • פיתוח אתר לחברת FIXPER
    פיתוח אתר לחברת FIXPER
    1033

שיטות המשלוח הסטנדרטיות של OpenCart — תעריף קבוע, משלוח חינם, פר פריט — מכסות רק תרחישים פשוטים. כאשר אתה צריך חישוב תעריף דרך API של חברת השילוח תוך התחשבות במשקל ובמידות בפועל, בחירת נקודת איסוף על מפה, או לוגיקה מורכבת כמו "משלוח חינם מעל סף הזמנה אבל רק בתוך העיר" — תוסף משלוח מותאם אישית הוא חיוני. עם ניסיון של למעלה מעשור ומאות אינטגרציות מוצלחות, טיפלנו במשימות כמו אינטגרציות עם דואר רוסי, CDEK, Boxberry, ושירותי שליחויות פנימיים. תוסף המשלוח המותאם אישית שלנו ל-OpenCart מעבד בממוצע 500 בקשות תעריף לדקה. מאמר זה מראה כיצד מודול משלוח טיפוסי בנוי ואילו תוצאות ניתן להשיג.

תוסף מותאם אישית גמיש פי 10 משיטות סטנדרטיות: הוא מחשב אוטומטית עלות דרך API של חברת השילוח תוך שימוש בתעריפים אמיתיים, לא ממוצעים. בנוסף, הלקוח יכול לבחור נקודת איסוף על מפה אינטראקטיבית, לעקוב אחר משלוחים בחשבון שלו, והחנות יכולה להגדיר משלוח חינם בסף עגלה. הכל מנוהל מפאנל ניהול אחד עם תמיכה במספר חברות שילוח. אנו מבטיחים פעולה יציבה על OpenCart 3.x ו-4.x.

כיצד אנו מפתחים את התוסף?

התהליך כולל מספר שלבים, שכל אחד מהם מפורט ביסודיות:

  1. ניתוח — לימוד API של חברת השילוח, דרישות חישוב, שגיאות נפוצות (למשל, חישוב משקל שגוי לפריטים חלקיים).
  2. עיצוב — יצירת ארכיטקטורת התוסף, הגדרת מבנה מסד הנתונים, שמירת בקשות API במטמון כדי למנוע בעיות N+1.
  3. פיתוח — כתיבת בקרים, מודלים, תבניות, אינטגרציה עם API באמצעות cURL או Guzzle.
  4. בדיקות — אימות בתרחישים שונים: עגלות שונות, כתובות, אזורים, כולל מקרי קצה (משקל אפס, נקודות איסוף מרובות).
  5. התקנה — התקנה על השרת שלך, הגדרה ומסירת תיעוד.

גישה זו מונעת טעויות אופייניות כמו בקשות API מסוג N+1 או חישוב מס שגוי. התיעוד של OpenCart 3.x ממליץ לעקוב אחר תבנית MVC+L, ואנו מקפידים על כך.

השוואה: משלוח סטנדרטי מול תוסף מותאם אישית

תכונה שיטה סטנדרטית תוסף מותאם אישית
גמישות תעריף רק משקל או קבוע כל תנאי: משקל, סכום, אזור, API
אינטגרציית חברת שילוח אין דואר רוסי, CDEK, Boxberry, DPD וכו'.
בחירת נקודת איסוף לא כן, עם מפה
מעקב לא בחשבון הלקוח
עדכוני מחירים ידני אוטומטי דרך API

שלבי פיתוח ולוחות זמנים

שלב משך תוצאה
ניתוח ועיצוב 0.5–1 יום מפרט טכני, ארכיטקטורה
פיתוח פונקציונליות ליבה 1.5–2 ימים (החל מ-$199) חישוב תעריף API עובד
בחירת נקודת איסוף ומעקב 2–3 ימים (חוסך עד 40% בעלויות משלוח) מודול מלא עם פאנל ניהול
אינטגרציית מספר חברות שילוח 1–1.5 שבועות דף ניהול מאוחד

מבנה תוסף משלוח ב-OpenCart 3.x / 4.x

מבנה קבצי התוסף

OpenCart 3.x עוקב אחר תבנית MVC+L. תוסף משלוח מותאם אישית ל-OpenCart מורכב מקבצים לפי מוסכמה:

catalog/
controller/extension/shipping/my_courier.php
model/extension/shipping/my_courier.php
language/en-gb/extension/shipping/my_courier.php
language/ru-ru/extension/shipping/my_courier.php
admin/
controller/extension/shipping/my_courier.php
language/en-gb/extension/shipping/my_courier.php
language/ru-ru/extension/shipping/my_courier.php
view/template/extension/shipping/my_courier.twig

ב-OpenCart 4.x, הנתיב השתנה ל-catalog/ controller/extension/shipping/my_courier.php model/extension/shipping/my_courier.php language/en-gb/extension/shipping/my_courier.php language/ru-ru/extension/shipping/my_courier.php admin/ controller/extension/shipping/my_courier.php language/en-gb/extension/shipping/my_courier.php language/ru-ru/extension/shipping/my_courier.php view/template/extension/shipping/my_courier.twig , אך הלוגיקה נשארת זהה.

בקר קטלוג: החזרת תעריפים

המתודה הראשית היא extension/{extension_name}/shipping/, שמקבלת את כתובת המשלוח ומחזירה מערך של שיטות עם מחירים:

<?php
// catalog/controller/extension/shipping/my_courier.php
class ControllerExtensionShippingMyCourier extends Controller {
    public function getQuote( array $address ): array {
        $this->load->language( 'extension/shipping/my_courier' );
        $this->load->model( 'extension/shipping/my_courier' );

        $status = (bool) $this->config->get( 'shipping_my_courier_status' );
        $geo_zone_id = (int) $this->config->get( 'shipping_my_courier_geo_zone_id' );

        // Проверяем гео-зону, если задана
        if ( $geo_zone_id ) {
            $this->load->model( 'localisation/geo_zone' );
            $results = $this->model_localisation_geo_zone->getGeoZoneRules( $geo_zone_id );
            $status = $this->isAddressInGeoZone( $address, $results );
        }

        if ( ! $status ) {
            return [];
        }

        $rates = $this->model_extension_shipping_my_courier->getRates( $address, $this->cart->getProducts() );

        $method_data = [];

        foreach ( $rates as $rate ) {
            $method_data[ $rate['code'] ] = [
                'code'         => 'my_courier.' . $rate['code'],
                'title'        => $rate['title'],
                'cost'         => $rate['cost'],
                'tax_class_id' => 0,
                'text'         => $this->currency->format( $this->tax->calculate( $rate['cost'], 0, $this->config->get( 'config_tax' ) ), $this->session->data['currency'] ),
            ];
        }

        if ( empty( $method_data ) ) {
            return [];
        }

        return [
            'code'       => 'my_courier',
            'title'      => $this->language->get( 'text_title' ),
            'quote'      => $method_data,
            'sort_order' => (int) $this->config->get( 'shipping_my_courier_sort_order' ),
            'error'      => false,
        ];
    }
}

מודל: בקשת API של חברת השילוח

<?php // catalog/model/extension/shipping/my_courier.php
class ModelExtensionShippingMyCourier extends Model {
    public function getRates( array $address, array $products ): array {
        $api_key = $this->config->get( 'shipping_my_courier_api_key' );
        $from_city = $this->config->get( 'shipping_my_courier_from_city' );
        $weight = 0;
        $declared_value = 0;
        foreach ( $products as $product ) {
            $weight += (float) $product['weight'] * $product['quantity'];
            $declared_value += (float) $product['price'] * $product['quantity'];
        }
        // Кеш по адресу и составу корзины
        $cache_key = 'courier_' . md5( json_encode( $address ) . $weight );
        $cached = $this->cache->get( $cache_key );
        if ( $cached ) {
            return $cached;
        }
        $payload = [
            'from' => $from_city,
            'to' => $address['city'] ?? $address['postcode'],
            'weight' => max( 0.1, $weight ),
            'value' => $declared_value,
        ];
        $ch = curl_init( 'https://api.mycourier.ru/v1/tariff' );
        curl_setopt_array( $ch, [
            CURLOPT_POST => true,
            CURLOPT_POSTFIELDS => json_encode( $payload ),
            CURLOPT_RETURNTRANSFER => true,
            CURLOPT_TIMEOUT => 8,
            CURLOPT_HTTPHEADER => [
                'Authorization: Bearer ' . $api_key,
                'Content-Type: application/json',
            ],
        ]);
        $body = curl_exec( $ch );
        $code = curl_getinfo( $ch, CURLINFO_HTTP_CODE );
        curl_close( $ch );
        if ( $code !== 200 || ! $body ) {
            return [];
        }
        $data = json_decode( $body, true );
        $result = [];
        foreach ( $data['services'] ?? [] as $service ) {
            $result[] = [
                'code' => $service['code'],
                'title' => $service['name'] . ' (' . $service['days'] . ' дн.)',
                'cost' => (float) $service['price'],
            ];
        }
        $this->cache->set( $cache_key, $result, 1800 );
        return $result;
    }
}

שמירת מספר מעקב להזמנה

לאחר ביצוע ההזמנה, יש ליצור משלוח ולשמור מעקב. זה נעשה דרך אירוע (ocEvent):

// Хук на событие создания заказа
// catalog/controller/extension/shipping/my_courier.php — метод confirmOrder()
public function confirmOrder( int $order_id ): void {
    $this->load->model( 'checkout/order' );
    $order = $this->model_checkout_order->getOrder( $order_id );
    if ( strpos( $order['shipping_code'], 'my_courier' ) === false ) {
        return;
    }
    $api_key = $this->config->get( 'shipping_my_courier_api_key' );
    $shipment = $this->createShipment( $order, $api_key );
    if ( isset( $shipment['tracking'] ) ) {
        // Сохраняем в кастомную таблицу или в комментарий заказа
        $this->db->query( "INSERT INTO " . DB_PREFIX . "order_tracking SET order_id = '" . (int)$order_id . "', tracking_number = '" . $this->db->escape( $shipment['tracking'] ) . "', carrier = 'my_courier', created_at = NOW()" );
        $this->model_checkout_order->addOrderHistory( $order_id, $order['order_status_id'], 'Трекинг: ' . $shipment['tracking'], true );
    }
}

רישום התוסף

ב-OpenCart 3.x, תוסף המשלוח המותאם אישית ל-OpenCart מותקן דרך getQuote(). קוד ההתקנה יוצר טבלה ורושם את האירוע:

// admin/controller/extension/shipping/my_courier.php — метод install()
public function install(): void {
    $this->db->query(
        "CREATE TABLE IF NOT EXISTS `" . DB_PREFIX . "order_tracking` (
            `id` INT UNSIGNED AUTO_INCREMENT PRIMARY KEY,
            `order_id` INT UNSIGNED NOT NULL,
            `tracking_number` VARCHAR(64) NOT NULL,
            `carrier` VARCHAR(32) NOT NULL,
            `created_at` DATETIME NOT NULL,
            INDEX `order_id` (`order_id`)
        ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4"
    );
    $this->load->model('setting/event');
    $this->model_setting_event->addEvent(
        'my_courier_confirm',
        'catalog/model/checkout/order/addOrder/after',
        'extension/shipping/my_courier/confirmOrder'
    );
}

מה אתה מקבל בסופו של דבר

  • תוסף פונקציונלי מלא עם אינטגרציה של חברת השילוח שבחרת (תמיכה ביותר מ-10 שירותים: דואר רוסי, CDEK, Boxberry, DPD וכו').
  • קוד מקור עם הערות, תיעוד התקנה.
  • פאנל ניהול לניהול מפתחות, ערים, אזורים גיאוגרפיים.
  • אחריות פונקציונליות ל-12 חודשים ותמיכה במהלך עדכוני OpenCart.
  • אפשרות להרחבה לחברות שילוח חדשות.

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

תוסף מינימלי עם חישוב תעריף API והצגה בקופה: 2–3 ימים (החל מ-$199). גרסה מלאה עם בחירת נקודת איסוף, שמירת מספר מעקב, התראות ודף מעקב בחשבון הלקוח: 5–7 ימים (חוסך עד 40% במשלוח). תמיכה במספר חברות שילוח עם דף ניהול מאוחד: 1.5–2 שבועות.

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