first commit

This commit is contained in:
mstfyldz
2026-01-18 16:48:15 +03:00
parent 68ba54fa4f
commit af09543374
29 changed files with 2666 additions and 82 deletions

136
docs/.prd Normal file
View File

@@ -0,0 +1,136 @@
Ürün Gereksinim Belgesi (PRD)
Proje Adı: Stripe Ödeme Geçidi Ara Katmanı (Payment Gateway Middleware)
Versiyon: 1.0
Tarih: 15 Ocak 2026
Durum: Taslak
1. Proje Özeti
Bu proje, harici web sitelerinden (istemci) gelen ödeme taleplerini karşılayan, Stripe altyapısını kullanarak tahsilatı gerçekleştiren ve kullanıcıyı işlem sonucuna göre ilgili web sitesine geri yönlendiren merkezi bir ödeme sayfası ve yönetim panelidir.
Temel Amaç: Farklı projeler veya web siteleri için tek bir noktadan güvenli ödeme almak ve tüm işlemleri tek bir admin panelinden takip etmek.
2. Teknik Yığın (Tech Stack)
Frontend & Backend: Next.js 15 (App Router, Server Actions)
Veritabanı & Kimlik Doğrulama: Supabase (PostgreSQL, Auth)
Ödeme Altyapısı: Stripe (Stripe Elements & Webhooks)
UI Framework: Tailwind CSS + Shadcn/UI
Deployment: Vercel (Önerilen)
3. Kullanıcı Rolleri
Son Kullanıcı (Payer): Ödemeyi yapacak olan kişi.
Sistem Admini: Ödemeleri izleyen, iade (refund) işlemlerini yöneten ve raporları gören yetkili.
Entegre Sistem (Client): Kullanıcıyı ödeme sayfasına yönlendiren harici web sitesi.
4. Kullanıcı Akışları (User Flows)
4.1. Ödeme Akışı
Başlatma: Kullanıcı, harici siteden (örn: alisveris.com) "Öde" butonuna basar.
Yönlendirme: Kullanıcı şu parametrelerle sisteme gelir:
amount: Tutar (örn: 100)
currency: Para birimi (örn: TRY)
ref_id: Harici sitedeki sipariş no (örn: SIP-999)
callback_url: İşlem bitince dönülecek URL
client_secret (Opsiyonel/Güvenlik): Tutarlılığı doğrulamak için imza.
Ödeme Sayfası: Sistem parametreleri doğrular, Stripe üzerinde bir PaymentIntent oluşturur ve kullanıcıya kredi kartı formunu gösterir.
İşlem: Kullanıcı kart bilgilerini girer ve onaylar.
Sonuç:
Başarılı: Supabase güncellenir -> Kullanıcı callback_url?status=success&ref_id=... adresine yönlendirilir.
Başarısız: Hata mesajı gösterilir -> Kullanıcı tekrar denemeye veya callback_url?status=failed adresine yönlendirilir.
4.2. Admin Paneli Akışı
Admin, /admin rotasından Supabase Auth ile giriş yapar.
Dashboard'da günlük toplam ciro ve son işlemleri görür.
İşlem listesinde tarih, tutar, durum ve kaynak siteye göre filtreleme yapar.
5. Fonksiyonel Gereksinimler
5.1. Ödeme Arayüzü (Checkout Page)
Dinamik Tutar: URL parametresinden gelen tutarı ekranda göstermelidir.
Stripe Elements: Kart numarası, SKT ve CVC için Stripe'ın güvenli iframe (Elements) yapısı kullanılmalıdır.
Validasyon: Eksik parametre ile gelindiyse (örn: tutar yoksa) kullanıcıya "Geçersiz İşlem" hata sayfası gösterilmelidir.
Loading State: Ödeme işlenirken buton "İşleniyor..." durumuna geçmeli ve tekrar tıklama engellenmelidir.
5.2. Backend & API (Next.js Server Actions)
Create Payment Intent: Sayfa yüklendiğinde Stripe API ile iletişim kurup bir ödeme oturumu başlatmalıdır.
Webhook Listener: Stripe'tan gelen asenkron payment_intent.succeeded ve payment_intent.payment_failed olaylarını dinleyen bir API route (/api/webhooks/stripe) olmalıdır.
Kritik: Veritabanındaki ödeme durumu sadece Webhook'tan gelen bilgiye göre "Paid" olarak işaretlenmelidir (Kullanıcı tarayıcıyı kapatsa bile işlem kaydedilmelidir).
5.3. Admin Paneli
Oturum Yönetimi: Sadece belirli e-posta adreslerine sahip adminler giriş yapabilmelidir.
İşlem Listesi Tablosu:
Sütunlar: ID, Tutar, Para Birimi, Durum (Badge), Kaynak URL, Referans ID, Tarih.
Filtreler: Başarılı/Başarısız, Tarih Aralığı.
Dashboard Widgetları:
Toplam Ciro (Total Revenue)
Başarılı İşlem Sayısı
Başarısız İşlem Oranı
6. Veritabanı Şeması (Supabase)
Tablo Adı: transactions
Kolon Adı Veri Tipi Açıklama
id UUID (PK) Benzersiz işlem ID'si
created_at Timestamptz İşlem oluşturulma tarihi
amount Numeric Tutar (Örn: 150.50)
currency Text Para birimi (TRY, USD)
status Text pending, succeeded, failed
stripe_pi_id Text Stripe Payment Intent ID
source_ref_id Text Harici sitenin sipariş numarası
callback_url Text Geri dönüş URL'i
metadata JSONB Ekstra bilgiler (Müşteri IP, email vb.)
7. Güvenlik Gereksinimleri
SSL: Tüm sistem HTTPS üzerinden çalışmalıdır.
Environment Variables: Stripe Secret Key ve Supabase Key'leri asla client-side kodunda ifşa edilmemelidir.
CSRF Koruması: Next.js yerleşik korumaları aktif olmalıdır.
Basit Güvenlik (V1 için): Harici site ile backend arasında bir "Secret Key" belirlenip, URL manipülasyonunu önlemek için basit bir hash kontrolü eklenebilir (İleri fazda önerilir).
8. Geliştirme Yol Haritası (Fazlar)
Faz 1: Next.js kurulumu, Supabase bağlantısı ve Veritabanı tablosunun oluşturulması.
Faz 2: Stripe entegrasyonu ve Ödeme Sayfası (Checkout) tasarımı.
Faz 3: Webhook kurulumu (Ödemenin veritabanına işlenmesi).
Faz 4: Admin Paneli geliştirilmesi.
Faz 5: Test ve Canlıya Alım (Deployment).

37
docs/db_schema.sql Normal file
View File

@@ -0,0 +1,37 @@
-- Admin users table
CREATE TABLE admin_users (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
email TEXT UNIQUE NOT NULL,
created_at TIMESTAMPTZ DEFAULT NOW()
);
-- Register initial admin (User should replace this or add via dashboard)
-- INSERT INTO admin_users (email) VALUES ('your-email@example.com');
-- Transactions table
CREATE TABLE transactions (
id UUID DEFAULT gen_random_uuid() PRIMARY KEY,
created_at TIMESTAMPTZ DEFAULT NOW(),
amount NUMERIC NOT NULL,
currency TEXT NOT NULL DEFAULT 'TRY',
status TEXT NOT NULL DEFAULT 'succeeded' CHECK (status IN ('pending', 'succeeded', 'failed')),
stripe_pi_id TEXT UNIQUE,
source_ref_id TEXT,
customer_name TEXT,
customer_phone TEXT,
callback_url TEXT,
metadata JSONB DEFAULT '{}'::jsonb
);
-- Enable RLS
ALTER TABLE transactions ENABLE ROW LEVEL SECURITY;
-- Create policy for admins to read all
CREATE POLICY "Admins can read all transactions" ON transactions
FOR SELECT
USING (auth.jwt() ->> 'email' IN (SELECT email FROM admin_users));
-- Create policy for service role to manage all
CREATE POLICY "Service role can manage all" ON transactions
USING (true)
WITH CHECK (true);