Реалізація дропшипінгу на веб-сайті
З технічної точки зору, дропшипінг — це шар абстракції між покупцем та поставщиком. Магазин зберігає тільки дані про товари та замовлення, фізичних запасів немає. Реалізація вимагає трьох взаємопов'язаних підсистем: імпорту та синхронізації каталогу, передачі замовлень поставщику та відстеження статусів доставки. Жодну з них не можна відкласти — без синхронізації залишків магазин приймає замовлення на товари, які немає у поставщика.
Архітектура системи
┌─────────────────────────────────────────────────────────┐
│ Інтернет-магазин │
│ │
│ Каталог товарів Кошик/Оформлення Особистий кабінет │
│ │ │ │ │
│ └──────────────────┼───────────────────┘ │
│ │ │
│ ┌────────────▼─────────────┐ │
│ │ Dropshipping Kernel │ │
│ │ - Supplier Router │ │
│ │ - Stock Aggregator │ │
│ │ - Price Calculator │ │
│ │ - Order Dispatcher │ │
│ └────────────┬─────────────┘ │
└───────────────────────────┼─────────────────────────────┘
│
┌────────────────┼────────────────┐
│ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ Поставщик 1 │ │ Поставщик 2 │ │ Поставщик N │
│ REST API │ │ FTP + CSV │ │ SOAP/XML │
└─────────────┘ └─────────────┘ └─────────────┘
Моделі даних
// Поставщик
Schema::create('dropship_suppliers', function (Blueprint $table) {
$table->id();
$table->string('name');
$table->string('slug')->unique();
$table->enum('integration_type', ['api', 'csv', 'xml', 'soap']);
$table->jsonb('credentials')->nullable(); // зашифровано через $casts + Crypt
$table->string('api_endpoint')->nullable();
$table->integer('processing_days')->default(1); // термін збирання замовлення
$table->decimal('default_margin', 5, 2)->default(30.00); // % маржі
$table->boolean('is_active')->default(true);
$table->timestamps();
});
// Товар поставщика (вихідні дані)
Schema::create('dropship_products', function (Blueprint $table) {
$table->id();
$table->foreignId('supplier_id')->constrained('dropship_suppliers');
$table->string('supplier_sku'); // артикул поставщика
$table->string('name');
$table->text('description')->nullable();
$table->decimal('supplier_price', 10, 2);
$table->integer('supplier_stock')->default(0);
$table->jsonb('attributes')->nullable();
$table->string('image_url')->nullable();
$table->foreignId('product_id')->nullable()->constrained('products'); // прив'язка до товару магазину
$table->timestamp('synced_at')->nullable();
$table->timestamps();
$table->unique(['supplier_id', 'supplier_sku']);
});
Ядро дропшипінгу
class DropshippingKernel
{
public function __construct(
private SupplierRepositoryInterface $suppliers,
private PriceCalculator $priceCalculator,
private OrderDispatcher $orderDispatcher,
) {}
/**
* Отримати остаточну ціну товару з урахуванням маржі поставщика
*/
public function calculateRetailPrice(DropshipProduct $dp): float
{
$supplier = $dp->supplier;
$margin = $dp->margin_override ?? $supplier->default_margin;
return $this->priceCalculator->calculate(
supplierPrice: $dp->supplier_price,
marginPercent: $margin,
);
}
/**
* Перевірити доступність товару у поставщика в реальному часі
*/
public function checkAvailability(DropshipProduct $dp): StockResult
{
$connector = SupplierConnectorFactory::make($dp->supplier);
return $connector->checkStock($dp->supplier_sku);
}
/**
* Передати замовлення поставщику після підтвердження оплати
*/
public function dispatchOrder(Order $order): void
{
// Групування позицій за поставщиками
$bySupplier = $order->items->groupBy(
fn($item) => $item->product->dropshipProduct?->supplier_id
);
foreach ($bySupplier as $supplierId => $items) {
if (!$supplierId) continue; // власні товари — пропускаємо
$this->orderDispatcher->dispatch(
supplier: Supplier::find($supplierId),
order: $order,
items: $items,
);
}
}
}
Коннектори поставщиків
Кожен поставщик вимагає свого коннектора. Базовий інтерфейс:
interface SupplierConnectorInterface
{
public function getProducts(int $page = 1, int $perPage = 100): array;
public function checkStock(string $sku): StockResult;
public function placeOrder(SupplierOrderDTO $dto): SupplierOrderResult;
public function getOrderStatus(string $supplierOrderId): OrderStatusResult;
}
Реалізація для поставщика з REST API:
class RestApiSupplierConnector implements SupplierConnectorInterface
{
public function __construct(
private readonly Supplier $supplier,
private readonly \GuzzleHttp\Client $http,
) {}
public function placeOrder(SupplierOrderDTO $dto): SupplierOrderResult
{
// Реалізація REST API
}
}
Графік реалізації
- Моделі даних + основи дропшипінг ядра: 2–3 дні
- Один коннектор поставщика (REST API): 1–2 дні
- Синхронізація каталогу + реальна синхронізація запасів: 1–2 дні
- Система передачі замовлень + сповіщення поставщику: 2–3 дні
- Відстеження доставки + сповіщення клієнтам: 1 день
- Інтерфейс адміністратора для управління маржею: 1 день
Всього: 8–12 робочих днів для повної системи дропшипінгу.







