• 21-08-2023, 00:01:39
    #1
    şimdi bir teklifte bulunacağım lütfen yyanlış nalamayın benim uzun zamandır üzerinde çalıştığım bşr çekiliş projesi vardı proje bitti son dakika paytr hatası çıktı ve 1 haftadır çözemiyorum r10 da 4 tane konu açtım hine çöülmedim hatayı çözene scripti sattığım zaman 200tl gibi bir miktar vereceğim hadi en kötü scripti satamadım hatayı çözen arkafalşa çekiliş scriptini hediye edeceğim.

    aldığım hata: PAYTR notification failed: bad hash

    ! lütfen bana wp adan kişisel numaranızdan ulaşın !

    kodlar bu:

    1.ADIM
    <?php
    require_once 'includes/header.php';
    $getId = $_GET['id'];
    ?>
    <!-- partial -->
    <div class="main-panel">
        <div class="content-wrapper">
            <div class="page-header">
                <h3 class="page-title">
                    <span class="page-title-icon bg-gradient-primary text-white me-2">
                        <i class="mdi mdi-star"></i>
                    </span> Ürün Bilgisi
                </h3>
            </div>
            <?php
    if (isset($_POST['joinSweepstake'])) {
        // Ödeme İçin gerekli bilgiler
        $userInfoSQL = $db->query("SELECT * FROM `users` WHERE `id`='$userId'");
        $userInfoSQL = $userInfoSQL->fetch(PDO::FETCH_OBJ);
        $sweepstakeInfoSQL = $db->query("SELECT `name`,`price` FROM `sweepstakes` WHERE `id`='$getId'");
        $sweepstakeInfoSQL = $sweepstakeInfoSQL->fetch(PDO::FETCH_OBJ);
        // PayTR Mağaza Bilgileri
        $paytr = $db->query("SELECT * FROM paytr WHERE id=1");
        $paytr = $paytr->fetch(PDO::FETCH_OBJ);
    
        // kullanıcı eposta ve tel numarası
        $userFullName = $userInfoSQL->fullname;
        $userEmail = $userInfoSQL->email;
        $userGSM = $userInfoSQL->gsm;
        $orderCode = uniqid();
        $orderCodeUPDATE = $db->query("UPDATE `users` SET `orderCode` = '$orderCode' WHERE `users`.`id` = $userId;");
        // Alınıcak Tutar
        $sweepstakeName = $sweepstakeInfoSQL->name;
        $sweepstakePrice = $sweepstakeInfoSQL->price;
        // Mağaza Bilgisi
        $getMerchant_id = $paytr->merchant_id;
        $getMerchant_key = $paytr->merchant_key;
        $getMerchant_salt = $paytr->merchant_salt;
    
        // PAYTR
    
        ## 1. ADIM için örnek kodlar ##
        ####################### DÜZENLEMESİ ZORUNLU ALANLAR #######################
        #
        ## API Entegrasyon Bilgileri - Mağaza paneline giriş yaparak BİLGİ sayfasından alabilirsiniz.
        $merchant_id     = $getMerchant_id;
        $merchant_key     = $getMerchant_key;
        $merchant_salt    = $getMerchant_salt;
        #
        ## Müşterinizin sitenizde kayıtlı veya form vasıtasıyla aldığınız eposta adresi
        $email = $userEmail;
        #
        ## Tahsil edilecek tutar.
        $payment_amount    = $sweepstakePrice * 100; //9.99 için 9.99 * 100 = 999 gönderilmelidir.
        #
        ## Sipariş numarası: Her işlemde benzersiz olmalıdır!! Bu bilgi bildirim sayfanıza yapılacak bildirimde geri gönderilir.
        $merchant_oid = $orderCode;
        #
        ## Müşterinizin sitenizde kayıtlı veya form aracılığıyla aldığınız ad ve soyad bilgisi
        $user_name = $userFullName;
        #
        ## Müşterinizin sitenizde kayıtlı veya form aracılığıyla aldığınız adres bilgisi
        $user_address = "Dijital Ürün";
        #
        ## Müşterinizin sitenizde kayıtlı veya form aracılığıyla aldığınız telefon bilgisi
        $user_phone = $userGSM;
        #
        ## Başarılı ödeme sonrası müşterinizin yönlendirileceği sayfa
        ## !!! Bu sayfa siparişi onaylayacağınız sayfa değildir! Yalnızca müşterinizi bilgilendireceğiniz sayfadır!
        ## !!! Siparişi onaylayacağız sayfa "Bildirim URL" sayfasıdır (Bakınız: 2.ADIM Klasörü).
        $merchant_ok_url = "http://localhost/panel/payment/suc.php";
        #
        ## Ödeme sürecinde beklenmedik bir hata oluşması durumunda müşterinizin yönlendirileceği sayfa
        ## !!! Bu sayfa siparişi iptal edeceğiniz sayfa değildir! Yalnızca müşterinizi bilgilendireceğiniz sayfadır!
        ## !!! Siparişi iptal edeceğiniz sayfa "Bildirim URL" sayfasıdır (Bakınız: 2.ADIM Klasörü).
        $merchant_fail_url = "http://localhost/panel/payment/err.php";
        #
        ## Müşterinin sepet/sipariş içeriği
        $user_basket = base64_encode(json_encode(array(
            array($sweepstakeName, $sweepstakePrice, 1)
        )));
        ############################################################################################
        ## Kullanıcının IP adresi
        if (isset($_SERVER["HTTP_CLIENT_IP"])) {
            $ip = $_SERVER["HTTP_CLIENT_IP"];
        } elseif (isset($_SERVER["HTTP_X_FORWARDED_FOR"])) {
            $ip = $_SERVER["HTTP_X_FORWARDED_FOR"];
        } else {
            $ip = $_SERVER["REMOTE_ADDR"];
        }
        ## !!! Eğer bu örnek kodu sunucuda değil local makinanızda çalıştırıyorsanız
        ## buraya dış ip adresinizi (https://www.whatismyip.com/) yazmalısınız. Aksi halde geçersiz paytr_token hatası alırsınız.
        $user_ip = $ip;
        ##
        ## İşlem zaman aşımı süresi - dakika cinsinden
        $timeout_limit = "30";
        ## Hata mesajlarının ekrana basılması için entegrasyon ve test sürecinde 1 olarak bırakın. Daha sonra 0 yapabilirsiniz.
        $debug_on = 1;
        ## Mağaza canlı modda iken test işlem yapmak için 1 olarak gönderilebilir.
        $test_mode = 0;
        $no_installment    = 0; // Taksit yapılmasını istemiyorsanız, sadece tek çekim sunacaksanız 1 yapın
        ## Sayfada görüntülenecek taksit adedini sınırlamak istiyorsanız uygun şekilde değiştirin.
        ## Sıfır (0) gönderilmesi durumunda yürürlükteki en fazla izin verilen taksit geçerli olur.
        $max_installment = 0;
        $currency = "TL";
        ####### Bu kısımda herhangi bir değişiklik yapmanıza gerek yoktur. #######
        $hash_str = $merchant_id . $user_ip . $merchant_oid . $email . $payment_amount . $user_basket . $no_installment . $max_installment . $currency . $test_mode;
        $paytr_token = base64_encode(hash_hmac('sha256', $hash_str . $merchant_salt, $merchant_key, true));
        $post_vals = array(
            'merchant_id' => $merchant_id,
            'user_ip' => $user_ip,
            'merchant_oid' => $merchant_oid,
            'email' => $email,
            'payment_amount' => $payment_amount,
            'paytr_token' => $paytr_token,
            'user_basket' => $user_basket,
            'debug_on' => $debug_on,
            'no_installment' => $no_installment,
            'max_installment' => $max_installment,
            'user_name' => $user_name,
            'user_address' => $user_address,
            'user_phone' => $user_phone,
            'merchant_ok_url' => $merchant_ok_url,
            'merchant_fail_url' => $merchant_fail_url,
            'timeout_limit' => $timeout_limit,
            'currency' => $currency,
            'test_mode' => $test_mode
        );
        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, "https://www.paytr.com/odeme/api/get-token");
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $post_vals);
        curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 20);
        // XXX: DİKKAT: lokal makinanızda "SSL certificate problem: unable to get local issuer certificate" uyarısı alırsanız eğer
        // aşağıdaki kodu açıp deneyebilirsiniz. ANCAK, güvenlik nedeniyle sunucunuzda (gerçek ortamınızda) bu kodun kapalı kalması çok önemlidir!
        // curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);
        $result = @curl_exec($ch);
        if (curl_errno($ch))
            die("PAYTR IFRAME connection error. err:" . curl_error($ch));
        curl_close($ch);
        $result = json_decode($result, 1);
        if ($result['status'] == 'success')
            $token = $result['token'];
        else
            die("PAYTR IFRAME failed. reason:" . $result['reason']);
        #########################################################################
    ?>
        <!-- Ödeme formunun açılması için gereken HTML kodlar / Başlangıç -->
        <script src="https://www.paytr.com/js/iframeResizer.min.js"></script>
        <iframe src="https://www.paytr.com/odeme/guvenli/<?php echo $token; ?>" id="paytriframe" frameborder="0" scrolling="no" style="width: 100%;"></iframe>
        <script>
            iFrameResize({}, '#paytriframe');
        </script>
        <!-- Ödeme formunun açılması için gereken HTML kodlar / Bitiş -->
    <?php
      
    }else{
    ?>
    
            <?php
            $sweepstakesSQL = $db->prepare("SELECT * FROM `sweepstakes` WHERE id=$getId");
            $sweepstakesSQL->execute();
            $sweepstakes = $sweepstakesSQL->fetchALL(PDO::FETCH_ASSOC);
            foreach ($sweepstakes as $row) {
            ?>
                <div class="container mt-5">
                    <div class="row">
                        <div class="col-md-4">
                            <!-- Profil Resmi -->
                            <div class="mb-3">
                                <img src="assets/products/<?= $row['img'] ?>" class="img-fluid rounded" alt="<?= $row['name'] ?>">
                            </div>
                        </div>
                        <div class="col-md-8 mt-1">
                            <!-- Profil Detayları -->
                            <div class="mb-3">
                                <h1><?= $row['name'] ?></h1>
                            </div>
                            <div class="mb-3">
                                <div>
                                    <?= html_entity_decode($row['info']) ?>
                                    <br><br><b>Çekiliş bitiş tarihi: </b><?= $row['end_date'] ?>
                                </div>
                            </div>
                        </div>
                        <form action="" method="post" class="w-100">
                            <?php
                            // Kullanıcının çekilişe katılıp katılmadığını kontrol ediyoruz
                            $controlSQL = $db->query("SELECT * FROM participants WHERE sweepstake_id = $getId AND user_id = $userId");
                            $controlCount = $controlSQL->rowCount();
                            ?>
                            <button name="joinSweepstake" type="submit" class="btn btn-primary w-100" <?php echo $controlCount === 1 ? 'disabled' : ''; ?>>
                                <?php echo $controlCount === 1 ? 'Çekilişe Katıldınız' : 'Çekilişe Katıl (' . $row['price'] . ' TL)'; ?>
                            </button>
                        </form>
                    </div>
                </div>
            <?php } } ?>
        </div>
        <?php require_once 'includes/footer.php' ?>
    2. ADIM
    <?php
    require_once '../config/database.php';
    // session_start();
    // Mağaza Bilgisi
    $paytr = $db->query("SELECT * FROM paytr");
    $paytr = $paytr->fetch(PDO::FETCH_OBJ);
    $getMerchant_key = $paytr->merchant_key;
    $getMerchant_salt = $paytr->merchant_salt;
    
    ## 2. ADIM için örnek kodlar ##
    ## ÖNEMLİ UYARILAR ##
    ## 1) Bu sayfaya oturum (SESSION) ile veri taşıyamazsınız. Çünkü bu sayfa müşterilerin yönlendirildiği bir sayfa değildir.
    ## 2) Entegrasyonun 1. ADIM'ında gönderdiğniz merchant_oid değeri bu sayfaya POST ile gelir. Bu değeri kullanarak
    ## veri tabanınızdan ilgili siparişi tespit edip onaylamalı veya iptal etmelisiniz.
    ## 3) Aynı sipariş için birden fazla bildirim ulaşabilir (Ağ bağlantı sorunları vb. nedeniyle). Bu nedenle öncelikle
    ## siparişin durumunu veri tabanınızdan kontrol edin, eğer onaylandıysa tekrar işlem yapmayın. Örneği aşağıda bulunmaktadır.
    $post = $_POST;
    
    
    $getCodeSQL = $db->query("SELECT * FROM `users` WHERE orderCode='$orderCode'");
    $getCodeSQL = $getCodeSQL->fetch(PDO::FETCH_OBJ);
    $errMsg = $getCodeSQL->paytr_err_msg;
    ####################### DÜZENLEMESİ ZORUNLU ALANLAR #######################
    #
    ## API Entegrasyon Bilgileri - Mağaza paneline giriş yaparak BİLGİ sayfasından alabilirsiniz.
    $merchant_key   = $getMerchant_key;
    $merchant_salt  = $$getMerchant_salt;
    ###########################################################################
    ####### Bu kısımda herhangi bir değişiklik yapmanıza gerek yoktur. #######
    #
    ## POST değerleri ile hash oluştur.
    $hash = base64_encode(hash_hmac('sha256', $post['merchant_oid'] . $merchant_salt . $post['status'] . $post['total_amount'], $merchant_key, true));
    #
    ## Oluşturulan hash'i, paytr'dan gelen post içindeki hash ile karşılaştır (isteğin paytr'dan geldiğine ve değişmediğine emin olmak için)
    ## Bu işlemi yapmazsanız maddi zarara uğramanız olasıdır.
    if ($hash != $post['hash'])
        die('PAYTR notification failed: bad hash');
    ###########################################################################
    ## BURADA YAPILMASI GEREKENLER
    ## 1) Siparişin durumunu $post['merchant_oid'] değerini kullanarak veri tabanınızdan sorgulayın.
    ## 2) Eğer sipariş zaten daha önceden onaylandıysa veya iptal edildiyse  echo "OK"; exit; yaparak sonlandırın.
    /* Sipariş durum sorgulama örnek
           $durum = SQL
           if($durum == "onay" || $durum == "iptal"){
                echo "OK";
                exit;
            }
         */
    if ($post['status'] == 'success') { ## Ödeme Onaylandı
        // Üyeyi çekilişe ekliyorum
        $join = $db->query("INSERT INTO `participants` (`sweepstake_id`, `user_id`) VALUES ('$getId', '$userId')");
        $count = $join->rowCount();
    } else { ## Ödemeye Onay Verilmedi
    
        $errMsg = $post['failed_reason_msg'];
        $errMsgSQL = $db->query("UPDATE `users` SET `paytr_err_msg`='$errMsg' WHERE orderCode='$orderCode'");
    }
    ## Bildirimin alındığını PayTR sistemine bildir.
    echo "OK";
    exit;
  • 21-08-2023, 00:04:03
    #2
    $post['merchant_oid'], $merchant_salt, $post['status'], $post['total_amount'], $merchant_key bu değerlerden hatalı olanlar olabilir. Kontrol edin.
  • 21-08-2023, 00:05:49
    #3
    efekoca adlı üyeden alıntı: mesajı görüntüle
    $post['merchant_oid'], $merchant_salt, $post['status'], $post['total_amount'], $merchant_key bu değerlerden hatalı olanlar olabilir. Kontrol edin.
    evet hatalıda merchant_oid boş dönüyor nasıl çözecegimi bilmiyorum
  • 21-08-2023, 00:09:38
    #4
    en4loss adlı üyeden alıntı: mesajı görüntüle
    evet hatalıda merchant_oid boş dönüyor nasıl çözecegimi bilmiyorum
    Kodda birden fazla hata görüyorum.
    Mesela 20. satırda

    böyle bir değişken yok.


    merchant_salt'ta iki adet $ kullanılmış.
  • 21-08-2023, 00:10:56
    #5
    $merchant_salt = $getMerchant_salt;

    fazladan dolar işareti var düzeltin
  • 21-08-2023, 00:11:12
    #6
    efekoca adlı üyeden alıntı: mesajı görüntüle
    Kodda birden fazla hata görüyorum.
    Mesela 20. satırda

    böyle bir değişken yok.


    merchant_salt'ta iki adet $ kullanılmış.
    hocam anydesk vereyim siz yaparmısınız
  • 21-08-2023, 00:16:22
    #7
    persius35 adlı üyeden alıntı: mesajı görüntüle
    $merchant_salt = $getMerchant_salt;

    fazladan dolar işareti var düzeltin
    sorun o değil işte düzelttim olmadı
  • 21-08-2023, 00:22:08
    #8
    Çözebildiniz mi hocam geçen bana yazmıştınız ama işim çıkmıştı dönememiştim size
  • 21-08-2023, 08:48:35
    #9
    SauRonn adlı üyeden alıntı: mesajı görüntüle
    Çözebildiniz mi hocam geçen bana yazmıştınız ama işim çıkmıştı dönememiştim size
    yok hocam ya cozulmedi