TALHA KESKİN

Web Developer / UI Designer / Graphic & Web Designer

Kartal - İSTANBUL

Hoşgeldiniz. PHP, CSS, Javascript, jQuery, Bootstrap, PSD TO CSS, C#, .NET, Ajax, MsSQL, MySQL İşlerinizi yapabilirim.

Sosyal Profillerim
  • Yazı Detayı

PHP – Paytr Entegrasyon Yapımı

Bu Yazı PHP İçin Yazılmıştır.

Bu yazımda sizlere Türkiye’de hazır ödeme sistemlerinden en çok aranan ödeme yöntemlerinden birisi olan Pay-TR entegrasyonunun nasıl yapıldığına dair bilgi vermek istedim. PHP – Paytr Entegrasyon Yapımı konusunda bilgi arıyorsanız bu yazıyı sonuna kadar okuyarak biraz yazılım bilgisi ile kolay bir şekilde halledebilirsiniz.

Daha önce İyzico Entegresini Şu Konuda anlatmıştım

Pay-TR’de iyzico gibi. Bizi tek tek bankaların sanal poslarının kodlarından kurtarıyor. Yani tek entegrasyonda tüm bankaların sistemlerini entegre etmiş oluyoruz. (Ha burada komisyon daha fazlamı az mı bilmiyorum.)

Öncelikle Pay-TR’nin dökümanını Pay-TR’nin bize vermiş olduğu kullanıcı bilgileri ile Pay-TR panelinegirerek indirmemiz gerekiyor.

Paytr entegrasyonu için ne gerekli ?

  1. merchant id (xxxx benzeri rakamlardan oluşur)
  2. merchant key (xxxxxX123 benzeri rakamlar ve harflerden oluşur)
  3. merchant salt key (xxxxxX123 benzeri rakamlar ve harflerden oluşur)

Yukarıda yazdığım keyleri ve id’i temin ettiysek artık entegasyonun nasıl yapılacağına geçelim.

Anlatımlarım 3 farklı kod sayfasından oluşacak. Bunlar ;

  1. Ödeme Classı
  2. Ödeme Sayfası
  3. Ödeme Sonuç Sayfası (kullanıcılara Görünen)
  4. Pay-TR Bildirim Sayfası (kullanıcılara görünmeden arkaplanda çalışan)

Şimdi öncelikle odeme.php isimli bir class dosyası hazırlayalım.

<?php
Class Odeme
{
    public $merchant_id = '133917';
    public $merchant_key = 'qncyNjgT3bTF1w54';
    public $merchant_salt= 'doJ57w7CmoWUkpZa';
 
  

    function siparisEkle()
    {

    }

  
   function formGetir($mail,$siparisid,$adsoyad,$adres,$telefon,$siparisler=array(),$fiyat)
    {
       -
    }

    function paytrSonuc()
    {
        
    }


}

Yukarıda ödeme.php isimli ödeme classımızı oluşturduk. Bu classın başına en başta edindiğimiz keyleri ve id’yi ekledik.

1. Paytr PHP Entegrasyonu – Siparişi Ekleme

Pay-TR’nin ödeme formunu size getirebilmesi için bazı bilgilere ihtiyacı vardır. Bu nedenle öncelikli olarak siparişimizi veritabanına kaydedip durumunu pasif olarak ayarlamamız gerekiyor. Aynı zamanda veritabanına kaydettikten sonra yukarıdaki classımızda formgetir fonksiyonunun ihtiyacı olan parametreleri ödemeyi ekledikten sonra almamız gerekecek. PHP – Pay-TR Entegrasyon Yapımı konusunda detaylar devam etmektedir.

function siparisEkle()
{

        global $db;
        $dondur = array();
        $siparisler = array();
        $uyeID = $_SESSION["KullaniciID"];
        

        $fiyat =$_POST["Fiyat"];
     
  
        $siparisID = $db->veriEkleSayiAl
        (
                "siparisler",
                       array("NULL","?","?","?","?","?","?","?"),
                       array(
                            $_POST["Gonderen"],
                            $_POST["GonderenMAIL"],
                            $_POST["GonderenTELEFON"],
                            $_POST["FaturaADRESI"],
                            $fiyat,
                            $uyeID,
                            0)

        );
       
       $siparisler[]=array("Ürün İsmi",fiyat,1);
      
        

        $dondur[]=$_POST["GonderenMAIL"];
        $dondur[]=$siparisID;
        $dondur[]=$_POST["Gonderen"];
        $dondur[]=$_POST["FaturaADRESI"];
        $dondur[]=$_POST["GonderenTELEFON"];
        $dondur[]=$siparisler;
        $dondur[]=$fiyat;
        return $dondur;
}

Yukarıdaki gibi classımızdaki siparisEkle fonksiyonunu güncelliyoruz. Yukarıdaki kodlarımızda ne yaptığımızı açıklayalım. İşlem yapan kullanıcı sitemize üye ise sessiondan gelen kullanıcı id’sini UyeID olarak aldık. Siparişimizin tutarını fiyat olarak aldık. Kullanıcının isminin ve diğer bilgilerinin bir formdan POST olarak geldiğini var sayarak onları aldık. Daha sonra aldığımız tüm bilgileri veritabanımızdaki siparisler tablomuza ekledik. Daha sonra bu bilgileri sonraki fonksiyonumuz olan formGetir fonksiyonumuzda kullanılmak üzere return ettik (döndürdük.)

Bir sonraki aşamada PHP – Paytr Entegrasyon Yapımı konusunun ödeme sayfasını hazırlamalıyız.

2. Paytr PHP Entegrasyonu – Odeme Sayfasını Hazırlama

Şimdi projemize odemesayfasi.php isimli bir dosya ekliyoruz. Bu dosyaya classımızı dahil ediyoruz. Bu kodları herhangi HTML kodlarının arasına koyabilirsiniz.

 <?php
 include "class/odeme/odeme.php";
 $odeme = new Odeme();
 $siparis = $odeme->siparisEkle ();
 ?>

Yukarıda odemesayfasi.php dosyamıza classımızı dahil ettik ve classın içindeki siparisEkle fonksiyonunu çalıştırdık. Şimdi Pay-TR’nin formunu getirmek için formGetir fonksiyonunu çağırabiliriz

<?php                                                                    echo $odeme->formGetir ($siparis[0],$siparis[1],$siparis[2],$siparis[3],$siparis[4],$siparis[5],$siparis[6]);                                                                              ?>

Classımızdaki siparisEkle fonksiyonundan dönen parametreleri formGetir fonksiyonuna gönderdik. Şimdi classın içindeki formGetir fonksiyonunu güncelleyelim ki form odemesayfasi.php’ye düzgün şekilde gelsin.

3. Paytr PHP Entegrasyonu – Ödeme Formunu Getirme

 function formGetir($mail,$siparisid,$adsoyad,$adres,$telefon,$siparisler=array(),$fiyat)
    {
        $siteURL ="siteismi.com";
        $merchant_id = $this->merchant_id;
        $merchant_key = $this->merchant_key;
        $merchant_salt= $this->merchant_salt;
        $email =  $mail;
        $payment_amount= $fiyat * 100;
        $merchant_oid = $siparisid;
        $user_name = $adsoyad;
        $user_address = $adres;
        $user_phone = $telefon;
        $merchant_ok_url = $siteURL."/siparissonucu.php?siparisid=$siparisid&durum=ok";
        $merchant_fail_url =  $siteURL."/siparissonucu.php?siparisid=$siparisid&durum=fail";
        $user_basket = base64_encode(json_encode($siparisler));
        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"];
        }
        $user_ip=$ip;
        $timeout_limit = "30";
        $debug_on = 0;
        $test_mode = 0;
        
        $no_installment= 0;
        $max_installment = 0;

        $currency = "TL";
        $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_SSL_VERIFYPEER, 0);
        curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);
        curl_setopt($ch, CURLOPT_FRESH_CONNECT, true);
        curl_setopt($ch, CURLOPT_TIMEOUT, 20);
        $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']);
        ?>
        <script src="https://www.paytr.com/js/iframeResizer.min.js"></script> <iframe src="https://www.paytr.com/odeme/guvenli/<?=$token?>" id="paytriframe" frameborder="0" scrolling="no" style="width: 100%;"></iframe> <script>iFrameResize({},'#paytriframe');</script> <?php }

Pay-TR getirmek için parametrelerimizi başarılı bir şekilde kullandık. Şimdi kullanıcı ödemeyi yaptıktan sonra gideceği sayfa olan siparissonucu.php sayfasını hazırlayalım

4. Paytr PHP Entegrasyonu – Ödeme Sonucunu Kullanıcılara Gösterme

Hemen belirtmek isterim ki bu sayfa siparişin onaylandığı sayfa değildir. Bu sayfa kullanıcıya önden bilgilendirme yapılan sayfadır.

 <?php
                            include "class/odeme/odeme.php";
                            $odeme = new Odeme();
                            if($_GET["durum"]=="ok")
                            {
                                $db->Basarili ("Ödemeniz alınmıştır. Kontrol edildikten sonra sipariş aşamaları başlayacaktır. Siparişinizi <span style='color:red;'><strong>$_GET[siparisid]</strong></span> numarasını yazarak takip edebilirsiniz.");
                             

                            }elseif($_GET["durum"]=="fail")
                            {
                                $db->Basarisiz ("Ödemeniz alınırken bir sorun oluştu. Lütfen daha sonra tekrar deneyiniz");
                            }
                            ?>

5. Paytr PHP Entegrasyonu – Pay-TR Bildirim Sayfasını Yapma

İşte bu sayfa bizin asıl sonuç sayfamız olarak Pay-TR’nin döndüğü sayfamız. Bunu kullanıcılar görmeyecek. odemesonucu.php dosyasını yapıyoruz ve classımızı dahil ederek sonuç fonksiyonunu çalıştırıyoruz. Herhangi HTML kodunun olmaması gerekmektedir.

<?php
include "class/odeme/odeme.php";
$odeme = new Odeme();
$odeme->paytrSonuc ();
?>

Şimdi ödeme classımızdaki paytrSonuc fonksiyonumuzu güncelliyoruz

 function paytrSonuc()
    {
        global $db;
        global $sistem;
        $post = $_POST;
        $siparisID =$post['merchant_oid'];
        $merchant_key = $this->merchant_key;
        $merchant_salt= $this->merchant_salt;
        $hash = base64_encode( hash_hmac('sha256', $post['merchant_oid'].$merchant_salt.$post['status'].$post['total_amount'], $merchant_key, true) );
        if( $hash != $post['hash'] )
            die('PAYTR notification failed: bad hash');
        if($post['status'] == 'success' )
        {
            $db->veriGuncelle ("siparisler",array("Durum"),array(1,$siparisID),"SiparisID");
          

        }else
        {

            ## $post['failed_reason_code'] - başarısız hata kodu
            ## $post['failed_reason_msg'] - başarısız hata mesajı
            $db->veriEkle ("odemehatalari",array("NULL","?"),array($post['merchant_oid']." - ".$post['failed_reason_code']." - ".$post['failed_reason_msg']));
        }
        echo "OK";
        exit;
    }

Paytr bize siparişid numaramızı tekrar merchant_oid olarak gönderdi. Ve bizde bunu kullanarak siparişin durumunu güncelledik. Eğer Pay-TR Bize hata döndü ise failed_reason_code – failed_reason_msg parametreleri ile daha sonra ne hatası döndürdüğünü veritabanımıza işledik.


Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

*

*

*