Paradox
1 سال پیش توسط Paradox مطرح شد
4 پاسخ

خطا درگاه

سلام وقت بخیر
موقع کال بک از درگاه پارسیان خطای زیر نمایش داده میشه

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 نمایش داده میشه


ثبت پرسش جدید
میکائیل
تخصص : برنامه نویسی سمت سرور و کلاینت
@FullStack 1 سال پیش آپدیت شد
1

سلام وقت بخیر بخیر دوست عزیز ارروری که دریافت میکنید میگه نمیتونید به این روت به صورت POST درخواست ارسال کنید ساپورت نمیکنه فقط GET | HEAD رو ساپورت میکنه خوب شما روت کال بک رو به صورت GET تعریف کردید بعد به صورت POST بهش درخواست زدین منطقیه که اررور بده حالا یا به صورت GET درخواست بزنید یا کلا روت کال بک رو به POST تغییر بدید اگر به POST تغییر دادید باید توی فرمتون @csrf یا {{ csrf_field() }} رو قرار بدید اگر همچنان اون اررور Page Expired رو داشتید این رو به فایل .ENV اضافه کنید SESSION_DOMAIN= و برابرش بدید با دامینتون حالا هرچی هست و مقدار SESSION_LIFETIME رو هم میتونید افزایش بدید مشکلتون ممکنه حل بشه با این کار ها


Paradox
تخصص : در حال یادگیری
@paradox 1 سال پیش مطرح شد
0

@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 میده تو این حالت
اگه هم نباشه خطای اکسپایر

هرچی تو نت گفته شد رو انجام دادم ولی نتیجه نگرفتم
از پکیج شتابیت دارم استفاده میکنم


Arshiamohammadei
تخصص : وب و هوش مصنوعی
@Arshiamohammadei 1 سال پیش مطرح شد
0

سلام خوبی خطایی که دریافت کردی به خاطر استفاده از متد 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 هستش

امید وارم کمکت کرده باشم :)


Paradox
تخصص : در حال یادگیری
@paradox 1 سال پیش مطرح شد
0

@Arshiamohammadei
سلام ممنونم از تون
تمام این راه هارو رفتم ولی جواب نگرفتم اصلا

مشکل از کدهای توی متد کال بک نیست ؟


برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام