Merhaba,
Uzun süredir üzerinde çalıştığım Paketora adlı dijital paket/hizmet satış sistemini
tanıtmak istiyorum. Sosyal medya hizmetleri, lisans satışı, e-pin, ajans hizmetleri ve
kurumsal paketler gibi dijital ürünleri tek panelden satmak için yazıldı.
Hazır framework kullanılmadı; kendi MVC altyapısı üzerine kuruldu. Composer bağımlılığı yok.
En belirgin özelliği: gerçek modüler yapı
Piyasadaki çoğu scriptte "modül kapatma" sadece menüden link gizler; içerik hâlâ Google'da
indekslenir, adres elle yazılınca sayfa açılır. Burada öyle değil:
Bir modül kapatıldığında sistemin tamamı buna uyar:
- Header, mega menü, mobil menü
- Ana sayfa blokları, slider, banner, kampanya
- Kategori ve paket sorguları (her public sorguya modül filtresi girer)
- Arama ve arama önerileri
- sitemap.xml
- Public rotalar → 404 döner (301 yönlendirme yapılmaz)
- Footer, sepet, ödeme adımı
- Yönetim paneli menüsü ve dashboard istatistikleri
Ve en önemlisi: veriler SİLİNMEZ. Modül tekrar açıldığında her şey geri gelir.
Eski siparişler, kayıtlar, loglar korunur.
Modüller arası bağımlılık zinciri var: gereksinimi kapalı olan modül, kendi bayrağı
açık olsa bile etkin sayılmaz. Panelden kapatmaya çalışırsanız hangi modüllerin bağlı
olduğunu söyleyip engeller.
Teslimat sistemi - 3 MOD
Teslimat tipi modüle değil, pakete bağlıdır. Aynı sitede üç tip bir arada çalışır.
1) Manuel teslimat
Sipariş kuyruğa düşer, yöneticiye bildirim gider. Panelden İşleme Al / Tamamla /
İptal / dahili not.
2) API ile otomatik teslimat (SMM panelleri)
Bayi panellerinin neredeyse tamamı aynı sözleşmeyi kullanıyor (Perfect Panel şeması —
JustAnotherPanel, Peakerr vb.). Sistem bu sözleşmenin tamamını uyguluyor:
- add — 10+ servis tipi (özel yorum, mention, hashtag, anket, abonelik, web trafiği) + dripfeed
- status — tek sipariş durumu (charge, start_count, remains)
- status&orders — toplu durum sorgusu, tek istekte 100 siparişe kadar (cron bunu kullanır)
- refill / refill_status — düşen sayılar için telafi talebi
- cancel — sipariş iptali
- services — servis kataloğu senkronu
- balance — bakiye + düşük bakiye bildirimi
Yeni panel eklemek için kod yazmanıza gerek yok. API adresi ve anahtarı girmek yeterli.
Panel farklılıkları ayardan yönetiliyor: sadece GET kabul edenler, anahtarı header'da
bekleyenler, toplu sorgu desteklemeyenler, farklı para birimi kullananlar.
Fallback zinciri: bir pakete birden fazla sağlayıcı tanımlayabilirsiniz. İlki hata
verirse sıradaki denenir, hepsi başarısızsa ayara göre manuel teslimata düşer.
Sipariş asla kaybolmaz.
Servis kataloğu ve eşleme ekranı: "Katalogu Senkronla" deyip sağlayıcının binlerce
servisini çekiyorsunuz; arama/filtre ile bulup paketinize eşliyorsunuz. Servis ID'si elle
yazılmıyor. Ad, ücret ve min/max sınırları katalogdan kopyalanıyor. Her satırda
telafi/iptal/dripfeed yetenek rozetleri var.
Kâr takibi: sağlayıcının döndürdüğü maliyet ile satış tutarından net kâr ve marj
otomatik hesaplanıyor, dashboard'da ciro/maliyet/net kâr olarak görünüyor.
3) Dijital kod / stoktan otomatik teslimat
- Satır satır veya CSV/TXT ile kod yükleme, "KOD|ek bilgi" formatı
- Tekilleştirme: aynı kod iki kez yüklenemez (benzersiz indeks)
- Kodlar AES-256-GCM ile şifreli saklanır, listede maskeli görünür (TEST••••••1111)
- Tam görüntüleme yetki ister ve kayıt altına alınır
- Yarış durumu koruması: SELECT ... FOR UPDATE + tek transaction — iki müşteri son kodu alamaz
- Stok bitince "Stok Tükendi", sepete ekleme sunucu tarafında reddedilir
Ödeme sistemi
Adaptör mimarisi controller sağlayıcıyı tanımaz, yeni sağlayıcı eklemek bir sınıf yazmaktır.
Havale/EFT Manuel bildirim Admin onayı
PayTR
iyzico
Stripe
PayPal
Ödeme zaman aşımı: tamamlanmayan siparişler otomatik iptal edilir ve stok/dijital kod
geri yüklenir. Kart ve havale için ayrı süre tanımlı havale seçen müşterinin siparişi
o bankaya varmadan iptal olmasın diye (varsayılan kart 60 dk, havale 72 saat).
Ödemesi alınmış sipariş asla iptal edilmez.
İade: kısmi ve tam iade, sabit idempotency anahtarı ile ağ hatasından sonra tekrar
denenirse sağlayıcı ikinci kez para iade etmez.
Yönetim paneli
Yatay menü (kenar çubuğu yok): Kontrol Paneli · Katalog · Satış · Pazarlama · İçerik · Sistem.
Klavye ile gezilir, dar ekranda şerit yatay kayar.
Menü yetki ve modül durumuna göre üretilir — yetkisi olmayan veya modülü kapalı bölüm
hiç basılmaz. "Yakında" / "yok" yazan boş ekran bırakılmadı.
Ekranlar:
- Katalog: Kategoriler, Paketler, Stok & Dijital Kodlar, Platformlar
- Satış: Siparişler (detay/teslimat/iade), Müşteriler, Terk Edilmiş Sepetler
- Pazarlama: Kampanyalar, Kuponlar (+ kullanım geçmişi)
- İçerik: Ana Sayfa Blokları, Slider, Medya, Banner & SSS, Blog, Sayfalar, Menüler, Koleksiyonlar, Yorumlar, Destek Talepleri
- Sistem: Modüller, Ödeme Yöntemleri, Entegrasyonlar (+ servis kataloğu), Ayarlar, Sipariş Durumları, Yönlendirmeler, Yöneticiler, Yedekleme, İşlem Kayıtları
Öne çıkanlar:
Terk Edilmiş Sepetler — sepete ürün ekleyip tamamlamayan ziyaretçiler. Eşik seçilebilir
(1 saat – 7 gün). Tutarlar sepette saklanan değerden değil güncel paket fiyatından
hesaplanır. Misafir sepetinin oturum jetonu sayfaya basılmaz.
Koleksiyonlar — kategori ağacından bağımsız, elle derlenmiş paket seçkileri
("Yeni Başlayanlar İçin" gibi). Kendi sayfası, ana sayfa bloğu ve sitemap kaydı var.
Medya kütüphanesi — uzantı beyaz listesi, gerçek MIME dosya içeriğinden okunur
(istemcinin bildirdiğine güvenilmez), dosya adı tamamen yeniden üretilir, hedef dizinde
PHP çalıştırma kapalı. SVG kabul edilmez (içine script gömülebilir).
Yedekleme — veritabanını SQL olarak indirir. mysqldump çağrılmaz (paylaşımlı hostingde
exec kapalı olabilir), dump PDO ile üretilir. Dosya sunucuda saklanmaz, doğrudan indirtilir.
Yöneticiler — 5 rol, 18 yetki anahtarı. Kilitlenmeye karşı korumalar: son süper yönetici
pasife alınamaz, yönetici kendi rolünü değiştiremez. Hesap silinmez, pasife alınır.
Müşteri tarafı
- Üyelik: kayıt, giriş, parola sıfırlama (SHA-256 hash'li jeton, 60 dk, tek kullanımlık), hesabım, sipariş geçmişi
- Kullanıcı numaralandırma engelli — var olmayan hesapta da sahte doğrulama yapılır, yanıt süresi eşitlenir
- Destek sistemi: talep açma ve yanıtlarda görsel/PDF eki. Ekler web'den erişilemeyen dizinde; indirme jeton veya yetkili oturum ister
- Yorumlar: onaya düşer, "doğrulanmış alışveriş" rozeti gerçekten sipariş kaydından hesaplanır
- Favoriler ve Karşılaştırma
- Sipariş sorgulama: numara + ikinci doğrulayıcı (IDOR koruması)
- Sepet kalıcılığı: misafirde 30 günlük çerez, üyede hesaba bağlı. Girişte sepetler birleşir. Tutar sepete hiç yazılmaz, her okumada DB'den hesaplanır
3 satış modu: commerce (sepet+ödeme) · quote_only (teklif formu) · catalog_only (fiyatsız vitrin)
SEO ve Erişilebilirlik
- Her sayfa tipinde title, description, canonical, Open Graph, Twitter Card
- JSON-LD: Organization, WebSite, Product+Offer, BreadcrumbList, CollectionPage, BlogPosting, FAQPage
- Puan verisi yalnız gerçek onaylı yorum varsa eklenir (sahte yıldız yok)
- Sepet, ödeme, arama, üyelik, 404 → noindex
- sitemap.xml yalnız aktif ve modülü açık içeriği listeler
- 301 yönlendirme yönetimi — slug değişince eski adres SEO değerini korur
- WCAG AA kontrast, skip link, klavye ile gezilebilir menüler, :focus-visible, prefers-reduced-motion
- Frontend 13 sayfa × 15 genişlik, admin 13 ekran × 8 genişlik yatay taşma testinden geçti
Güvenlik
- Tüm sorgular PDO prepared statement
- CSRF her POST'ta zorunlu
- Rate limit: giriş 6/5dk, sorgulama 10/5dk
- Hesap kilidi: 5 hatalı girişte 15 dakika
- Yetkilendirme rota seviyesinde — menü gizlemek yeterli sayılmadı
- API anahtarı ve SMTP parolası AES-256-GCM ile şifreli
- IP ham saklanmaz, tuzlanmış hash tutulur
- Loglarda parola/anahtar maskelenir
Teknik
- PHP 8.2+ / MySQL 5.7+ / MariaDB
- Özel MVC — hazır framework ve Composer bağımlılığı yok
- Bootstrap 5 + Vanilla JS (jQuery yok)
- 58 tablo, 23 migration, 21 modül, 228 rota
- Kök dizinde veya alt dizinde çalışır (RewriteBase gerekmez)
- Bakım modu: ziyaretçiye 503 + Retry-After, yönetici siteyi normal görür
- Cron betikleri: sağlayıcı senkronu, ödeme zaman aşımı, sepet temizliği (--dry-run destekli)
Dürüst notlar
- Stripe ve PayPal canlı hesapla test edilmedi. Uç noktalar, imza algoritmaları ve tutar
birimleri resmî dokümanlarla karşılaştırıldı ve imzayı gerçekten doğrulayan mock'larla sınandı;
ancak gerçek 3DS ekranı görülmedi. Yayına almadan önce sandbox ile birer test ödeme yapılmalı.
PayTR ve iyzico uçtan uca test edildi. - Nginx/LiteSpeed kullanıyorsanız hassas dizin korumaları .htaccess'e bağlı olduğu için
sunucu bloğuna kural eklemek zorunlu README'de hazır konfigürasyon var. - Uygulama içinde otomatik yedekleme zamanlayıcısı yok; panelden manuel SQL indirme var.
1 Adet Ömür Boyu Lisans: 5.000 TL
