مهدی
3 سال پیش توسط مهدی مطرح شد
14 پاسخ

خطا زمان برگشت از درگاه سامان در شتابیت

@khanzadimahdi
با سلام.هنگام برگشت از درگاه بانک سامان به ارور زیر برخورد میکنم
The POST method is not supported for this route. Supported methods: GET, HEAD.
اینم از روت من

route::get('/payment-confirmation','back\BillController@payment_confirmation')->name('admin.bill.payment_confirmation');

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

@mkt
با سلام
پس از چند روز درگیری با این مسئله و تماس با پشتیبانی فنی درگاه سامان بالاخره مشکلم حل شد.
در ابتدا برای رفتن به درگاه باید از کد زیر استفاده کرد

<?php

//if you want can make a transaction in database here

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://sep.shaparak.ir/OnlinePG/OnlinePG',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'{
    "action":"token",
    "TerminalId":"12345678",
    "RedirectUrl":"path-to-redirect",
    "ResNum":'. $transaction->id .',
    "Amount": '. $bill->price.',
    "CellNumber":""
}',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'Cookie: ASP.NET_SessionId=ryqbqari5jhl1fxyjut1i03y; TS017ebf2e=0112d175351a236dcb89c7fb70090c52d1846fa62cc0c6f2278cc3b68ae0edae68e913754f1e5363fb0df2246bba75b099babc1750daf2a2228692ccf7a114ea92ebf20c12'
  ),
));

$response = curl_exec($curl);

$response = json_decode($response);
curl_close($curl);

if (isset($response->token)) { 
                            echo "<form action='https://sep.shaparak.ir/OnlinePG/OnlinePG' method='post' id='SendParameter'>"
                            . "<input type='hidden' name='Token' value='" . $response->token . "'/>"
                            ."<input name='GetMethod' type='hidden' value='True'></form>"
                            . "<script type=\"text/javascript\">function send_to_saman(){document.getElementById('SendParameter').submit();}</script>";
                    }
?>

و در قسمتی از کد که میخواهید میتوانید یک دکمه با رویداد sendtosaman()=onclick ایجاد کنید که با فشردن این دکمه به درگاه هدایت شوید.برای برگشت از درگاه هم یک route مثل روت زیر و با متد get تغریف کنید.

route::prefix('admin/bills')->group(function(){
  route::get('/saman-payment-confirmation','back\BillController@saman_payment_confirmation')->name('admin.bill.saman_payment_confirmation'); 
});

و در انتها نیز با کد زیر در کنترلر میتوانید تراکنش را verify کنید.

   public function saman_payment_confirmation()
    {
       if (isset($_GET['RefNum'])) {
            $RefNum = $_GET['RefNum'];
        } else {
            echo "this is not ok";
        }
        if (isset($_GET['ResNum'])) {
            $ResNum = $_GET['ResNum'];
        }
        if (isset($_POST['State'])) {
            $State = $_POST['State'];
        }
        if (isset($_GET['TerminalId'])) {
            $TermId = $_GET['TerminalId'];
        }

        $curl = curl_init();

        curl_setopt_array($curl, array(
          CURLOPT_URL => "https://sep.shaparak.ir/verifyTxnRandomSessionkey/ipg/VerifyTranscation",
          CURLOPT_RETURNTRANSFER => true,
          CURLOPT_ENCODING => "",
          CURLOPT_MAXREDIRS => 10,
          CURLOPT_TIMEOUT => 30,
          CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
          CURLOPT_CUSTOMREQUEST => "POST",
          CURLOPT_POSTFIELDS => "{\n  \"TerminalNumber\": \"".$TermId."\",\n  \"RefNum\": \"".$RefNum."\",\n  \"CellNumber\":\"\",\n  \"NationalCode\" : \"\",\n  \"IgnoreNationalcode\" : true\n}\n\n",
          CURLOPT_HTTPHEADER => array(
            "cache-control: no-cache",
            "content-type: application/json"
          ),
        ));

        $response = curl_exec($curl);
        $err = curl_error($curl);

        curl_close($curl);
        $Result = json_decode($response);
        if ($err) {
            echo "cURL Error #:" . $err;

        } else {
            if ($Result->ResultCode==0) {
                echo "Your Transaction is VERIFIED".$ResNum;
                }

        } else {
            echo 'Your Transaction not ok';
        }
        }

    }

سبحان مولایی
تخصص : برنامه‌نویس وب: Python ::...
@websaz 3 سال پیش مطرح شد
0

سلام می گوید در این route متد post ساپورت نمی شود. پس کدهای خودتون رو به این شکل تبدیل کنید.

route::post('/payment-confirmation','back\BillController@payment_confirmation')->name('admin.bill.payment_confirmation');

مهدی
تخصص : برنامه نویس
@mahdiam200 3 سال پیش آپدیت شد
0

@websaz
این رو هم امتحان کردم خطای ۴۱۹ میده و از حالت لاگین خارج میشه


mkt
@mkt 3 سال پیش مطرح شد
-2

درود
@mahdiam200
من همین مشکل را با همین پکیج داشتم با همین ارور بعد از نام روت / قرار بدید .

route::get('/payment-confirmation/','back\BillController@payment_confirmation')->name('admin.bill.payment_confirmation');

ارور من رفع شد بماند که این پکیج برای من توی وریفای خطا داد ولی با این کار خطای تایپ رفع شد .


محمدرضا قمی اویلی
تخصص : لاراول
@ghomi 3 سال پیش آپدیت شد
2

سلام
اول از همه اینکه متد post درسته و به شکل زیر عمل کن

route::post('/payment-confirmation','back\BillController@payment_confirmation')->name('admin.bill.payment_confirmation');

مشکل بعدی که پیش اومد ارور 419 هستش که مربوط میشه به توکن که به درستی هم داره ارور ایجاد میشه
حالا باید چطور این ارور رفع بشه باید بیای به آدرس App\Http\Middleware
و فایل VerifyCsrfToken به این شکل عمل کنی

    protected $except = [
        'payment-confirmation',
    ];

دلیل خطا 419 هم اینه که مرورگر شما نیست که داره این درخواست ارسال میکنه بلکه توسط درگاه بانک درخواست ارسال میشه بنابر این هیچ توکنی وجود نداره که نشون دهنده این باشه که کدوم کاربر داره پرداخت انجام میده.


mahdi khanzadi
تخصص : Software engineer
@khanzadimahdi 3 سال پیش مطرح شد
2

روت خودتون رو به جای post روی any قرار بدید. و csrf رو هم روی روت وریفای غیر فعال کنید (که دوستمون توضیح دادن روندش چگونه هست)


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

@ghomi @khanzadimahdi
من روت روی any گذاشتم و csrf هم غیر فعال کردم منتها هنوز بعد از تکمیل پرداخت از حالت لاگین خارج میشه و پرداخت ثبت نمیشه


mkt
@mkt 3 سال پیش آپدیت شد
0

درود
@mahdiam200
من هم روش های بالا را تست کردم جواب نداد .

اگه توی کانفیگ پکیج شتابیت انتهای callbackUrl یک اسلش قرار بدید دیگه خطای

 The POST method is not supported for this route. Supported methods: GET, HEAD.

را نمیده و از سیستم خارج نمیشه .

 'callbackUrl' => 'https://app.karamadleasing.com/dashboard/verify_payment/',

ولی همچنان خطای :

خطای ناشناخته رخ داده است.

روبرو میشم .

اگه به جواب رسیدید لطفا بیان کنید ممنونم


محمدرضا قمی اویلی
تخصص : لاراول
@ghomi 3 سال پیش آپدیت شد
1

نیاز به any گذاشتن نیست زمانی از any استفاده میکنیم که بخواییم از چندین درگاه بانک در سایت استفاده کنیم و هر کدام درخواست ارسالی متفاوتی داشته باشند یکی get باشه و یکی دیگه post ولی اینجا کاملا واضح هستش که درگاه بانک شما داره درخواست رو به صورت post ارسال میکنه
شما به واتساپ من یک پیام بدین تا از طریق any desk مشکل شمارو بررسی و حل کنم
09360786272
حتما قبلش anydesk و اسکایپ نصب کنید چون نیاز میشه


mkt
@mkt 3 سال پیش مطرح شد
0

وقت بخیر .

@mahdiam200
به جواب رسیدید ؟


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

@mkt

هنوز خیر


مهدی
تخصص : برنامه نویس
@mahdiam200 3 سال پیش آپدیت شد
1

@mkt
با سلام
پس از چند روز درگیری با این مسئله و تماس با پشتیبانی فنی درگاه سامان بالاخره مشکلم حل شد.
در ابتدا برای رفتن به درگاه باید از کد زیر استفاده کرد

<?php

//if you want can make a transaction in database here

$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => 'https://sep.shaparak.ir/OnlinePG/OnlinePG',
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => '',
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 0,
  CURLOPT_FOLLOWLOCATION => true,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => 'POST',
  CURLOPT_POSTFIELDS =>'{
    "action":"token",
    "TerminalId":"12345678",
    "RedirectUrl":"path-to-redirect",
    "ResNum":'. $transaction->id .',
    "Amount": '. $bill->price.',
    "CellNumber":""
}',
  CURLOPT_HTTPHEADER => array(
    'Content-Type: application/json',
    'Cookie: ASP.NET_SessionId=ryqbqari5jhl1fxyjut1i03y; TS017ebf2e=0112d175351a236dcb89c7fb70090c52d1846fa62cc0c6f2278cc3b68ae0edae68e913754f1e5363fb0df2246bba75b099babc1750daf2a2228692ccf7a114ea92ebf20c12'
  ),
));

$response = curl_exec($curl);

$response = json_decode($response);
curl_close($curl);

if (isset($response->token)) { 
                            echo "<form action='https://sep.shaparak.ir/OnlinePG/OnlinePG' method='post' id='SendParameter'>"
                            . "<input type='hidden' name='Token' value='" . $response->token . "'/>"
                            ."<input name='GetMethod' type='hidden' value='True'></form>"
                            . "<script type=\"text/javascript\">function send_to_saman(){document.getElementById('SendParameter').submit();}</script>";
                    }
?>

و در قسمتی از کد که میخواهید میتوانید یک دکمه با رویداد sendtosaman()=onclick ایجاد کنید که با فشردن این دکمه به درگاه هدایت شوید.برای برگشت از درگاه هم یک route مثل روت زیر و با متد get تغریف کنید.

route::prefix('admin/bills')->group(function(){
  route::get('/saman-payment-confirmation','back\BillController@saman_payment_confirmation')->name('admin.bill.saman_payment_confirmation'); 
});

و در انتها نیز با کد زیر در کنترلر میتوانید تراکنش را verify کنید.

   public function saman_payment_confirmation()
    {
       if (isset($_GET['RefNum'])) {
            $RefNum = $_GET['RefNum'];
        } else {
            echo "this is not ok";
        }
        if (isset($_GET['ResNum'])) {
            $ResNum = $_GET['ResNum'];
        }
        if (isset($_POST['State'])) {
            $State = $_POST['State'];
        }
        if (isset($_GET['TerminalId'])) {
            $TermId = $_GET['TerminalId'];
        }

        $curl = curl_init();

        curl_setopt_array($curl, array(
          CURLOPT_URL => "https://sep.shaparak.ir/verifyTxnRandomSessionkey/ipg/VerifyTranscation",
          CURLOPT_RETURNTRANSFER => true,
          CURLOPT_ENCODING => "",
          CURLOPT_MAXREDIRS => 10,
          CURLOPT_TIMEOUT => 30,
          CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
          CURLOPT_CUSTOMREQUEST => "POST",
          CURLOPT_POSTFIELDS => "{\n  \"TerminalNumber\": \"".$TermId."\",\n  \"RefNum\": \"".$RefNum."\",\n  \"CellNumber\":\"\",\n  \"NationalCode\" : \"\",\n  \"IgnoreNationalcode\" : true\n}\n\n",
          CURLOPT_HTTPHEADER => array(
            "cache-control: no-cache",
            "content-type: application/json"
          ),
        ));

        $response = curl_exec($curl);
        $err = curl_error($curl);

        curl_close($curl);
        $Result = json_decode($response);
        if ($err) {
            echo "cURL Error #:" . $err;

        } else {
            if ($Result->ResultCode==0) {
                echo "Your Transaction is VERIFIED".$ResNum;
                }

        } else {
            echo 'Your Transaction not ok';
        }
        }

    }

mkt
@mkt 3 سال پیش مطرح شد
0

@mahdiam200
ممنونم خیلی لطف کردید .

🌹🌹🌹🌹🌹🌹💐💐💐💐


محمد رضا
تخصص : Full Stack Developer
@salar.mohammad2013 2 سال پیش مطرح شد
0

@mkt
سلام و وقت بخیر

ارور من رفع شد بماند که این پکیج برای من توی وریفای خطا داد ولی با این کار خطای تایپ رفع شد .

من درگاه سامان کیش میخوام استفاده کنم
از پکیج شتابیت هم دارم استفاره میکنم
پرداخت انجام میشه در بازگشت transactionId که پکیج بهم میده رو برنمیگردونه بانک و یک ResNum کاملا متفاوت برمیگردونه و نمیتونم varify کنم پرداخت رو
شما چطور مشکل varify رو حل کردید
ممنون میدم توضیح بدید.


علی
@alifar 6 ماه پیش مطرح شد
0

URL مورد نظر در هنگام برگشت
CURLOPT_URL => "https://sep.shaparak.ir/verifyTxnRandomSessionkey/ipg/VerifyTranscation",

اشتباه است

URL درست :
CURLOPT_URL => "https://sep.shaparak.ir/verifyTxnRandomSessionkey/ipg/VerifyTransaction",


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

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