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);
}