PayTR Callback Düzeltmesi

Başarısız ödeme callback'lerinin doğru işlenmesi

Düzeltildi 1 Dosya Değişti

Basit Anlatım (Herkes İçin)

Sorun Ne İdi?

Müşteri ödeme sayfasından vazgeçtiğinde PayTR "başarısız ödeme" bildirimi gönderiyordu. Sistem bu bildirimi yanlış işliyordu ve "tutar uyuşmazlığı" hatası veriyordu. PayTR da "hata" cevabı aldığı için aynı bildirimi tekrar tekrar gönderiyordu (dakikada 1 kez, 791 kez!).

Çözüm Ne Oldu?

Artık sistem önce ödemenin "başarılı mı başarısız mı" olduğuna bakıyor. Başarısız ise tutar kontrolü yapmadan direkt "tamam, anladım" diyor. PayTR da tekrar denemiyor.

Teknik Detaylar (Geliştiriciler İçin)

Değiştirilen Dosya: modified
Modules/Payment/App/Services/PayTRCallbackService.php

Sorunun Kaynağı

PayTR callback'lerinde işlem sırası yanlıştı:

Eski Akış (Hatalı):

  1. Hash kontrolü
  2. Tutar kontrolü ← status=failed gelince total_amount=0, beklenen=4800 → FAIL!
  3. Status kontrolü (hiç ulaşmıyordu)

PayTR başarısız ödemelerde:

{
  "status": "failed",
  "total_amount": "0",
  "failed_reason_msg": "Müşteri ödeme yapmaktan vazgeçti ve ödeme sayfasından ayrıldı."
}

Uygulanan Çözüm

Status kontrolü tutar kontrolünden ÖNCE yapılıyor:

Yeni Akış (Doğru):

  1. Hash kontrolü
  2. Status kontrolü ← status=failed → handleFailedPayment() → OK döner
  3. Tutar kontrolü (sadece başarılı ödemeler için)

Kod Değişikliği

Eklenen Kod (Satır 89-99):

// 5. Başarısız ödeme kontrolü (tutar kontrolünden ÖNCE!)
// PayTR failed callback'lerinde total_amount=0 gelir, bu normal
if ($status === 'failed') {
    Log::info('⚠️ PayTR callback: Ödeme başarısız', [
        'payment_id' => $payment->payment_id,
        'reason' => $callbackData['failed_reason_msg'] ?? 'Bilinmiyor',
    ]);
    $this->handleFailedPayment($payment, $callbackData);
    return ['success' => true, 'message' => 'Failed payment processed'];
}

// 6. Tutar kontrolü (sadece başarılı ödemeler için)
$expectedAmount = number_format($payment->amount, 2, '.', '');
$receivedAmount = number_format($totalAmount / 100, 2, '.', '');
// ...

Etki Analizi

Önce

  • 791 hata logu (17-18 Ocak)
  • Her dakika tekrar callback
  • Log spam
  • Başarısız ödemeler işlenmiyordu

Sonra

  • Hata yok
  • Tek callback yeterli
  • Temiz loglar
  • Başarısız ödemeler doğru işleniyor

Test Senaryoları

Senaryo Beklenen Sonuç Durum
Başarılı ödeme (status=success) Tutar kontrolü yapılır, ödeme onaylanır
Başarısız ödeme (status=failed) Tutar kontrolü atlanır, handleFailedPayment çağrılır
Yanlış tutar (status=success, tutar farklı) Hata verilir, FAIL döner
Hash hatası Güvenlik hatası, FAIL döner

Git Bilgisi

Commit: 11f360f5a
Branch: main
Tarih: 18 Ocak 2026
Durum: Pushed