hard5150 Ben ne yapmaya çalıştığınızı anlamakta zorlanıyorum. Blade şablonu içinde (ya da rota dosyaları dışında herhangi bir yerde) bir controller yöntemi çağırmak zaten yanlış, yazdığınız kod geçerli bir PHP kodu da değil ama işin en garip tarafı PaytrController::checkouts() yöntemi quedecato.front.checkout şablonunu render ediyor. Siz render edilen şablon içinde yine şablonu render eden yöntemi çağırmaya çalışıyorsunuz.
Madem iframe kullanacaksınız
namespace App\Http\Controllers;
use Illuminate\Support\Facades\App;
use Illuminate\Support\Facades\Http;
class PaytrController extends Controller
{
public function show(Request $request)
{
$merchantId = '';
$merchantKey = '';
$merchantSalt = '';
$email = '';
$paymentAmount = '';
$merchantOid = '';
$userName = $request->user()->fname.' '.$request->user()->lname;
$userAddress = $request->user()->address;
$userPhone = $request->user()->mobile;
$merchantOkUrl = route('success');
$merchantFailUrl = route('fail');
$userBasket = '';
$timeoutLimit = '30';
$debugOn = 1;
$testMode = 0;
$noInstallment = 0;
$maxInstallment = 0;
$currency = 'USD';
$userIp = $request->ip();
$hashStr = $merchantId . $userIp . $merchantOid . $email . $paymentAmount . $userBasket
. $noInstallment . $maxInstallment . $currency . $testMode;
$paytrToken = base64_encode(hash_hmac('sha256', $hashStr . $merchantSalt, $merchantKey, true));
$response = Http::timeout(20)
->withOptions([
'verify' => App::environment('production'), // Sertifikayı sadece prod ortamda onayla
'allow_redirects' => true,
'curl' => [
CURLOPT_FRESH_CONNECT => true,
],
])->post('https://www.paytr.com/odeme/api/get-token', [
'merchant_id' => $merchantId,
'user_ip' => $userIp,
'merchant_oid' => $merchantOid,
'email' => $email,
'payment_amount' => $paymentAmount,
'paytr_token' => $paytrToken,
'user_basket' => $userBasket,
'debug_on' => $debugOn,
'no_installment' => $noInstallment,
'max_installment' => $maxInstallment,
'user_name' => $userName,
'user_address' => $userAddress,
'user_phone' => $userPhone,
'merchant_ok_url' => $merchantOkUrl,
'merchant_fail_url' => $merchantFailUrl,
'timeout_limit' => $timeoutLimit,
'currency' => $currency,
'test_mode' => $testMode,
])->throw(function (Response $response, RequestException $e) {
// PayTR adresine istek attığınız ama HTTP hatası meydana geldi.
// Hata mesajı ile geri gidiyoruz.
return back()->withErrors($e->getMessage());
});
// PayTR başarıyla istek attınız ve size yanıt verdi.Gelen yanıt başarılı ise
// iframe için gerekli token'ı alıp iframe açacak şablona yönlendiriyoruz.
if($response->json('status') === 'success') {
return view('quedecato.front.checkout', [
'iframeSrc' => sprintf('https://www.paytr.com/odeme/guvenli/%s', $response->json('token')),
]);
}
// PayTR başarıyla istek attınız ve size yanıt verdi ama hata meydana geldi.
// Hata mesajı ile geri gidiyoruz.
return back()->withErrors($response->json('reason'));
}
}
quedecato.front.checkout şablonunda ise
<!DOCTYPE html>
<html lang="tr">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>PayTR Ödeme Sayfası</title>
<script src="https://www.paytr.com/js/iframeResizer.min.js"></script>
</head>
<body>
<iframe src="{{ $iframeSrc }}" id="paytriframe" frameborder="0"scrolling="no" style="width: 100%;"></iframe>
<script>iFrameResize({}, '#paytriframe');</script>
</body>
</html>
Buradaki dokümanlara göre yazdım, test etme şansım yok. Mantığını anlamaya çalışın, kopyala yapıştır yapmayın.
https://dev.paytr.com/iframe-api/iframe-api-1-adim