Php ile Paytr Api Sanal Pos

 

Php ile Paytr sanal pos entegresine ihtiyacım olmuştu.Gereken kodları aşağıda paylaştım.Siz kendinize göre uyarlayabilirsiniz.Gereken parametreler paytr’e yollanır size iframe içinde ödeme ekranı açar.Paytr ayarlarında bir 1 tane bildirim_url sayfası oluşturuyorsunuz..

o sayfada sipariş onayı veya iptal işlemi yapılıyor.Gelen post değerleri ile bir hash oluşuyor ve posttan gelen hash değeri eşitse değil ise bad hash hatası geliyor.Eşitse işlem devam ediyor db sorguları yapılıyor.Başarılı ise belirtlilen odeme_basarili.php sayfasına yada odeme_basarisiz sayfasına gidiyor.Bildirim url sayfasında pdo kütüphanesini kullandım.


$oid = rand(1,99999);
$merchant_id 	 = 'merhcantid';
$merchant_key 	 = 'merchant key';
$merchant_salt	 = 'saltkey';
$email 		 = 'email';
$payment_amount	 = '999'; //9.99 için 9.99 * 100 = 999 gönderilmelidir.
$merchant_oid    =  $oid; // her istek için farklı id
$user_name 	 = 'adres satırı';	
$user_address    = 'adres'; 	
$user_phone 	 = 'telefon';	
$merchant_ok_url   = 'odeme_basarili.php'; // odeme başarılı ise 
$merchant_fail_url = 'odeme_basarisiz.php'';  // odeme başarısız ise dönecek sayfa


$user_basket = base64_encode(json_encode(array(
		array('ürün adı' , '9.90', '3'), // 1. ürün (Ürün Ad - Birim Fiyat - Adet ) // birden çok ürün içi dizi olucak.
	)));

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 	 = 1; // debug modu
$test_mode 	 = 0; // test modu için 1
$no_installment	 = 0;	// taksit yok ise 0
$max_installment = 0;  // max taksit sayısı




$currency 	 = 'TL'; // Para türü Euro için EUR
$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)); // Token oluşuyor


$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']);
	#########################################################################	

Aşağıda size iframe yapısı geliyor renk tonlarını paytr giriş yaparak değiştirilebiliyor.

<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ş -->

Bildirim Url için paytr gereken açıklamaları yapmış zaten.


## 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 	= 'key';

	$merchant_salt	= '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.

	$sql = $conn -> query("select * from siparis where merchant_oid = ".$post['merchant_oid']." ")->fetch();

	if($sql){

		echo "OK";

	}

	/* Sipariş durum sorgulama örnek

 	   $durum = SQL

	   if($durum == "onay" || $durum == "iptal"){

			echo "OK";

			exit;

		}

	 */

	 

	 



	if( $post['status'] == 'success' ) { ## Ödeme Onaylandı



		$guncelle = $conn -> prepare("update siparis set status = ?, total_amount = ?, durum = ?, anadurum = ? where id = ?");

		$xx 	  = $guncelle -> execute(array($post['status'],$post['total_amount'],0,1,$sql['id']));

		

		## 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.

		## $post['failed_reason_code'] - başarısız hata kodu

		## $post['failed_reason_msg'] - başarısız hata mesajı



	}



	## Bildirimin alındığını PayTR sistemine bildir.

Yorum Bırak.