shetabit / payment

simple laravel payment package , supports multiple drivers
MIT License
840 stars 140 forks source link

خطای کال بک درگاه پارسیان #286

Closed ftf92 closed 1 year ago

ftf92 commented 1 year ago

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

ftf92 commented 1 year ago

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

khanzadimahdi commented 1 year ago

واسه اون اند پونت باید csrf رو غیر فعال کنید چون با متد پست از درگاه برمیگرده.

ftf92 commented 1 year ago

تو این بخش VerifyCsrfToken.php غیرفعال کردم csrf رو ولی خطای 404 برمیگردونه و روت هم به شکل post هم به شکل any تعریف کردم فرقی نکرد ایا ارتباطی به هاست یا خود درگاه پارسیان داره ؟

On Sat, Jul 1, 2023 at 3:18 PM mahdikhanzadi @.***> wrote:

Closed #286 https://github.com/shetabit/payment/issues/286 as completed.

— Reply to this email directly, view it on GitHub https://github.com/shetabit/payment/issues/286#event-9695967465, or unsubscribe https://github.com/notifications/unsubscribe-auth/AOYJZYOCPASHNHYOJUK6NYLXOAFCLANCNFSM6AAAAAAZ2UHNOI . You are receiving this because you authored the thread.Message ID: @.***>

ftf92 commented 1 year ago

سلام متاسفانه من هنوز موفق نشدم خطای 404 رفع کنم کال بک به شکل post ارسال میکنم و میدلور VerifyCsrfToken برای اون روت کال بک غیرفعال کردم ولی وقتی پرداخت انجام میدم یا روی دکمه انصراف از خرید میزنم خطای 404 نمایش میده و توی url زیر میمونه https://adressite.ir/payment/callback

khanzadimahdi commented 1 year ago

ادرسی که دادین رو لطفا با پست من کال کنید ببینید کار میکنه یا نه! و اینکه احتمالا من متوجه مشکل نشدم! به ادرس اشتباهی میره؟ لطفا کاملتر توضیح بدید! خیلی خلاصه نوشتید من دقیقا متوجه نشدم مشکل چیه! به کدوم ادرس باید بره ولی نمیره؟ چه حالتی باید رخ بده که نمیده؟

ftf92 commented 1 year ago

وقتی روی پرداخت میزنم پرداخت انجام میشه و موقع برگشت از درگاه به url که پایین فرستادم هدایت میشم و خطای 404 نمایش میده ( در اخر هم پول پرداختی برگشت داده میشه از درگاه ) یا موقع پرداخت روی دکمه انصراف میزنم به این url توی سایت میره https://playba.ir/payment/callback

روت های من به این شکل تعریف شده

Route::namespace('frontend')->group(function() {
    Route::post('/payment' , [PaymentController::class ,'payment'])->name('cart.payment');
    Route::post('/payment/callback' , [PaymentController::class ,'callback'])->name('payment.callback');
});

این بخش هم غیرفعال شده

protected $except = [
      '/payment/callback'
];

وقتی پرداخت انجام میدم یا دکمه انصراف میزنم باید به صفحه profile کاربر هدایت بشه ولی توی این روت میمونه و خطای 404 نمایش میده https://playba.ir/payment/callback

controller

class PaymentController extends Controller
{
    public function payment()
    {
            $cart = Cart::instance('cart-ftf');
            $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($price);
            $invoice = (new Invoice)->amount(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('/profile');

        } catch (InvalidPaymentException $exception) {
            /**
             * when payment is not verified, it will throw an exception.
             * We can catch the exception to handle invalid payments.
             * getMessage method, returns a suitable message that can be used in user interface.
             **/
            alert()->error($exception->getMessage());
            return redirect('/profile');
        }

    }
}
khanzadimahdi commented 1 year ago

لطفا ‍route('payment.callback') رو توی صفحه echo کنید ببینید چی نشون میده!

ftf92 commented 1 year ago

همین url رو نمایش میده https://playba.ir/payment/callback

ftf92 commented 1 year ago

سلام مهندس من لاراول 10 هم نصب کردم مجدد پکیج shetabit رو لاراول 10 نصب کردم باز همین مشکل داشتم روی لاراول 9 هم نسخه 4 shetabit و هم نسخه اخر نصب کردم باز مشکلم رفع نشد ایا مشکلی توی کدهای controller وجود داره ؟چرا برای روت کال بک وقتی get میزارم میگه باید post باشه وقتی متد پست میزارم بعد از برگشت از بانک خطای 404 دارم و از سایت logout میشم ؟ من csrf رو غیرفعال کردم ولی باز توکن منقضی میشه برای اینکه logout نشه کاربر توی فایل session به شکل زیر تغییر دادم

    'secure' => env('SESSION_SECURE_COOKIE' , true),
'samesite' = 'none', 

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

یه مشکل دیگه هم که هست وقتی پرداخت موفق انجام میدم بانک اصلاحیه میزنه وپول برگشت داده میشه

Sa-arash commented 1 year ago

سلام و عرض ادب من هم وقتی callback اجرا میشه بعد از برگشت اگه متد get باشه ارور The POST method is not supported for route verifyPayment. Supported methods: GET, HEAD. میده و اگرپست باشه و csrf غیر فعال باشه که logout میشه

Sa-arash commented 1 year ago

سلام و عرض ادب من هم وقتی callback اجرا میشه بعد از برگشت اگه متد get باشه ارور The POST method is not supported for route verifyPayment. Supported methods: GET, HEAD. میده و اگرپست باشه و csrf غیر فعال باشه که logout میشه

مشکل وقتی میدل ور ها رو برداشتم از قسمت روت ها درست شد 😊

braveshine1993m commented 9 months ago

بطور کلی می‌تونید با اضافه کردن withoutMiddleware این مشکل رو حل کنید. نمونه کد : Route::post('/callback', [Controller::class, 'callback']) ->name('callback') ->withoutMiddleware([\App\Http\Middleware\VerifyCsrfToken::class]);