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;
}
?>