PropJoe adlı üyeden alıntı: mesajı görüntüle
Selamlar.
Hash hesaplama kodunuzda hata var.
<?php
// Veritabanı bağlantısı ve oturum başlatma
include 'includes/db.php';
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

// Log tutma fonksiyonu
function logToFile($message) {
    file_put_contents('callback_log.txt', date('Y-m-d H:i:s') . " - " . $message . "\n", FILE_APPEND);
}

// Gelen POST verilerini logla
logToFile("Callback başladı: " . json_encode($_POST));

// PayTR'den gelen verileri al
$post = $_POST;

// Gerekli alanların kontrolü
$required_fields = ['merchant_oid', 'status', 'total_amount', 'hash'];
foreach ($required_fields as $field) {
    if (!isset($post[$field])) {
        logToFile("Eksik alan: $field");
        die("Eksik veri: $field");
    }
}

// PayTR merchant bilgileri
$merchant_key = 'SU85kXeWnTHPtwMY';
$merchant_salt = 'YcEGLyjmcN6c3yED';

// Hash oluştur
// PayTR'nin beklediği formatta hash hesaplama
$hash_str = $post['merchant_oid'] . $merchant_salt . $post['status'] . $post['total_amount'];
$hash = base64_encode(hash_hmac('sha256', $hash_str, $merchant_key, true));

// Hash doğrulama
if (!hash_equals($hash, $post['hash'])) {
    logToFile("Hash doğrulama hatası:");
    logToFile("Oluşturulan hash: " . $hash);
    logToFile("Gelen hash: " . $post['hash']);
    logToFile("Hash string: " . $hash_str);
    die('PAYTR hash doğrulama hatası');
}

// Ödeme kaydını sorgula
$stmt = $conn->prepare("SELECT * FROM odemeler WHERE merchant_oid = :merchant_oid");
$stmt->bindParam(':merchant_oid', $post['merchant_oid'], PDO::PARAM_STR);
$stmt->execute();
$odeme = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$odeme) {
    logToFile("Ödeme kaydı bulunamadı: " . $post['merchant_oid']);
    die("Ödeme kaydı bulunamadı.");
}

// Ödeme başarılıysa işlem yap
if ($post['status'] === 'success') {
    try {
        $conn->beginTransaction();
        
        // Ödeme durumunu güncelle
        $guncelle = $conn->prepare("UPDATE odemeler SET
            odendi_mi = 1,
            odeme_tarihi = NOW(),
            total_amount = :total_amount,
            payment_type = :payment_type
            WHERE merchant_oid = :merchant_oid");
            
        $guncelle->execute([
            ':total_amount' => $post['total_amount'],
            ':payment_type' => $post['payment_type'] ?? null,
            ':merchant_oid' => $post['merchant_oid']
        ]);

        $conn->commit();
        logToFile("Ödeme başarıyla kaydedildi: " . $post['merchant_oid']);
        
        // PayTR'ye OK yanıtı dön
        echo "OK";
    } catch (PDOException $e) {
        $conn->rollBack();
        logToFile("Veritabanı hatası: " . $e->getMessage());
        die("İşlem hatası");
    }
} else {
    logToFile("Başarısız ödeme: " . $post['merchant_oid']);
    die("Başarısız ödeme");
}
Kendinize göre uyarlayıp deneyebilirsiniz.

Callback;

<?php
// Veritabanı bağlantısı ve oturum başlatma
include 'includes/db.php';
if (session_status() == PHP_SESSION_NONE) {
    session_start();
}

// Log tutma
function writeLog($message) {
    file_put_contents('callback_log.txt', date('Y-m-d H:i:s') . " - " . $message . "\n", FILE_APPEND);
}

// Callback başladı
writeLog("Callback başladı: " . json_encode($_POST));

// PayTR'den gelen verileri al
$post_data = $_POST;

// Eksik veri kontrolü
if (!isset($post_data['merchant_oid'], $post_data['status'], $post_data['total_amount'], $post_data['hash'])) {
    writeLog("Eksik veri: " . json_encode($post_data));
    die("Eksik veri.");
}

// PayTR doğrulama bilgileri
$merchant_key = 'SU85kXeWnTHPtwMY';
$merchant_salt = 'YcEGLyjmcN6c3yED';

// Hash doğrulama - PayTR'nin belirlediği formatta
$hash_str = $post_data['merchant_oid'] . $merchant_salt . $post_data['status'] . $post_data['total_amount'];
$hash = base64_encode(hash_hmac('sha256', $hash_str, $merchant_key, true));

if (!hash_equals($hash, $post_data['hash'])) {
    writeLog("Hash doğrulama hatası:");
    writeLog("Oluşturulan hash: " . $hash);
    writeLog("Gelen hash: " . $post_data['hash']);
    writeLog("Hash string: " . $hash_str);
    die('PAYTR hash doğrulama hatası.');
}

// Ödeme kaydını merchant_oid ile doğrudan odemeler tablosundan sorgula
$stmt = $conn->prepare("SELECT * FROM odemeler WHERE merchant_oid = :merchant_oid");
$stmt->bindParam(':merchant_oid', $post_data['merchant_oid'], PDO::PARAM_STR);
$stmt->execute();
$odeme = $stmt->fetch(PDO::FETCH_ASSOC);

if (!$odeme) {
    writeLog("Ödeme kaydı bulunamadı: " . $post_data['merchant_oid']);
    die("Ödeme kaydı bulunamadı.");
}

// Ödeme başarılıysa işlemleri yap
if ($post_data['status'] === 'success') {
    try {
        $conn->beginTransaction();
        
        // Ödeme durumunu 1 (başarılı) olarak güncelle
        $guncelle_odeme = $conn->prepare("
            UPDATE odemeler
            SET odendi_mi = 1,
                odeme_tarihi = NOW(),
                total_amount = :total_amount,
                payment_type = :payment_type
            WHERE merchant_oid = :merchant_oid
        ");
        
        $guncelle_odeme->execute([
            ':total_amount' => $post_data['total_amount'],
            ':payment_type' => $post_data['payment_type'] ?? null,
            ':merchant_oid' => $post_data['merchant_oid']
        ]);

        $conn->commit();
        writeLog("Ödeme başarıyla kaydedildi: " . $post_data['merchant_oid']);
        
        // PayTR'ye başarı yanıtı gönder
        echo "OK";
    } catch (PDOException $e) {
        $conn->rollBack();
        writeLog("Veritabanı hatası: " . $e->getMessage());
        die("İşlem hatası");
    }
} else {
    writeLog("Başarısız ödeme: " . $post_data['merchant_oid']);
    // Başarısız ödemelerde de PayTR'ye OK yanıtı gönderilmeli
    echo "OK";
    exit;
}
?>

Emeklerinize sağlık hocam, çok teşekkür ederim sorunum çözüldü.