Fintech ve Ödeme Sistemlerinde KVKK Kabusu ve Veribenim Çözümü

Fintech şirketleri, iki düzenleyiciye sorumludur: | Düzenleyici | Sorumluluğu | Ceza | |------------|-----------|------| | **BDDK** (Bankacılık Düzenleme ve Denetleme Kurulu) | Finansal güvenlik, para transferi, hesap yönetimi | 6-9 hane (milyon TL) | | **KVKK** (Kişisel Verileri Koruma Kurumu) | Kişisel veri işleme, onay, silinme | 6-9 hane (müşteri başına) |

Bloglar
Fintech ve Ödeme Sistemlerinde KVKK Kabusu ve Veribenim Çözümü

Finansal Veri Ayrıştırması ve Sıfır Bilgi (Zero-Knowledge) Yaklaşımı


İçindekiler

  1. Giriş: Fintech'in İkili Sorumluluğu — BDDK + KVKK

  2. Finansal Veri ile Kişisel Verinin Tehlikeli İç İçe Geçmesi

  3. Zero-Knowledge Architecture: Ne Bilmesek Daha İyi?

  4. Ödeme Sayfasında Çerez: Oturum vs. Pazarlama

  5. Open Banking ve Veri Paylaşımı: Kime Ne İzin Verildi?

  6. Nasıl Entegre Edilir? — @veribenim/core ile Ödeme Akışı

  7. Laravel SDK ile Fintech Backend Entegrasyonu

  8. Data Sovereignty: Finansal Verilerin Türkiye'de Tutulması

  9. Otomatik Veri Temizleme: İşlem Verisi Retention

  10. PCI DSS + KVKK Çakışma Noktaları

  11. Sonuç: Veribenim ile Fintech Uyumluluğu


Giriş: Fintech'in İkili Sorumluluğu — BDDK + KVKK

Fintech şirketleri, iki düzenleyiciye sorumludur:

Düzenleyici

Sorumluluğu

Ceza

BDDK (Bankacılık Düzenleme ve Denetleme Kurulu)

Finansal güvenlik, para transferi, hesap yönetimi

6-9 hane (milyon TL)

KVKK (Kişisel Verileri Koruma Kurumu)

Kişisel veri işleme, onay, silinme

6-9 hane (müşteri başına)

Tipik Fintech'in Problemi:

2024: "Ödeme almak kolay, compliance zor"
↓
Ödeme sistemini hızlı kur (3 ay)
↓
KVKK'ya uyum hala "todo" (6 ay geçti)
↓
Denetim başlama maili alındı
↓
İş yapıyorsun ama belge yok
↓
Ceza: 1 milyon TL + kapatma tehdidi

Fintech'in Saklamak Zorunda Olduğu Veriler (BDDK):

  • Hesap Bilgileri: Kimlik, adres, telefon, e-posta

  • İşlem Geçmişi: Gönderici, alıcı, tutar, tarih

  • Kya/AML Belgesi: "Sizin para nereden geliyor?" kanıtı

  • Banka Bilgileri: IBAN, hesap numarası (şifreli)

Fintech'in İstemediği Ama Saklı Tutulan Veriler (KVKK İhlali):

  • Pazarlama Profili: "Bu müşteri zengin, hedef işlet"

  • Kredi Skoru: "Bu müşteri riskli, işlem engelle"

  • Sosyal Medya Verileri: "Müşterinin Instagram takipçisi 100K"

  • Yüksek Limit Bilgisi: "Bu müşteri kredilendirilebilir"

🚨 İHLAL RİSKİ: BDDK'nın saklanması gereken veriler + KVKK'nın saklanmasını istediği veriler arasında fark olması en sık KVKK ihlalidir. Ör: BDDK "işlem geçmişini 10 yıl sakla" der, ama KVKK "onay sona erirse 6 ay sonra sil" der. Hangisi yapılacak?


Finansal Veri ile Kişisel Verinin Tehlikeli İç İçe Geçmesi

Senaryo: Tipik Fintech Veri Depolaması

Müşteri: Ahmet Bey

Hesap Bilgileri:
├─ Ad-Soyad: Ahmet YILMAZ
├─ Kimlik: 12345678901 (🚨 PII)
├─ Adres: Eyüpsultan, İstanbul (🚨 PII)
├─ Telefon: +90 (532) 123-4567 (🚨 PII)
├─ E-posta: ahmet.yilmaz@gmail.com (🚨 PII)
├─ Doğum Tarihi: 1985-03-15 (🚨 PII)
└─ KYA Belgesi: Taranmış Pasaport + Adres Belgesi (🚨 BIYOMETRIK)

Finansal Veriler:
├─ IBAN: TR60 0006 1000 0006 1234 5678 (KYA'ye bağlı)
├─ Hesap Bakiyesi: 125,450 TL (Finansal, saklı)
├─ İşlem Geçmişi:
│  ├─ 2024-01-15: 5,000 TL transfer (Muhalif partiye)
│  ├─ 2024-02-01: 2,500 TL fatura ödemesi (Elektrik)
│  ├─ 2024-03-10: 1,200 TL tıbbi harcama
│  └─ [100+ işlem, her biri "hassas bilgi"]
└─ Kredi Skoru: 750/900 (Fintech'in hesabı)

Pazarlama Verileri (🚨 KVKK İHLALİ):
├─ Segmenti: "High-value customer"
├─ Pazarlama Profili: "Yüksek gelir, risk düşük"
├─ SMS Gönderme: Haftada 3 tane
├─ Email Gönderme: Günde 1 tane
├─ Cookie Takibi: "Bu sayfada 30 dakika kaldı"
└─ Kredi Teklifini: "100K limit, %1.5 aylık oran"

KVKK Analizi: Hangisi Silinmeli?

Veri

BDDK

KVKK

Çakışma

Ad-Soyad

10 yıl

Onay bitince 6 ay

✓ SORUN

Kimlik No

10 yıl

Onay bitince 6 ay

✓ SORUN

IBAN

10 yıl

Onay bitince 6 ay

✓ SORUN

İşlem Geçmişi

10 yıl

Onay bitince 6 ay

✓ SORUN

Kredi Skoru

5 yıl

Onay bitince sil

✓ SORUN

SMS Profili

Onay bitince sil

✓ UYUM

Email Profili

Onay bitince sil

✓ UYUM

Sonuç: İKİ VERI SINIIFI OLMALI

TIER 1 — Finansal Veri (BDDK saklama zorunluluğu)
└─ 10 yıl tutulur, anonim hale getirilir
   (Ad-soyad silinir, ref numarası kalır)

TIER 2 — KVKK Verisi (Onay süresine bağlı)
└─ Onay sona ererse, 6 ay sonra silinir
   (Ad-soyad, telefon, e-posta silinir)

TIER 3 — Pazarlama Verisi (Onay zorunlu)
└─ Onay olmadan işlenmesin

Zero-Knowledge Architecture: Ne Bilmesek Daha İyi?

Konsept: Veribenim IBAN Bilgisini İşletiyor mu?

Cevap: Hayır. Kesinlikle hayır.

Veribenim'in Zero-Knowledge modeli:

Fintech: "Müşteri Ahmet'in IBAN'ı TR60 0006..."
Veribenim: "Bilgi istemiyorum."

Fintech: "Peki, Ahmet'e ne desen?"
Veribenim: "Cevap: Riza aldın mı?"
           "Ahmet: Evet"
           "Veribenim: Tamam, cevap = YES"

Fintech: IBAN'ı kendi veritabanında tutar (PCI DSS uyumlu)
Veribenim: Sadece "riza var/yok" tutar

Neden "Zero-Knowledge"?

PCI DSS standardı, finansal kuruluşlara şöyle der:

PCI DSS 3.4: "Kart veri hiçbir zaman düz metin olarak saklanmayacaktır."

Ama Veribenim, PCI DSS'yi ihlal etmediği için finansal veriyi ASLA görmez. Bunun yerine:

Fintech IBAN'ı:
1. Kendi AWS/Azure'da encrypt eder (AES-256)
2. Veribenim'e göndermedcek, sadece "onay var/yok" sorar
3. Veribenim yanıt verir: "Riza kayıtlı"
4. Fintech, cevaba güvenerek işlem yapabilir

Veribenim'in Zero-Knowledge Mimarı:

// Veribenim ASLA finansal veriyi görmez

interface ConsentQuery {
  customer_id: string;        // Müşteri ID
  consent_type: 'payment' | 'open_banking' | 'analysis';
  // IBAN, kredi kartı, banka bilgisi: YOK
}

interface ConsentResponse {
  has_consent: boolean;       // true/false
  scope: string[];            // ['balance', 'transactions']
  expires_at: ISO8601;        // Onay ne zaman sona eriyor
  // Finansal detay: YOK
}

Ödeme Sayfasında Çerez: Oturum vs. Pazarlama

Sorun: Ödeme Sayfasında 47 Çerez

Tipik Fintech ödeme sayfası (/checkout):

// Çerezler
1. session_id        ← Oturum (Gerekli, KVKK muaf)
2. csrf_token        ← Güvenlik (Gerekli, KVKK muaf)
3. google_analytics  ← Analiz (İsteğe bağlı, onay gerekli)
4. facebook_pixel    ← Pazarlama (İsteğe bağlı, onay gerekli)
5. mixpanel_track    ← Davranış takibi (İsteğe bağlı, onay gerekli)
6. user_profile      ← Kişi profili (İsteğe bağlı, onay gerekli)
7-47. [Çeşitli üçüncü taraf çerezleri]

⚖️ HUKUKİ NOT: KVKK'ya göre, ödeme işlemi sırasında pazarlama çerezi işletmek ihlaldir. Müşteri, kredi kartını girmeden önce "Analizi kabul et" diye sorulamaz.

KVKK'nın Talep Ettiği: "Çerez İzin Bankası"

// Ödeme sayfasında SADECE gerekli çerezler çalışmalı

const NECESSARY_COOKIES = {
  session_id,        // Oturum
  csrf_token,        // XSS/CSRF koruması
  payment_amount,    // Ödeme tutar (session)
};

const OPTIONAL_COOKIES = {
  google_analytics,  // "Siteyi nasıl kullanıyor?"
  facebook_pixel,    // "Yeniden pazarlama"
  user_behavior,     // "Müşteri profili"
};

// Kurallar:
// ✓ Necessary: İzinsiz çalışabilir
// ✗ Optional: Sadece onayı istendikten SONRA çalışmalı
// ✗ Ödeme sırasında optional çerezleri açma

Veribenim'in Çerez Yönetimi

// @veribenim/core — Çerez yönetimi

import { CookieManager } from '@veribenim/core';

const cookieManager = new CookieManager({
  apiToken: process.env.VERIBENIM_TOKEN,
});

// Sayfada yüklü tüm çerezleri tara
const allCookies = cookieManager.scan();

// KVKK kategorilerine ayır
const categorized = cookieManager.categorize(allCookies);

// Ödeme sayfasında kontrol
if (window.location.pathname === '/checkout') {
  // Pazarlama çerezini yakala
  if (categorized.marketing.length > 0) {
    console.warn('⚠️ KVKK İHLAL: Ödeme sayfasında pazarlama çerezi aktif!');

    // Veribenim'e ihbar et
    cookieManager.logViolation({
      page: '/checkout',
      violation_type: 'marketing_cookie_on_payment_page',
      cookies: categorized.marketing,
    });

    // Çerezi devre dışı bırak
    categorized.marketing.forEach(cookie => cookie.disable());
  }
}

Veribenim Dashboard: Çerez Analizi

Fintech yöneticisi görebilir:

ÇEREZLERİNİZ ANALIZI

Sayfalar:
┌─────────────────────────────────────────────┐
│ /checkout                                    │
│ ✓ Necessary Cookies: 3                      │
│ ⚠️ Optional Cookies Aktif: 0 (İYİ!)         │
│ Status: COMPLIANT                           │
│                                             │
│ /dashboard                                  │
│ ✓ Necessary Cookies: 2                      │
│ ⚠️ Optional Cookies Aktif: 5 (Onaylı)       │
│ Status: COMPLIANT                           │
│                                             │
│ /landing                                    │
│ ✓ Necessary Cookies: 1                      │
│ ⚠️ Optional Cookies Aktif: 8 (Onaylı)       │
│ Status: COMPLIANT                           │
└─────────────────────────────────────────────┘

Open Banking ve Veri Paylaşımı: Kime Ne İzin Verildi?

Open Banking: Türkiye BDDK Yönetmeliği

2021'de BDDK, "Open Banking" standardını zorunlu hale getirdi. Kuralı:

"Müşteri, bankasının hesaplarına ve işlemlerine erişim izni verebilir. Ama sadece kendisinin seçtiği hizmetlere."

Senaryo: Fintech'in Open Banking Talebi

Müşteri Ahmet, bir Fintech uygulamasında:

Uygulama: "Yazılı bütçe yönetimi sağlamak için,
           banka hesaplarınızda bakiye ve işlem
           verisine erişim izni verir misiniz?"

Ahmet'in seçenekleri:
□ Sadece bakiye görmesine izin ver (balance_view)
□ İşlem geçmişini görmesine izin ver (transaction_view)
□ İkisine birden izin ver (full_access)
□ Erişimi revoke et

Fintech backend'de:

// Veribenim: Open Banking onayını logla

async function requestOpenBankingAccess(scopes: string[]) {
  // Scopes: ['balance', 'transactions', 'accounts']

  // Veribenim'e consent log gönder
  await veribenim.logFormConsent({
    form_name: 'open_banking_authorization',
    consented: true,
    consent_text: `
      İstanbul Bankası aracılığıyla aşağıdaki veri türlerine
      erişim izni veriyorum:

      ${scopes.includes('balance') ? '✓ Bakiye bilgisi\n' : ''}
      ${scopes.includes('transactions') ? '✓ İşlem geçmişi\n' : ''}
      ${scopes.includes('accounts') ? '✓ Hesap listesi\n' : ''}

      Bu izin, uygulamayı kullanma süresince geçerlidir.
      İzni her zaman geri çekebilirim.
    `,
    metadata: {
      bank_name: 'İstanbul Bankası',
      data_scopes: scopes.join(','),
      purpose: 'budget_management',
      consent_version: '1.2',

      // ASLA yazılmayacak:
      // - iban: 'TR60...'
      // - account_number: '...'
      // - balance: 125450
    },
  });
}

Veribenim'in İtişi: Transparent Scope

Müşteri: "Niye bu uygulama tüm işlemlerini görebiliyor?"
Veribenim: Raporta bakıyor...

Open Banking Consent Log:
  Tarih: 2024-12-15
  Uygulama: BudgetApp
  Scopes: balance, transactions, accounts
  Revocation: Hiç yapılmamış
  Last Used: Bugün (2025-04-02)

Veribenim Önerisi:
  "O uygulama şu an 3+ aydır kullanılmıyor,
   izni geri çekmek ister misin?"

Nasıl Entegre Edilir? — @veribenim/core ile Ödeme Akışı

Senaryo: Fintech Ödeme Sayfası

Müşteri, Fintech uygulamasında kredi kartı ile ödeme yapmak istiyor.

Adım 1: Ödeme Formu Yükleniyor
  ↓ (Veribenim SDK yüklenir)
  Adım 2: Consent Gate Kontrolü
  ↓ (Ödeme yapabilmek için onay var mı?)
  Adım 3: Onay Kontrol Başarılı
  ↓ (Ödeme butonuna basılabilir)
  Adım 4: Ödeme İşlemi Başla
  ↓ (Kredi kartı verileri gönderiliyor — PCI DSS uyumlu)
  Adım 5: Veribenim'e İşlem Logu Gönder
  ↓ (Tutarsız metadata — HIÇBIR finansal veri yok)
  Adım 6: Ödeme Tamamlandı

Frontend Kod

// pages/checkout.tsx — Veribenim Entegrasyonu

import { init, ConsentGate } from '@veribenim/core';
import { CookieController } from '@veribenim/core';

const veribenim = init({
  token: process.env.VERIBENIM_TOKEN,
  lang: 'tr',
});

const cookieController = new CookieController();

export default function CheckoutPage() {
  const [paymentReady, setPaymentReady] = useState(false);
  const [error, setError] = useState(null);

  useEffect(() => {
    // Adım 1: Çereze bak — Oturum var mı?
    if (!cookieController.has('session_id')) {
      setError('Oturum süresi doldu. Yeniden giriş yapın.');
      return;
    }

    // Adım 2: Veribenim'e sor — Ödeme onayı var mı?
    veribenim.getConsent('payment').then((consent) => {
      if (!consent.hasConsent) {
        setError('Ödeme işlemi için onay gereklidir.');
        return;
      }

      // Adım 3: Pazarlama çerezlerini kapat
      cookieController.disable('marketing');
      cookieController.disable('analytics');

      setPaymentReady(true);
    });
  }, []);

  const handlePaymentSubmit = async (e) => {
    e.preventDefault();

    if (!paymentReady) {
      setError('Ödeme hazır değil.');
      return;
    }

    // Adım 4: Ödeme işlemini başlat
    const formData = new FormData(e.target);
    const paymentData = {
      amount: formData.get('amount'),      // Tutar
      currency: 'TRY',                      // Para birimi
      // ASLA: card_number, cvv, full_name — PCI DSS
    };

    // Adım 5: Ödeme API'ye gönder (PCI DSS uyumlu)
    const paymentResponse = await fetch('/api/payment/process', {
      method: 'POST',
      headers: { 'Content-Type': 'application/json' },
      body: JSON.stringify(paymentData),
    });

    if (!paymentResponse.ok) {
      setError('Ödeme başarısız. Lütfen tekrar deneyin.');
      return;
    }

    const result = await paymentResponse.json();

    // Adım 6: Veribenim'e işlem logu gönder (Metadata ASLA)
    await veribenim.logTransaction({
      transaction_type: 'payment',
      status: result.success ? 'completed' : 'failed',
      amount_category: 'payment', // Gerçek tutar YAZILMAZ
      platform: 'web',

      // Metadata (Finansal veri YOK):
      metadata: {
        payment_method_type: 'credit_card', // "credit_card" değil "****1234"
        processing_time_ms: result.processing_time,
        // card_last_4: ASLA
        // cvv: ASLA
        // bank_name: ASLA
      }
    });

    // Adım 7: Onay mesajı
    alert('Ödeme başarılı!');
  };

  return (
    <div className="checkout-container">
      <h2>Ödeme Sayfası</h2>

      {error && <div className="alert alert-error">{error}</div>}

      {paymentReady ? (
        <form onSubmit={handlePaymentSubmit}>
          <input type="number" name="amount" placeholder="Tutar (₺)" required />

          <div className="consent-notice">
            <p>Ödeme işlemini tamamlayarak, </p>
            <a href="/consent">Ödeme Koşullarını</a> kabul etmiş olursunuz.
          </div>

          <button type="submit" disabled={!paymentReady}>
            Ödeme Yap
          </button>
        </form>
      ) : (
        <div className="loading">Ödeme hazırlanıyor...</div>
      )}
    </div>
  );
}

Laravel SDK ile Fintech Backend Entegrasyonu

Backend'de tüm finansal ve onay lojik:

<?php

namespace App\Services;

use Veribenim\VeribenimClient;
use Veribenim\Exceptions\{ConsentException, PaymentException};
use App\Models\{Payment, Customer, ConsentLog};

class PaymentConsentService
{
    private VeribenimClient $veribenim;

    public function __construct()
    {
        $this->veribenim = new VeribenimClient(
            token: env('VERIBENIM_API_TOKEN'),
            apiUrl: env('VERIBENIM_API_URL', 'https://api.veribenim.com'),
        );
    }

    /**
     * Ödeme işlemini başlat
     *
     * KVKK Kontrol Noktaları:
     * 1. Müşteri onayı var mı?
     * 2. Ödeme verileri PCI DSS uyumlu mu?
     * 3. Finansal veri nereye gidiyor?
     */
    public function initiatePayment(array $request): array
    {
        $customerId = auth()->id();

        // Kontrol 1: Ödeme onayı var mı?
        $consent = $this->veribenim->getConsent('payment', $customerId);

        if (!$consent['hasConsent']) {
            throw new ConsentException(
                'KVKK onayı olmadan ödeme işlemi yapılamaz. ' .
                'Lütfen ödeme koşullarını kabul edin.'
            );
        }

        // Kontrol 2: Tutarın makul olup olmadığını kontrol et
        $amount = (float) $request['amount'];
        if ($amount <= 0 || $amount > 999999) {
            throw new PaymentException('Geçersiz tutar.');
        }

        // NOT: Kredi kartı bilgileri (card_number, cvv) bu noktaya ASLA gelmez.
        // Frontend'de, Stripe/Adyen gibi PCI DSS uyumlu servise gider.

        // Kontrol 3: Müşteri profil doğrulama
        $customer = Customer::findOrFail($customerId);
        if (!$customer->verified) {
            throw new PaymentException('Profil doğrulanmamış. KYA belgelerini yükleyin.');
        }

        // Adım 1: Ödeme kaydı oluştur
        $payment = Payment::create([
            'customer_id'       => $customerId,
            'amount'            => $amount,
            'currency'          => 'TRY',
            'status'            => 'pending',
            'consent_id'        => $consent['id'],
            'payment_method'    => $request['payment_method_type'] ?? 'credit_card',
            'transaction_id'    => null, // Gateway'den sonra doldurulacak
        ]);

        // Adım 2: Veribenim'e işlem logu gönder (METADATA ASLA)
        $this->veribenim->logTransaction(
            transactionType: 'payment_initiated',
            status: 'pending',
            amountCategory: 'payment',
            platform: 'api',
            metadata: [
                'payment_method_type' => 'credit_card',
                // IBAN, banka, tutar: YAZILMAZ
                'consent_id'          => $consent['id'],
            ]
        );

        return [
            'success'    => true,
            'payment_id' => $payment->id,
            'amount'     => $amount,
            'message'    => 'Ödeme işlemi başlatıldı.',
        ];
    }

    /**
     * Ödeme tamamlandı — Veribenim'e kesin log gönder
     */
    public function completePayment(int $paymentId, array $gatewayResponse): void
    {
        $payment = Payment::findOrFail($paymentId);

        // Ödemeyi işaretle
        $payment->update([
            'status'         => 'completed',
            'transaction_id' => $gatewayResponse['transaction_id'],
            'completed_at'   => now(),
        ]);

        // Veribenim'e kesin log
        $this->veribenim->logTransaction(
            transactionType: 'payment_completed',
            status: 'completed',
            amountCategory: 'payment',
            platform: 'api',
            metadata: [
                'payment_method_type' => 'credit_card',
                'gateway'             => 'stripe', // Sadece metadata
                'processing_time_ms'  => $gatewayResponse['processing_time'],
            ]
        );

        // Fatura oluştur (BDDK'ya göre 10 yıl tutulacak)
        Invoice::create([
            'payment_id'  => $payment->id,
            'customer_id' => $payment->customer_id,
            'amount'      => $payment->amount,
            'invoice_date'=> now(),
            'due_date'    => now()->addDays(30),
        ]);
    }

    /**
     * Open Banking — Müşteri banka erişimi izni veriyor
     */
    public function requestOpenBankingAccess(
        int $customerId,
        string $bankName,
        array $scopes // ['balance', 'transactions']
    ): array {
        // Veribenim'e Open Banking consent logu gönder
        $consentLog = $this->veribenim->logFormConsent(
            formName: 'open_banking_authorization',
            consented: true,
            consentText: sprintf(
                '%s bankasında %s verilerine erişim izni veriyorum. ' .
                'İzni istediğim zaman geri çekebilirim.',
                $bankName,
                implode(', ', $scopes)
            ),
            metadata: [
                'bank_name'      => $bankName,
                'data_scopes'    => implode(',', $scopes),
                'purpose'        => 'budget_tracking',
                'consent_type'   => 'open_banking',

                // ASLA yazılmayacak:
                // 'iban'           => 'TR60...',
                // 'account_number' => '...',
                // 'balance'        => 125450,
            ]
        );

        // Open Banking verisini güvenli şekilde kaydet
        $openBankingAccess = OpenBankingAccess::create([
            'customer_id'   => $customerId,
            'bank_name'     => $bankName,
            'scopes'        => implode(',', $scopes),
            'consent_id'    => $consentLog['id'],
            'expires_at'    => now()->addYear(),
            'is_active'     => true,
        ]);

        return [
            'success'  => true,
            'consent_id' => $consentLog['id'],
            'message'  => 'Open Banking erişimi verildi.',
        ];
    }

    /**
     * DSAR — Müşteri: "Finansal profilimi sil"
     *
     * KVKK vs BDDK Çatışması:
     * - KVKK: "Onay sona ererse, kişisel veriyi sil"
     * - BDDK: "İşlem geçmişini 10 yıl sakla" (Tapu, vergi için)
     *
     * ÇÖZÜM: Tiered Deletion
     */
    public function handleFinancialErasure(array $request): array
    {
        $customer = Customer::where('email', $request['email'])->firstOrFail();

        // Adım 1: Veribenim'e DSAR bildir
        $dsar = $this->veribenim->submitDsar(
            requestType: 'erasure',
            fullName: $request['full_name'],
            email: $request['email'],
            description: $request['message'] ??
                'Finansal platformda saklanan kişisel bilgilerimin ' .
                '(ad-soyad, telefon, e-posta, adres) silinmesini talep ediyorum. ' .
                'İşlem geçmişi ve faturalar yasal nedenlerden dolayı tutulabilir. ' .
                'KVKK Madde 11/e kapsamında hakkımı kullanıyorum.'
        );

        // Adım 2: Tiered Deletion
        // TIER 1: Kişisel veriler (KVKK silinme talep, BDDK tutma zorunluluğu yok)
        $customer->update([
            'full_name'  => null,
            'phone'      => null,
            'address'    => null,
            'erased_at'  => now(),
            'erased_reason' => 'DSAR - KVKK Art 11(e)',
        ]);

        // TIER 2: Finansal veriler (BDDK tutma zorunluluğu varsa)
        Payment::where('customer_id', $customer->id)
            ->where('status', 'completed')
            ->where('created_at', '>', now()->subYears(10))
            ->update([
                'customer_name'  => null,
                'customer_email' => null,
                'customer_phone' => null,
                // amount, date, invoice: KALSIN (yasal kayıt)
            ]);

        // Adım 3: Open Banking erişimini iptal et
        OpenBankingAccess::where('customer_id', $customer->id)
            ->update(['is_active' => false]);

        // Adım 4: Onay maili gönder
        Mail::to($request['email'])->send(new FinancialErasureConfirmation([
            'full_name'   => $request['full_name'],
            'dsar_id'     => $dsar['id'],
            'deadline'    => now()->addDays(30)->toDateString(),
            'note'        => 'Yasal yükümlülük kapsamındaki finansal kayıtlar korunacaktır.',
        ]));

        return [
            'success'  => true,
            'dsar_id'  => $dsar['id'],
            'message'  => 'Silinme talebiniz alındı. 30 gün içinde işleneceğiz.',
            'deadline' => now()->addDays(30)->toDateString(),
        ];
    }

    /**
     * Otomatik veri temizleme — Retention expire
     * Her gün çalışmalı: php artisan schedule:run
     */
    public function cleanupExpiredRetention(): int
    {
        $removed = 0;

        // Pazarlama onayı sona eren müşterilerin profil verisini sil
        $expired = Customer::where(
            'marketing_consent_expires_at',
            '<',
            now()
        )->get();

        foreach ($expired as $customer) {
            $customer->update([
                'marketing_preferences' => null,
                'segmentation_data'     => null,
                'cleaned_at'            => now(),
            ]);
            $removed++;
        }

        \Log::info(
            "[Veribenim] Fintech: {$removed} müşteri profil verisi temizlendi",
            ['date' => now()->toDateTimeString()]
        );

        return $removed;
    }
}

Data Sovereignty: Finansal Verilerin Türkiye'de Tutulması

BDDK Zorunluluğu

BDDK, 2023 kararıyla:

"Müşteri finansal verileri, Türkiye'de saklanmalıdır. Yurt dışına aktarım, BDDK izni gerektirir."

Fintech için Risk Senaryosu

AWS: Virginia (USA)
├─ Veriniz: Müşteri İBANı, işlem geçmişi
├─ GDPR Sorunu: ABD'nin CLOUD Act'ı (FBI veri talep edebilir)
├─ KVKK Sorunu: BDDK denetim için izin vermez
├─ Ceza: Operasyon durması + 5 milyon TL

Veribenim'in Garantisi

Veribenim Architecture (Data Residency Compliant)

Müşteri (Türkiye)
   ↓ (HTTPS, TLS 1.3)
Veribenim API (Türkiye'de sunucu)
   ↓
PostgreSQL (AWS eu-central-1 Frankfurt)
   ↓ (Ama veritabanı EU'da, veri Türkiye'de şifreli)
   + AES-256 Encryption (veri anahtarı Türkiye'de)
   ↓
Backup (S3 Türkiye Bölgesi)

Veribenim's DPA (Data Processing Agreement)

Madde 3 — Veri Saklanması Yeri
3.1 Finansal veriler Türkiye'de saklanır.
3.2 Yedek kopya da Türkiye'de tutulur.
3.3 Şifreleme anahtarları Türkiye'dedir.
3.4 EU/ABD'ye transfer YASAKTIR (BDDK).

Madde 4 — Denetim
4.1 BDDK/SPK denetimi isterse, 5 gün içinde erişim sağlanır.
4.2 İş geçmişi, Türk mahkemesi kararı sonucu verilir.

Otomatik Veri Temizleme: İşlem Verisi Retention

Çakışan Saklama Süreleri

Veri

Saklama Süresi

Neden

Ödeme Talimi

10 yıl

BDDK (Gümrük, Vergi)

Müşteri Profil

6 ay (onay bitince)

KVKK

KYA Belgesi

5 yıl

AML/CTF

Pazarlama Profili

Onay bitince sil

KVKK

İptal İşlemi

2 yıl

Ticaret Kanunu

Veribenim's Retention Manager

// Laravel Command — Günlük çalışır

php artisan veribenim:cleanup-retention --force

Sonuç:
  ✓ Pazarlama profilleri: 1,247 silinmiş
  ✓ Profil verileri: 892 anonimleştirilmiş
  ✓ Konsent logları: 3,456 arşivlenmiş
  → Finansal veriler: Hiç dokunulmadı (10 yıl saklama)

Retention Policy Tablosu

Payment Verisi:
├─ Müşteri Ad-Soyad: 0 gün (silin hemen)
├─ Ödeme Tutarı: 10 yıl (BDDK)
├─ İşlem Tarihi: 10 yıl (BDDK)
└─ Vergi Numarası: 10 yıl (Vergi Kanunu)

Pazarlama Verisi:
├─ Cookie ID: Onay bitince sil
├─ Davranış Profili: Onay bitince sil
├─ Email Liste: Onay bitince sil
└─ Segment Bilgisi: Onay bitince sil

PCI DSS + KVKK Çakışma Noktaları

PCI DSS Nedir?

PCI DSS (Payment Card Industry Data Security Standard) — Kredi kartı şirketlerinin (Visa, Mastercard, American Express) standardı:

Gereklilik

İçerik

KVKK Uyumu

PCI 1.1

Firewall

PCI 3.2

Kart verisi hiçbir zaman düz metin

✓ KVKK de ister

PCI 8.5

Her erişim user_id ile logla

✓ KVKK de ister

PCI 12

İş ortakları ile SLA imzala

✓ KVKK de ister (DPA)

Çakışma 1: Kart Numarasının Saklanması

PCI DSS: Kart numarası (card_number) YAZILMAZ
KVKK: Kart numarası kişisel veridir, onay gerekli

✓ Her ikisi de: Kart numarası, düz metin + onay yok = HİÇ YAZMA

Çakışma 2: Veri Silinmesi

PCI DSS: "Veriyi tutulan yeri şifreleme ile koru"
KVKK: "Onay sona erirse, veriyi sil"

Çözüm: Şifrelenmiş verileri saklayabilirsin,
       ama onay sona erirse, şifrelenmiş halini de sil.

Fintech CRM:
  credit_card_encrypted = "aes256(4532015112830366)"
  expires_at = 2025-04-02

  2025-04-03:
    → credit_card_encrypted = NULL (silinmiş)

Çakışma 3: DSAR Talepleri

PCI DSS: "Kart numarası kimseye gösterilmez, müşteriye bile"
KVKK: "Müşteri verilerine erişme hakkı var (DSAR)"

Çözüm: Müşteriye SADECE son 4 hanesi göster

Müşterinin Erişim Talebi:
  Banka Kartlarınız:
  ├─ Visa: ****5678
  ├─ Mastercard: ****9012
  └─ American Express: ****3456

Sonuç: Veribenim ile Fintech Uyumluluğu

Fintech, 3 düzenleyici arasında sıkışmış:

  1. BDDK — "10 yıl finansal veri sakla"

  2. KVKK — "Onay sona erirse 6 ay sonra sil"

  3. PCI DSS — "Kart verisi asla düz metin"

Veribenim'in Çözümü:

Zero-Knowledge Architecture: Finansal veri görülmez, sadece "onay var/yok" bilgisi saklanır. ✓ Tiered Retention: Finansal veriler 10 yıl (BDDK), kişisel veriler 6 ay (KVKK). ✓ Otomatik Temizleme: Onay sona erirse, otomatik silinir. ✓ Open Banking Consent: Banka erişimi hangi scopelerde (balance, transactions)? ✓ DSAR Otomasyonu: "Verilerinizi sil" talebi 30 günde işlenir. ✓ Data Sovereignty: Tüm veriler Türkiye'de (BDDK zorunluluğu). ✓ PCI DSS Uyumu: Kart verisi ASLA tutulmaz.

Fintech Seçince Kazanacakları:

  • 0 KVKK cezası riski

  • 0 BDDK denetim riski

  • Open Banking standarda uyum

  • DSAR talepleri otomatik işleme

  • Müşteri güveni (veri güvenliği)


📚 Teknik Dokümantasyon: Tüm SDK referans dökümanlarına veribenim.com/documents adresinden ulaşabilirsiniz.

 

Sonraki Adım

Veribenim'in bu sektör için sunduğu çözümleri görmek ve KVKK/GDPR uyumlu pazarlama başlamak için aşağıdaki butona tıklayın.

Ücretsiz Hesap Oluştur

Benzer Makaleler

Bu sektörle ilgili daha fazla makale yakında yayımlanacak.

Tüm makaleleri görmek için bloğa dön →