Kodlarım bunlar ne yaptıysam sorunu çözemedim.
https://www.paytr.com/odeme adresine yönlendiriyor ve
{"status":"failed","reason":"paytr_token gonderilmedi veya gecersiz"}
hatasını alıyorum. Yardımcı olur musunuz?
<?php
session_start(); // Oturum başlatma
// Hataları göster
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
$title = "Ödeme Sayfası";
include('../include/header.php'); // Header dosyasını dahil et
include('../include/db.php'); // Veritabanı bağlantısı
// Kullanıcı giriş kontrolü
if (!isset($_SESSION['kullanici_id'])) {
header("Location: /giris-yap");
exit;
}
$cv_id = $_GET['cv_id'] ?? null;
$kullanici_id = $_SESSION['kullanici_id'];
if ($cv_id) {
// CV bilgilerini al
$sorgu = $conn->prepare("SELECT * FROM cv_liste WHERE id = ? AND kullanici_id = ?");
$sorgu->execute([$cv_id, $kullanici_id]);
$cv = $sorgu->fetch(PDO::FETCH_ASSOC);
if ($cv) {
// Kullanıcı bilgilerini al
$kullanici_sorgu = $conn->prepare("SELECT * FROM kullanicilar WHERE id = ?");
$kullanici_sorgu->execute([$kullanici_id]);
$kullanici = $kullanici_sorgu->fetch(PDO::FETCH_ASSOC);
if ($kullanici) {
// Ödeme için gerekli bilgiler
$merchant_id = '480'; // bilgilerim
$merchant_key = 'EySp4NBzPF3A'; // bilgilerim
$merchant_salt = 'pcr6ffAdr2n'; // bilgilerim
$email = $kullanici['email'] ?? null; // Kullanıcının email adresi
$payment_amount = 5000; // Ödeme tutarı (kuruş cinsinden)
$user_basket = base64_encode(json_encode([
["CV " . ($cv['cv_adi'] ?? 'Bilinmeyen'), "50.00", 1]
]));
$merchant_oid = uniqid(); // Ödeme işlemi için benzersiz bir ID
$merchant_ok_url = "http://site-ismi/basarili";
$merchant_fail_url = "http://site-ismi/basarisiz";
$test_mode = "1"; // Test modu aktif
$non_3d = "0";
$client_lang = "tr";
$installment_count = "1"; // Varsayılan taksit sayısı
$user_name = $kullanici['ad'] . ' ' . $kullanici['soyad'];
$user_address = $kullanici['adres'] ?? 'Adres bilgisi girilmemiş';
$user_phone = $kullanici['telefon'] ?? 'Telefon bilgisi girilmemiş';
// Kullanıcı email kontrolü
if (empty($email)) {
echo "<p class='text-danger'>Kullanıcı email bilgisi bulunamadı. Lütfen tekrar deneyin.</p>";
exit;
}
// IP adresini al
if (isset($_SERVER["HTTP_CLIENT_IP"])) {
$user_ip = $_SERVER["HTTP_CLIENT_IP"];
} elseif (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
$user_ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else {
$user_ip = $_SERVER["REMOTE_ADDR"];
}
// Güvenlik imzası oluşturma
$payment_type = 'card';
$currency = 'TL';
$hash_str = $merchant_id . $user_ip . $merchant_oid . $email . $payment_amount . $payment_type . $installment_count . $currency . $test_mode . $non_3d . $merchant_salt;
$paytr_token = base64_encode(hash_hmac('sha256', $hash_str, $merchant_key, true));
$paytr_token = base64_encode(hash_hmac('sha256',$hash_str.$merchant_salt,$merchant_key,true));
// Ödeme formu
?>
<section class="container my-5">
<h2>Ödeme Yap</h2>
<p class="lead"> ödeme yapmanız gerekmektedir.</p>
<form action="https://www.paytr.com/odeme" method="post">
Kart Sahibi Adı: <input type="text" name="cc_owner" value="TEST KARTI"><br>
Kart Numarası: <input type="text" name="card_number" value="9792030394440796"><br>
Kart Son Kullanma Ay: <input type="text" name="expiry_month" value="12"><br>
Kart Son Kullanma Yıl: <input type="text" name="expiry_year" value="30"><br>
Kart Güvenlik Kodu: <input type="text" name="cvv" value="000"><br>
<input type="hidden" name="merchant_id" value="<?php echo $merchant_id; ?>">
<input type="hidden" name="user_ip" value="<?php echo $user_ip; ?>">
<input type="hidden" name="merchant_oid" value="<?php echo $merchant_oid; ?>">
<input type="hidden" name="email" value="<?php echo $email; ?>">
<input type="hidden" name="payment_type" value="card">
<input type="hidden" name="payment_amount" value="<?php echo $payment_amount; ?>">
<input type="hidden" name="currency" value="TL">
<input type="hidden" name="test_mode" value="<?php echo $test_mode; ?>">
<input type="hidden" name="non_3d" value="<?php echo $non_3d; ?>">
<input type="hidden" name="merchant_ok_url" value="<?php echo $merchant_ok_url; ?>">
<input type="hidden" name="merchant_fail_url" value="<?php echo $merchant_fail_url; ?>">
<input type="hidden" name="user_basket" value="<?php echo $user_basket; ?>">
<input type="hidden" name="client_lang" value="<?php echo $client_lang; ?>">
<input type="hidden" name="paytr_token" value="<?php echo $paytr_token; ?>">
<input type="hidden" name="installment_count" value="0">
<input type="hidden" name="no_installment" value="0">
<input type="hidden" name="max_installment" value="1">
<input type="hidden" name="user_name" value="<?php echo $user_name; ?>">
<input type="hidden" name="user_address" value="<?php echo $user_address; ?>">
<input type="hidden" name="user_phone" value="<?php echo $user_phone; ?>">
<input type="hidden" name="client_lang" value="<?php echo $client_lang; ?>">
<input type="hidden" name="lang" value="<?php echo $client_lang; ?>">
<input type="submit" value="Ödeme Yap">
</form>
</section>
<?php
} else {
echo "<p class='text-danger'>Kullanıcı bilgileri bulunamadı. Lütfen tekrar deneyin.</p>";
}
} else {
echo "<p class='text-danger'>CV bilgileri bulunamadı. Lütfen tekrar deneyin.</p>";
}
} else {
echo "<p class='text-danger'>CV ID bulunamadı. Lütfen tekrar deneyin.</p>";
}
include('../include/footer.php'); // Footer dosyasını dahil et
?>
Bu hata, paytr_token değeriyle ilgili bir sorun olduğunu gösteriyor. paytr_token, PayTR API'sine gönderilmesi gereken güvenlik imzasıdır ve doğru şekilde oluşturulması gerekir. Aşağıdaki adımları kontrol ederek hatayı çözebilirsiniz:
1. Hash oluşturma işlemini düzeltin:
Kodun içinde iki kez paytr_token oluşturulmuş, bu gereksiz ve kafa karıştırıcı olabilir. Şu satırları birleştirin ve doğru sırada hash oluşturduğunuzdan emin olun:
$hash_str = $merchant_id . $user_ip . $merchant_oid . $email . $payment_amount . $payment_type . $installment_count . $currency . $test_mode . $non_3d . $merchant_salt;
$paytr_token = base64_encode(hash_hmac('sha256', $hash_str, $merchant_key, true));
Bu satırları bir kez çalıştırdıktan sonra doğru paytr_token oluşturulacak.
2. Kodun düzenlenmiş hali:
<?php
include('../include/header.php');
include('../include/db.php');
if (!isset($_SESSION['kullanici_id'])) {
header("Location: /giris-yap");
exit;
}
$cv_id = $_GET['cv_id'] ?? null;
$kullanici_id = $_SESSION['kullanici_id'];
if ($cv_id) {
$sorgu = $conn->prepare("SELECT * FROM cv_liste WHERE id = ? AND kullanici_id = ?");
$sorgu->execute([$cv_id, $kullanici_id]);
$cv = $sorgu->fetch(PDO::FETCH_ASSOC);
if ($cv) {
$kullanici_sorgu = $conn->prepare("SELECT * FROM kullanicilar WHERE id = ?");
$kullanici_sorgu->execute([$kullanici_id]);
$kullanici = $kullanici_sorgu->fetch(PDO::FETCH_ASSOC);
if ($kullanici) {
$merchant_id = '480';
$merchant_key = 'EySp4NBzPF3A';
$merchant_salt = 'pcr6ffAdr2n';
$email = $kullanici['email'] ?? null;
$payment_amount = 5000;
$user_basket = base64_encode(json_encode([["CV " . ($cv['cv_adi'] ?? 'Bilinmeyen'), "50.00", 1]]));
$merchant_oid = uniqid();
$merchant_ok_url = "http://site-ismi/basarili";
$merchant_fail_url = "http://site-ismi/basarisiz";
$test_mode = "1";
$non_3d = "0";
$client_lang = "tr";
$installment_count = "1";
$user_name = $kullanici['ad'] . ' ' . $kullanici['soyad'];
$user_address = $kullanici['adres'] ?? 'Adres bilgisi girilmemiş';
$user_phone = $kullanici['telefon'] ?? 'Telefon bilgisi girilmemiş';
if (empty($email)) {
echo "<p class='text-danger'>Kullanıcı email bilgisi bulunamadı. Lütfen tekrar deneyin.</p>";
exit;
}
if (isset($_SERVER["HTTP_CLIENT_IP"])) {
$user_ip = $_SERVER["HTTP_CLIENT_IP"];
} elseif (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
$user_ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
} else {
$user_ip = $_SERVER["REMOTE_ADDR"];
}
$payment_type = 'card';
$currency = 'TL';
$hash_str = $merchant_id . $user_ip . $merchant_oid . $email . $payment_amount . $payment_type . $installment_count . $currency . $test_mode . $non_3d . $merchant_salt;
$paytr_token = base64_encode(hash_hmac('sha256', $hash_str, $merchant_key, true));
?>
<section class="container my-5">
<h2>Ödeme Yap</h2>
<p class="lead"> ödeme yapmanız gerekmektedir.</p>
<form action="https://www.paytr.com/odeme" method="post">
Kart Sahibi Adı: <input type="text" name="cc_owner" value="TEST KARTI"><br>
Kart Numarası: <input type="text" name="card_number" value="9792030394440796"><br>
Kart Son Kullanma Ay: <input type="text" name="expiry_month" value="12"><br>
Kart Son Kullanma Yıl: <input type="text" name="expiry_year" value="30"><br>
Kart Güvenlik Kodu: <input type="text" name="cvv" value="000"><br>
<input type="hidden" name="merchant_id" value="<?php echo $merchant_id; ?>">
<input type="hidden" name="user_ip" value="<?php echo $user_ip; ?>">
<input type="hidden" name="merchant_oid" value="<?php echo $merchant_oid; ?>">
<input type="hidden" name="email" value="<?php echo $email; ?>">
<input type="hidden" name="payment_type" value="card">
<input type="hidden" name="payment_amount" value="<?php echo $payment_amount; ?>">
<input type="hidden" name="currency" value="TL">
<input type="hidden" name="test_mode" value="<?php echo $test_mode; ?>">
<input type="hidden" name="non_3d" value="<?php echo $non_3d; ?>">
<input type="hidden" name="merchant_ok_url" value="<?php echo $merchant_ok_url; ?>">
<input type="hidden" name="merchant_fail_url" value="<?php echo $merchant_fail_url; ?>">
<input type="hidden" name="user_basket" value="<?php echo $user_basket; ?>">
<input type="hidden" name="client_lang" value="<?php echo $client_lang; ?>">
<input type="hidden" name="paytr_token" value="<?php echo $paytr_token; ?>">
<input type="hidden" name="installment_count" value="0">
<input type="hidden" name="no_installment" value="0">
<input type="hidden" name="max_installment" value="1">
<input type="hidden" name="user_name" value="<?php echo $user_name; ?>">
<input type="hidden" name="user_address" value="<?php echo $user_address; ?>">
<input type="hidden" name="user_phone" value="<?php echo $user_phone; ?>">
<input type="hidden" name="client_lang" value="<?php echo $client_lang; ?>">
<input type="hidden" name="lang" value="<?php echo $client_lang; ?>">
<input type="submit" value="Ödeme Yap">
</form>
</section>
<?php
} else {
echo "<p class='text-danger'>Kullanıcı bilgileri bulunamadı. Lütfen tekrar deneyin.</p>";
}
} else {
echo "<p class='text-danger'>CV bilgileri bulunamadı. Lütfen tekrar deneyin.</p>";
}
} else {
echo "<p class='text-danger'>CV ID bulunamadı. Lütfen tekrar deneyin.</p>";
}
include('../include/footer.php');
?>
Öneriler:
1. paytr_token oluşturulurken sadece bir kez base64 ile encode etmelisiniz. Yukarıdaki düzenlenmiş kodda bu düzeltilmiştir.
2. Eğer hâlâ aynı hatayı alıyorsanız, PayTR destek ekibine paytr_token oluşturma sürecinizi ve kullandığınız parametreleri iletebilirsiniz.
Chatgpt ile baktım