• 17-08-2024, 02:50:20
    #1
    Üyeliği durduruldu
    <?php
    session_start();
    echo !defined("ADMIN") ? die(go(ADMIN_URL . 'index.php?sayfa=404')) : null;
    
    ## 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;
    ####################### DÜZENLEMESİ ZORUNLU ALANLAR #######################
    #
    ## API Entegrasyon Bilgileri - Mağaza paneline giriş yaparak BİLGİ sayfasından alabilirsiniz.
    $merchant_key = 'KeyYazılı';
    $merchant_salt = 'SaltYazılı';
    ################################################## #########################
    ####### 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 '.$post['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
    
    $teslimkod = $_SESSION["teslimkod"];
    // Teslim koduna göre işlemi alın
    $islemss = $db->query("SELECT * FROM islem WHERE teslimkod = '$teslimkod'")->fetch(PDO::FETCH_ASSOC);
    $randomKey = $islemss["randomKey"];
    if ($islemss) {
    $durum = $islemss["randomKey"];
    $post['merchant_oid'] = $durum;
    if ($durum == "onay" || $durum == "iptal") {
    echo "OK";
    exit;
    }
    }
    
    if ($post['status'] == 'success') { ## Ödeme Onaylandı
    $update = $db->query("UPDATE islem SET siparisdurum = 1 WHERE randomKey = '$randomKey '");
    ## BURADA YAPILMASI GEREKENLER
    ## 1) Siparişi onaylayın.
    ## 2) Eğer müşterinize mesaj / SMS / e-posta gibi bilgilendirme yapacaksanız bu aşamada yapmalısınız.
    ## 3) 1. ADIM'da gönderilen payment_amount sipariş tutarı taksitli alışveriş yapılması durumunda
    ## değişebilir. Güncel tutarı $post['total_amount'] değerinden alarak muhasebe işlemlerinizde kullanabilirsiniz.
    } else { ## Ödemeye Onay Verilmedi
    ## BURADA YAPILMASI GEREKENLER
    ## 1) Siparişi iptal edin.
    ## 2) Eğer ödemenin onaylanmama sebebini kayıt edecekseniz aşağıdaki değerleri kullanabilirsiniz.
    $failed_reason_code = $post['failed_reason_code'];
    $failed_reason_msg = $post['failed_reason_msg'];
    }
    var_dump($randomKey);
    ## Bildirimin alındığını PayTR sistemine bildir.
    echo "OK";
    exit;
    PAYTR notification failed: bad hash hatası

    Nerede hata var yardımcı olurmusunuz rıca etsem
  • 17-08-2024, 02:57:48
    #2
    Kodunuzu inceledim, birkaç potansiyel hata ve geliştirme alanı tespit ettim. Sorunun ne olduğunu tam olarak anlayabilmem için, yaşadığınız hatanın tam mesajını paylaşabilir misiniz?
    Bu arada, bazı yaygın hata kaynakları ve öneriler:

    1. Oturum Verisi Kullanımı:

    • Uyarıya rağmen $_SESSION["teslimkod"] kullanılıyor. Bu sayfa bir bildirim sayfası olduğu için oturum verisi yerine POST verisi kullanmanız gerekiyor.

    2. Boşluklu Değerler:

    • $randomKey = $islemss["randomKey"]; satırında $randomKey'in sonunda boşluk var: '$randomKey '. Bu, veri tabanındaki eşleştirme işlemlerinde hata yaratabilir.

    3. POST Verisi Kontrolü:

    • if ($hash != $post['hash']) kısmında hash doğrulaması yapılıyor, ancak bu kontrol başarısız olursa program die() ile sonlanıyor. Bu noktada dönen hata mesajı önemli olabilir.

    4. Veri Tabanı Sorguları:

    • $db->query("SELECT * FROM islem WHERE teslimkod = '$teslimkod'") sorgusu doğrudan fetch(PDO::FETCH_ASSOC) ile kullanılıyor. Bu, verilerin varlığı kontrol edilmeden direkt işlenmesi anlamına gelir. Eğer islemss boş dönerse, hatalar olabilir.

    5. Sipariş Durumunun Kontrolü:

    • Sipariş durumu kontrol ediliyor ancak burada siparişin durumunu güncellemeden önce başka güvenlik kontrolleri eklenebilir.

    6. Var Dump Kullanımı:

    • var_dump($randomKey); geliştirme sırasında kullanışlıdır, ancak canlı ortamda bunu kaldırmanız veya loglamaya geçirmeniz daha güvenli olacaktır.
    Sorununuzu daha iyi anlamam için hata mesajını ya da kodun hangi aşamada takıldığını paylaşabilirsiniz.

    ChatGpt'ye sordum böyle cevap verdi
  • 17-08-2024, 03:07:40
    #3
    Üyeliği durduruldu
    <?php
    session_start();
    echo !defined("ADMIN") ? die(go(ADMIN_URL . 'index.php?sayfa=404')) : null;
    
    $teslimSQL = $db->query("SELECT * FROM islem")->fetch(PDO::FETCH_ASSOC);
    $teslimkod = $teslimSQL["teslimkod"];
    // Teslim koduna göre işlemi alın
    $islemss = $db->query("SELECT * FROM islem WHERE teslimkod = '$teslimkod'")->fetch(PDO::FETCH_ASSOC);
    
    ## 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;
    ####################### DÜZENLEMESİ ZORUNLU ALANLAR #######################
    #
    ## API Entegrasyon Bilgileri - Mağaza paneline giriş yaparak BİLGİ sayfasından alabilirsiniz.
    $merchant_key = '"'; ekli burası
    $merchant_salt = '"'; ekli burası 
    ###########################################################################
    ####### 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' . $post['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
    $randomKey = $islemss["randomKey"];
    $durum = $islemss["randomKey"];
    $post['merchant_oid'] = $durum;
    if ($durum == "onay" || $durum == "iptal") {
        echo "OK";
        exit;
    }
    
    
    if ($post['status'] == 'success') { ## Ödeme Onaylandı
        $update = $db->query("UPDATE islem SET siparisdurum = 1 WHERE randomKey = '$randomKey'");
        ## BURADA YAPILMASI GEREKENLER
        ## 1) Siparişi onaylayın.
        ## 2) Eğer müşterinize mesaj / SMS / e-posta gibi bilgilendirme yapacaksanız bu aşamada yapmalısınız.
        ## 3) 1. ADIM'da gönderilen payment_amount sipariş tutarı taksitli alışveriş yapılması durumunda
        ## değişebilir. Güncel tutarı $post['total_amount'] değerinden alarak muhasebe işlemlerinizde kullanabilirsiniz.
    } else { ## Ödemeye Onay Verilmedi
        ## BURADA YAPILMASI GEREKENLER
        ## 1) Siparişi iptal edin.
        ## 2) Eğer ödemenin onaylanmama sebebini kayıt edecekseniz aşağıdaki değerleri kullanabilirsiniz.
        $failed_reason_code = $post['failed_reason_code'];
        $failed_reason_msg = $post['failed_reason_msg'];
    }
    ## Bildirimin alındığını PayTR sistemine bildir.
    echo "OK";
    exit;
    düzenledim gine aynı
  • 17-08-2024, 04:08:00
    #4
    Bütün verileri bir session kullanmadan posttan gelen customer id ve merchant_oid'den çekmelisiniz. İlk bahsettiğim müşteri id'sini tutarken ikinci bahsettiğim muhtemelen sizin kodunuzdaki randomkey yani sipariş numarasını temsil ediyor. Dilerseniz ücretli olarak da düzenleyip 1-2 saate teslim edebiliriz.
  • 17-08-2024, 04:17:15
    #5
    Üyeliği durduruldu
    Proje bana ait değil bende arakadaşa yardım ediyorum eyer detaylı bir şekilde anlatırsanız yaparım ben.