koti42 Ben Garanti Bankasında kullanmıştım. Bankaya POST gönderirken dönüş URL'ini biz gönderiyorduk.
public function store(StoreCreditCardPaymentRequest $request, Invoice $invoice): mixed
{
$validated = $request->validated();
$token = $this->generateUniqueToken();
$isTokenExists = PaymentToken::where('user_id', $request->user()->id)->first();
$isTokenExists?->delete();
$paymentToken = PaymentToken::create([
'token' => $token,
'user_id' => $request->user()->id,
'expired_at' => now()->addMinutes(5),
]);
// Bankaya göndereceğim token değerini Crypt'ten geçiriyorum
$cryptToken = Crypt::encryptString($paymentToken->token);
.
.
.
// diğer işlemler...
/**
* Bankadan gelen cevabı alıyor ve işliyoruz.
*/
public function result(Request $request, string $token): mixed
{
try {
$deCryptToken = Crypt::decryptString($token);
} catch (DecryptException $e) {
// Burada log da tutuyorum, kodu uzatmamak için aktarmadım
abort(Response::HTTP_NOT_FOUND);
}
$paymentToken = PaymentToken::query()
->with('user')
->where('token', $deCryptToken)
->first();
if (! $paymentToken || ($paymentToken->expired_at < now())) {
abort(Response::HTTP_NOT_FOUND);
}
// Banka POST dönünce bu noktada oturumum düştüğü için
// Tekrar login yaptırıyorum ardından tokeni siliyorum
Auth::login($paymentToken->user);
$paymentToken->delete();
.
.
.
//diğer işlemler...
private function generateUniqueToken(): string
{
do {
$token = str()->random(32);
$tokenExists = PaymentToken::where('token', $token)->exists();
} while ($tokenExists);
return $token;
}