Başarısız ödeme callback'lerinin doğru işlenmesi
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!).
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.
Modules/Payment/App/Services/PayTRCallbackService.php
PayTR callback'lerinde işlem sırası yanlıştı:
Eski Akış (Hatalı):
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ı."
}
Status kontrolü tutar kontrolünden ÖNCE yapılıyor:
Yeni Akış (Doğru):
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, '.', '');
// ...
| 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 | ✓ |
11f360f5a