سلام وقت بخیر
موقع کال بک از درگاه پارسیان خطای زیر نمایش داده میشه
Symfony \ Component \ HttpKernel \ Exception \ MethodNotAllowedHttpException PHP 8.1.19 9.52.10 The POST method is not supported for route payment/callback. Supported methods: GET, HEAD.
روت ها به شکل زیر تعریف شده
Route::middleware('auth')->namespace('frontend')->group(function() { Route::post('/payment' , [PaymentController::class ,'payment'])->name('cart.payment'); Route::get('/payment/callback' , [PaymentController::class ,'callback'])->name('payment.callback'); });
وقتی روت کال بک به شکل any تعریف میشه یا به شکل post خطای Page Expired دارم ، csrf تعریف شده و راه حل هایی که گفته شد انجام دادم ولی نتیحه ای نگرفتم
توی کنسول خطای 419 نمایش داده میشه
سلام وقت بخیر بخیر دوست عزیز ارروری که دریافت میکنید میگه نمیتونید به این روت به صورت POST درخواست ارسال کنید ساپورت نمیکنه فقط GET | HEAD رو ساپورت میکنه خوب شما روت کال بک رو به صورت GET تعریف کردید بعد به صورت POST بهش درخواست زدین منطقیه که اررور بده حالا یا به صورت GET درخواست بزنید یا کلا روت کال بک رو به POST تغییر بدید اگر به POST تغییر دادید باید توی فرمتون @csrf یا {{ csrf_field() }} رو قرار بدید اگر همچنان اون اررور Page Expired رو داشتید این رو به فایل .ENV اضافه کنید SESSION_DOMAIN= و برابرش بدید با دامینتون حالا هرچی هست و مقدار SESSION_LIFETIME رو هم میتونید افزایش بدید مشکلتون ممکنه حل بشه با این کار ها
@FullStack
ممنونم ازتون ، هیچ کدوم از این روش ها متاسفانه مشکل رو حل نکرد
روت
Route::namespace('frontend')->group(function() {
Route::post('/payment' , [PaymentController::class ,'payment'])->name('cart.payment');
Route::post('/payment/callback' , [PaymentController::class ,'callback'])->name('payment.callback');
});
blade
<div class="text-start">
<form action="{{ route('cart.payment') }}" method="post" id="cart-payment">
@csrf
</form>
<button onclick="document.getElementById('cart-payment').submit()" type="button" class="btn-orange-tour mt-2">پرداخت</button>
</div>
controller
public function payment()
{
$cart = Cart::instance('cart-me');
$cartItems = $cart->all();
if($cartItems->count()) {
$price = $cartItems->sum(function($cart) {
return $cart['tour']->price * $cart['quantity'];
});
$orderItems = $cartItems->mapWithKeys(function($cart) {
return [$cart['tour']->id => [ 'quantity' => $cart['quantity'] ] ];
});
$order = auth()->user()->orders()->create([
'status' => 'unpaid',
'price' => $price
]);
$order->tours()->attach($orderItems);
// $invoice = (new Invoice)->amount((int) $price);
$invoice = (new Invoice)->amount((int) 1000);
return ShetabitPayment::callbackUrl(route('payment.callback'))->purchase($invoice, function($driver, $transactionId) use ($order, $cart,$invoice) {
$order->payments()->create([
'resnumber' => $invoice->getUuid(),
]);
$cart->flush();
})->pay()->render();
}
alert()->error('پرداخت انجام نشد مجددا سعی کنید');
return back();
}
public function callback(Request $request)
{
try {
$payment = Payment::where('resnumber', $request->clientrefid)->firstOrFail();
// $payment->order->price
$receipt = ShetabitPayment::amount(1000)->transactionId($request->clientrefid)->verify();
$payment->update([
'status' => 1
]);
$payment->order()->update([
'status' => 'paid'
]);
alert()->success('پرداخت شما با موفقیت انجام شد');
return redirect( route('profile'));
} catch (InvalidPaymentException $exception) {
alert()->error($exception->getMessage());
return redirect('/profile');
}
}
توی میدلور VerifyCsrfToken هم روت تعریف کردم ولی خطای 404 میده تو این حالت
اگه هم نباشه خطای اکسپایر
هرچی تو نت گفته شد رو انجام دادم ولی نتیجه نگرفتم
از پکیج شتابیت دارم استفاده میکنم
سلام خوبی خطایی که دریافت کردی به خاطر استفاده از متد POST برای مسیر "payment/callback" درخواست شده است. اما بر اساس تعریف روتهات این مسیر تنها از طریق متد GET قابل دسترسه
این مشکل برای خودم هم یش اومده از این دوتا راه استفاده کن:
استفاده از همون متد GET برای درخواست در مسیر "payment/callback":
میتوانی کدهای مربوط به عملیات POST رو به یک مسیر مجزا منتقل کنی و از مسیر "payment/callback" برای عملیات GET استفاده کنی به عنوان مثال:
Route::middleware('auth')->namespace('frontend')->group(function() {
Route::post('/payment', [PaymentController::class, 'payment'])->name('cart.payment');
Route::get('/payment/callback', [PaymentController::class, 'callback'])->name('payment.callback');
// اضافه کردن مسیر جدید برای پردازش عملیات POST
Route::post('/payment/callback', [PaymentController::class, 'processCallback'])->name('payment.process_callback');
});
یا استفاده از متد any برای مسیر "payment/callback":
اینجا میتوانی متد روت "payment/callback" را به صورت "any" تعریف کنی تا درخواستهای POST و GET را به آن مسیر ارسال کنی به عنوان مثال:
Route::middleware('auth')->namespace('frontend')->group(function() {
Route::post('/payment', [PaymentController::class, 'payment'])->name('cart.payment');
// استفاده از متد any برای پردازش درخواستهای POST و GET
Route::any('/payment/callback', [PaymentController::class, 'callback'])->name('payment.callback');
});
در مورد خطای 419 که مربوط به csrf هستش
امید وارم کمکت کرده باشم :)
@Arshiamohammadei
سلام ممنونم از تون
تمام این راه هارو رفتم ولی جواب نگرفتم اصلا
مشکل از کدهای توی متد کال بک نیست ؟
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟