• 28-09-2024, 16:32:38
    #1
    selamlar arkadaşlar şöle bir sorunum var paytr 1. adımı yapıyorum oluyor kredi kartı ile 1. adımda sanal olarak localhosttan ödeme yapıyor ama 2. adımı yapamadım çünkü 2. adımda bir token oluşturuyor ama bu token benim ilk adımda yaattığım tokenle aynı olmadığı için OK verisini alamıyorum bunun nedeni nedir nasıl çözebilirim yardım ederseniz sevinirim projeyi laravelde yapıyorum birtürlü işin içinden çıkamadım yardım lütfen
    Bura 1. adım:
       
    public function Bakiyepost(Request $request,$id){
      
           
    $tutar=Mon::where('id',$id)->first();
    $siparis_no=uniqid();
    $paytr=Paytr::first();
    if ($paytr->active == 1) {
        # code...
    
    if (!$tutar) {
        return back()->withErrors('Geçersiz tutar.');
    }
            ## 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    = $paytr->merchant_id;
                $merchant_key   = $paytr->merchant_key;
                $merchant_salt  = $paytr->merchant_salt;
                #
                ## Müşterinizin sitenizde kayıtlı veya form vasıtasıyla aldığınız eposta adresi
                $email = Auth::user()->email;
                #
                ## Tahsil edilecek tutar.
                $payment_amount =$tutar->coin*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 = $siparis_no;
                #
                ## Müşterinizin sitenizde kayıtlı veya form aracılığıyla aldığınız ad ve soyad bilgisi
                $user_name = Auth::user()->isim;
                #
                ## Müşterinizin sitenizde kayıtlı veya form aracılığıyla aldığınız adres bilgisi
                $user_address ="digital";
                #
                ## Müşterinizin sitenizde kayıtlı veya form aracılığıyla aldığınız telefon bilgisi
                $user_phone = "05549611234";
                #
                ## 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/epin/public/bildirimkart/".$merchant_oid;
                #
                ## Ö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/turizm/public/";
                #
                ## Müşterinin sepet/sipariş içeriği
         $user_basket = base64_encode(json_encode([
                    [$tutar->money, $payment_amount / 100, 1]
                ]));
                #
                /* ÖRNEK $user_basket oluşturma - Ürün adedine göre array'leri çoğaltabilirsiniz
                $user_basket = base64_encode(json_encode(array(
                    array("Örnek ürün 1", "18.00", 1), // 1. ürün (Ürün Ad - Birim Fiyat - Adet )
                    array("Örnek ürün 2", "33.25", 2), // 2. ürün (Ürün Ad - Birim Fiyat - Adet )
                    array("Örnek ürün 3", "45.42", 1)  // 3. ürün (Ürün Ad - Birim Fiyat - Adet )
                )));
                */
                ############################################################################################
                $status = 'pending';
                $total_amount = $payment_amount; // $payment_amount'ı kullan
                ## Kullanıcının IP adresi
                $hashim = base64_encode( hash_hmac('sha256', $merchant_oid.$merchant_salt.$status.$total_amount, $merchant_key, true) );
                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=$request->ip();
                ##
            
                ## İşlem zaman aşımı süresi - dakika cinsinden
                $timeout_limit = "0";
            
                ## 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 = 0; // 1 di degisti
            
                ## 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 ($result === false) {
                    return back()->withErrors('Curl error: ' . curl_error($ch));
                }
    
                if(curl_errno($ch)){
                    die("PAYTR IFRAME connection error. err:".curl_error($ch));
                
                }
                curl_close($ch);
            
                $result=json_decode($result,1);
              
        if (!$result) {
            die("Boş sonuç döndü. Lütfen tekrar deneyin.");
    
        }
               if ($result['status'] == 'success') {
            // Bakiye güncelleme (TL'ye çevirerek)
          
       $order=Order::insert([
    'merchant_oid' => $merchant_oid,
    'status' => $status,
    'total_amount' => $tutar->coin,
    'email' => Auth::user()->email,
    'hash' => $hashim,
       ]);
            $token = $result['token'];
            return view('frontend.bakiye.sonuc')->with('token', $token);
    
        } else {
           
           
           
            return back()->withErrors('PAYTR IFRAME failed. reason: ' . $result['reason']);
        
        
        }    
            
            
    }
    else{
    return back()->with('error','Kapıda ödeme yapılıyor');
    } 
            
            
            
        
                    
            
        
        }
    burasıda 2. adım:

      
    public function Bildirimurl(Request $request) {
        $paytr = Paytr::first();
        $post = $request->all(); // POST verilerini al
        // Siparişi bul
        $order = Order::where('merchant_oid', $post['merchant_oid'])->first();
        // Eğer sipariş bulunamazsa hata döndür
        if (!$order) {
            return response()->json(['error' => 'Order not found'], 404);
        }
        $user_ip = $_SERVER['REMOTE_ADDR'];
        // API Entegrasyon Bilgileri
        
        $merchant_key = $paytr->merchant_key;
        $merchant_salt = $paytr->merchant_salt;
        $hash = base64_encode( hash_hmac('sha256', $order->merchant_oid.$merchant_salt.$order->status.$order->total_amount, $merchant_key, true) );
        // Hash karşılaştır
        dd($order->merchant_oid, $merchant_salt, $order->status, $order->total_amount);
        
        if ($hash != $order->hash) {
            return response()->json(['error' => 'bad hash'], 400);
        }
        // Siparişin durumu kontrol ediliyor
        if ($order->status == "onay" || $order->status == "iptal") {
            return response()->json(['error' => 'order already processed'], 400);
        }
        if ($post['status'] == 'success') {
            // Ödeme Onaylandı
            $order->status = "onay";
        } else {
            // Ödemeye Onay Verilmedi
            $order->status = "iptal";
            $order->failed_reason_code = $post['failed_reason_code'] ?? null; // Varsayılan olarak null kullan
            $order->failed_reason_msg = $post['failed_reason_msg'] ?? null; // Varsayılan olarak null kullan
        }
        $order->save(); // Değişiklikleri kaydet
        // Bildirimin alındığını PayTR sistemine bildir.
        return response()->json(['message' => 'OK'], 200);
    }
  • 28-09-2024, 16:40:49
    #2
    Argümanları bir kontrol et 2 adımda oluştururken aynı verileri veriyorlarmı. bir diğer çözüm olarakta 1. adımda paytr tarafından döndürülen tokeni veritabanında sakla ve 2. adımda aynı tokeni kullanarak paytr ile iletişim kur yani, 2. adımda yeniden token oluşturmak yerine ilk adımda oluşturduğun tokeni doğrula
  • 28-09-2024, 16:42:57
    #3
    Lauren adlı üyeden alıntı: mesajı görüntüle
    Argümanları bir kontrol et 2 adımda oluştururken aynı verileri veriyorlarmı. bir diğer çözüm olarakta 1. adımda paytr tarafından döndürülen tokeni veritabanında sakla ve 2. adımda aynı tokeni kullanarak paytr ile iletişim kur yani, 2. adımda yeniden token oluşturmak yerine ilk adımda oluşturduğun tokeni doğrula
    merhaba şöle yazmışsınız: yani, 2. adımda yeniden token oluşturmak yerine ilk adımda oluşturduğun tokeni doğrula
    peki ben bunu nasıl yapıcam kodlar üzerinde gösterebilirmisiniz?
  • 28-09-2024, 16:46:52
    #4
    order tablona paytr_token diye column oluştur insert yaptığın yere 'paytr_token' => $result['token'] ekle 2. adımdada ;
    $paytr_token = $order->paytr_token;
    if ($paytr_token != $post['token']) {
    return response()->json(['error' => 'Invalid token'], 400);
    }

    bunu ekle ve dene
  • 28-09-2024, 16:53:45
    #5
    Lauren adlı üyeden alıntı: mesajı görüntüle
    order tablona paytr_token diye column oluştur insert yaptığın yere 'paytr_token' => $result['token'] ekle 2. adımdada ;
    $paytr_token = $order->paytr_token;
    if ($paytr_token != $post['token']) {
    return response()->json(['error' => 'Invalid token'], 400);
    }

    bunu ekle ve dene
    olmuyor şöle bir hata alıyorum: {"error":"bad hash"} ayrıca bu attığım kod üstünde yazarsan daha iyi anlaşılcak bu result['token']'den dönen sonuç hiç birşekilde veritabanındaki tokenla uyuşmuyor yani şöle söleyim bildirim kart urlsini postman üzerinde çalıştırıyorum dd ile tokenı yazdırıyorum token farklı çıkıyor yani veritabanındaki tokenla tutmuyor. Ok sonucu alamadım birtürlü neden bildirimkart urlsine post edince postmande farklı token geliyor aynı token gelse veritabanındaki tokenla uyuşcağı için olucak ben işin içinden çıkamadım yani chat gbtye sordum o bile çözemedi
  • 28-09-2024, 16:59:56
    #6
    Lauren adlı üyeden alıntı: mesajı görüntüle
    order tablona paytr_token diye column oluştur insert yaptığın yere 'paytr_token' => $result['token'] ekle 2. adımdada ;
    $paytr_token = $order->paytr_token;
    if ($paytr_token != $post['token']) {
    return response()->json(['error' => 'Invalid token'], 400);
    }

    bunu ekle ve dene
    acaba bildirim kart urlsini route'daki api.php'ye yazmadığım için olurmu ?