Реализация автоматической передачи заказов дропшиппинг-поставщику

Наша компания занимается разработкой, поддержкой и обслуживанием сайтов любой сложности. От простых одностраничных сайтов до масштабных кластерных систем построенных на микро сервисах. Опыт разработчиков подтвержден сертификатами от вендоров.

Разработка и обслуживание любых видов сайтов:

Информационные сайты или веб-приложения
Сайты визитки, landing page, корпоративные сайты, онлайн каталоги, квиз, промо-сайты, блоги, новостные ресурсы, информационные порталы, форумы, агрегаторы
Сайты или веб-приложения электронной коммерции
Интернет-магазины, B2B-порталы, маркетплейсы, онлайн-обменники, кэшбэк-сайты, биржи, дропшиппинг-платформы, парсеры товаров
Веб-приложения для управления бизнес-процессами
CRM-системы, ERP-системы, корпоративные порталы, системы управления производством, парсеры информации
Сайты или веб-приложения электронных услуг
Доски объявлений, онлайн-школы, онлайн-кинотеатры, конструкторы сайтов, порталы предоставления электронных услуг, видеохостинги, тематические порталы

Это лишь некоторые из технических типов сайтов, с которыми мы работаем, и каждый из них может иметь свои специфические особенности и функциональность, а также быть адаптированным под конкретные потребности и цели клиента

Предлагаемые услуги
Показано 1 из 1 услугВсе 2065 услуг
Реализация автоматической передачи заказов дропшиппинг-поставщику
Средняя
~3-5 рабочих дней
Часто задаваемые вопросы

Наши компетенции:

Этапы разработки

Последние работы

  • image_website-b2b-advance_0.png
    Разработка сайта компании B2B ADVANCE
    1262
  • image_web-applications_feedme_466_0.webp
    Разработка веб-приложения для компании FEEDME
    1171
  • image_websites_belfingroup_462_0.webp
    Разработка веб-сайта для компании БЕЛФИНГРУПП
    874
  • image_ecommerce_furnoro_435_0.webp
    Разработка интернет магазина для компании FURNORO
    1094
  • image_crm_enviok_479_0.webp
    Разработка веб-приложения для компании Enviok
    831
  • image_bitrix-bitrix-24-1c_fixper_448_0.png
    Разработка веб-сайта для компании ФИКСПЕР
    851

Реализация автоматической передачи заказов дропшиппинг-поставщику

Ручная пересылка заказов поставщику по email — источник ошибок и задержек. Автоматизация передачи сокращает время обработки заказа с нескольких часов до секунд и устраняет человеческий фактор. Задача: после подтверждения оплаты заказ должен уходить поставщику без участия менеджера.

Триггер передачи

Заказ передаётся поставщику строго после подтверждения платежа — не после оформления заказа. Это принципиально: оформление без оплаты создаёт ложные заявки у поставщика.

// Listener на событие оплаты
class DispatchOrderToSupplierListener
{
    public function __construct(
        private readonly DropshippingKernel $kernel,
    ) {}

    public function handle(PaymentConfirmedEvent $event): void
    {
        $order = $event->order;

        // Только дропшиппинг-позиции
        $dropshipItems = $order->items->filter(
            fn($item) => $item->product->dropshipProduct !== null
        );

        if ($dropshipItems->isEmpty()) {
            return;
        }

        // Группируем по поставщику и диспатчим отдельные задачи
        $dropshipItems
            ->groupBy(fn($item) => $item->product->dropshipProduct->supplier_id)
            ->each(function ($items, $supplierId) use ($order) {
                DispatchOrderToSupplierJob::dispatch($order, $supplierId, $items)
                    ->onQueue('supplier-orders');
            });
    }
}

Job передачи заказа

class DispatchOrderToSupplierJob implements ShouldQueue
{
    use Dispatchable, InteractsWithQueue, Queueable, SerializesModels;

    public $tries = 5;
    public $backoff = [30, 60, 120, 300, 600];
    public $timeout = 60;

    public function __construct(
        private readonly Order $order,
        private readonly int $supplierId,
        private readonly Collection $items,
    ) {}

    public function handle(SupplierConnectorFactory $factory): void
    {
        $supplier  = Supplier::findOrFail($this->supplierId);
        $connector = $factory->make($supplier);

        $dto = new SupplierOrderDTO(
            orderId:        $this->order->id,
            externalRef:    $this->order->number, // номер заказа в магазине
            recipientName:  $this->order->delivery_name,
            phone:          $this->order->delivery_phone,
            deliveryAddress: $this->order->deliveryAddress->formatted(),
            deliveryMethod: $this->order->delivery_method,
            comment:        $this->order->comment,
            items: $this->items->map(fn($item) => new SupplierOrderItemDTO(
                supplierSku: $item->product->dropshipProduct->supplier_sku,
                quantity:    $item->quantity,
            )),
        );

        $result = $connector->placeOrder($dto);

        // Сохраняем ID заказа у поставщика
        SupplierOrder::create([
            'order_id'          => $this->order->id,
            'supplier_id'       => $this->supplierId,
            'supplier_order_id' => $result->supplierOrderId,
            'status'            => $result->status,
            'placed_at'         => now(),
        ]);

        // Обновляем статус позиций
        $this->items->each(fn($item) => $item->update([
            'supplier_status' => 'dispatched',
            'dispatched_at'   => now(),
        ]));

        Log::info('Order dispatched to supplier', [
            'order_id'    => $this->order->id,
            'supplier_id' => $this->supplierId,
            'supplier_order_id' => $result->supplierOrderId,
        ]);
    }

    public function failed(Throwable $e): void
    {
        // После исчерпания попыток — уведомить менеджера для ручной обработки
        $this->order->update(['requires_manual_dispatch' => true]);

        Notification::route('mail', config('dropshipping.manager_email'))
            ->notify(new SupplierDispatchFailedNotification(
                $this->order,
                $this->supplierId,
                $e->getMessage()
            ));
    }
}

Форматы передачи заказа поставщику

REST API — предпочтительный формат. POST-запрос с JSON-телом.

Email с фиксированным форматом — поставщик принимает заказы по email в определённом шаблоне. Отправляется через Laravel Mailable.

Telegram-бот — некоторые небольшие поставщики принимают заказы через Telegram. Интеграция через Telegram Bot API.

Портал поставщика — форма на сайте поставщика. В крайнем случае автоматизируется через Playwright/Puppeteer (headless browser automation).

// Пример: отправка заказа через email-шаблон
class SupplierOrderEmailConnector implements SupplierConnectorInterface
{
    public function placeOrder(SupplierOrderDTO $dto): SupplierOrderResult
    {
        Mail::to($this->supplier->credentials['order_email'])
            ->send(new SupplierOrderMail($dto));

        // Email-интеграция не возвращает ID — генерируем внутренний
        return new SupplierOrderResult(
            supplierOrderId: 'email-' . $dto->orderId . '-' . time(),
            status: 'sent',
        );
    }
}

Подтверждение получения заказа

После отправки заказа поставщик должен подтвердить получение. Варианты:

  1. Webhook от поставщика — поставщик вызывает endpoint магазина при изменении статуса
  2. Polling — магазин периодически опрашивает API поставщика о статусе заказа
  3. Email-парсинг — ответное письмо от поставщика парсится через IMAP
// Polling статусов (запускается каждые 30 минут)
class PollSupplierOrderStatusJob implements ShouldQueue
{
    public function handle(): void
    {
        SupplierOrder::where('status', 'dispatched')
            ->where('placed_at', '>', now()->subDays(14))
            ->with('supplier')
            ->chunk(50, function ($supplierOrders) {
                foreach ($supplierOrders as $so) {
                    $connector = SupplierConnectorFactory::make($so->supplier);
                    $result    = $connector->getOrderStatus($so->supplier_order_id);

                    if ($result->status !== $so->status) {
                        $so->update(['status' => $result->status, 'tracking_number' => $result->tracking]);
                        event(new SupplierOrderStatusChangedEvent($so, $result));
                    }
                }
            });
    }
}

Обработка ошибок поставщика

Поставщик может отклонить заказ (нет в наличии, ошибка адреса, временная недоступность). Логика обработки:

  • Товар закончился у поставщика → автоматически ищем альтернативного поставщика (если настроен мультипоставщик) или уведомляем менеджера
  • Ошибка авторизации → alert в Slack/Telegram, пауза дальнейших отправок
  • Ошибка сети → retry с backoff

Сроки

Автоматическая передача заказов через REST API — 3–4 рабочих дня. Email-интеграция — 1–2 рабочих дня. Polling статусов + уведомления покупателю — ещё 2 дня.