Реалізація продажу шаблонів/тем/плагінів на сайті
Маркетплейс цифрових продуктів — шаблонів, тем, плагінів — потребує специфічної інфраструктури: безпечна доставка файлів, управління ліцензіями, система оновлень, робота з авторами.
Моделі продажу цифрових продуктів
Regular License — для одного проекту/клієнта. Extended License — для кількох проектів або комерційного використання. Різні ціни, різні права використання, зберігаються як різні SKU одного продукту.
Доставка файлів після оплати
class DigitalProductDeliveryService
{
public function deliver(Purchase $purchase): void
{
$product = $purchase->product;
// Створюємо захищений посилання для завантаження
$downloadToken = $this->createDownloadToken($purchase);
// Email з кнопкою завантаження
Mail::to($purchase->customer_email)->send(
new DigitalProductDeliveryMail($purchase, $downloadToken)
);
// Зберігаємо для доступу з особистого кабінету
$purchase->update(['download_token' => $downloadToken, 'status' => 'delivered']);
}
private function createDownloadToken(Purchase $purchase): string
{
return DB::table('download_tokens')->insertGetId([
'purchase_id' => $purchase->id,
'token' => Str::random(64),
'download_limit'=> 5,
'download_count'=> 0,
'expires_at' => now()->addDays(30),
]);
}
}
Система оновлень
// Перевірка оновлень для WordPress-плагіну
Route::get('/api/plugins/{slug}/update-check', function (Request $request, string $slug) {
$licenseKey = $request->input('license_key');
$currentVersion = $request->input('version');
$product = Product::where('slug', $slug)->firstOrFail();
$license = License::where('key', $licenseKey)->where('product_id', $product->id)->first();
if (!$license || $license->status !== 'active') {
return response()->json(['update_available' => false, 'error' => 'Invalid license']);
}
$latestVersion = $product->latest_version;
if (version_compare($latestVersion, $currentVersion, '>')) {
return response()->json([
'update_available' => true,
'version' => $latestVersion,
'download_url' => route('plugins.download', ['slug' => $slug, 'token' => $license->id]),
'changelog' => $product->latest_changelog,
]);
}
return response()->json(['update_available' => false]);
});
Система рейтингів та рецензій
// Тільки покупці можуть залишати рецензії
Route::post('/products/{product}/reviews', function (Request $request, Product $product) {
$hasPurchased = Purchase::where([
'customer_id' => auth()->id(),
'product_id' => $product->id,
])->exists();
if (!$hasPurchased) abort(403, 'Тільки покупці можуть залишати рецензії');
Review::create([
'product_id' => $product->id,
'customer_id' => auth()->id(),
'rating' => $request->input('rating'),
'title' => $request->input('title'),
'body' => $request->input('body'),
'version' => $request->input('version'),
]);
$product->updateRatingAverage();
})->middleware('auth');
Виплати авторам
class AuthorPayoutService
{
public function calculatePayout(int $authorId, string $period): array
{
$sales = Sale::where('author_id', $authorId)
->wherePeriod($period)
->get();
$gross = $sales->sum('price');
$fee = $gross * 0.30; // 30% комісія платформи
$payout = $gross - $fee;
return compact('gross', 'fee', 'payout', 'sales');
}
}
Строки
Маркетплейс цифрових продуктів з ліцензіями, оновленнями та виплатами авторам: 20–28 робочих днів.







