@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');
@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';
}
}
}
سلام می گوید در این route متد post ساپورت نمی شود. پس کدهای خودتون رو به این شکل تبدیل کنید.
route::post('/payment-confirmation','back\BillController@payment_confirmation')->name('admin.bill.payment_confirmation');
درود
@mahdiam200
من همین مشکل را با همین پکیج داشتم با همین ارور بعد از نام روت / قرار بدید .
route::get('/payment-confirmation/','back\BillController@payment_confirmation')->name('admin.bill.payment_confirmation');
ارور من رفع شد بماند که این پکیج برای من توی وریفای خطا داد ولی با این کار خطای تایپ رفع شد .
سلام
اول از همه اینکه متد post درسته و به شکل زیر عمل کن
route::post('/payment-confirmation','back\BillController@payment_confirmation')->name('admin.bill.payment_confirmation');
مشکل بعدی که پیش اومد ارور 419 هستش که مربوط میشه به توکن که به درستی هم داره ارور ایجاد میشه
حالا باید چطور این ارور رفع بشه باید بیای به آدرس App\Http\Middleware
و فایل VerifyCsrfToken به این شکل عمل کنی
protected $except = [
'payment-confirmation',
];
دلیل خطا 419 هم اینه که مرورگر شما نیست که داره این درخواست ارسال میکنه بلکه توسط درگاه بانک درخواست ارسال میشه بنابر این هیچ توکنی وجود نداره که نشون دهنده این باشه که کدوم کاربر داره پرداخت انجام میده.
روت خودتون رو به جای post روی any قرار بدید. و csrf رو هم روی روت وریفای غیر فعال کنید (که دوستمون توضیح دادن روندش چگونه هست)
@ghomi @khanzadimahdi
من روت روی any گذاشتم و csrf هم غیر فعال کردم منتها هنوز بعد از تکمیل پرداخت از حالت لاگین خارج میشه و پرداخت ثبت نمیشه
درود
@mahdiam200
من هم روش های بالا را تست کردم جواب نداد .
اگه توی کانفیگ پکیج شتابیت انتهای callbackUrl یک اسلش قرار بدید دیگه خطای
The POST method is not supported for this route. Supported methods: GET, HEAD.
را نمیده و از سیستم خارج نمیشه .
'callbackUrl' => 'https://app.karamadleasing.com/dashboard/verify_payment/',
ولی همچنان خطای :
خطای ناشناخته رخ داده است.
روبرو میشم .
اگه به جواب رسیدید لطفا بیان کنید ممنونم
نیاز به any گذاشتن نیست زمانی از any استفاده میکنیم که بخواییم از چندین درگاه بانک در سایت استفاده کنیم و هر کدام درخواست ارسالی متفاوتی داشته باشند یکی get باشه و یکی دیگه post ولی اینجا کاملا واضح هستش که درگاه بانک شما داره درخواست رو به صورت post ارسال میکنه
شما به واتساپ من یک پیام بدین تا از طریق any desk مشکل شمارو بررسی و حل کنم
09360786272
حتما قبلش anydesk و اسکایپ نصب کنید چون نیاز میشه
@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
سلام و وقت بخیر
ارور من رفع شد بماند که این پکیج برای من توی وریفای خطا داد ولی با این کار خطای تایپ رفع شد .
من درگاه سامان کیش میخوام استفاده کنم
از پکیج شتابیت هم دارم استفاره میکنم
پرداخت انجام میشه در بازگشت transactionId که پکیج بهم میده رو برنمیگردونه بانک و یک ResNum کاملا متفاوت برمیگردونه و نمیتونم varify کنم پرداخت رو
شما چطور مشکل varify رو حل کردید
ممنون میدم توضیح بدید.
URL مورد نظر در هنگام برگشت
CURLOPT_URL => "https://sep.shaparak.ir/verifyTxnRandomSessionkey/ipg/VerifyTranscation",
اشتباه است
URL درست :
CURLOPT_URL => "https://sep.shaparak.ir/verifyTxnRandomSessionkey/ipg/VerifyTransaction",
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟