با سلام خدمت عزیزان
من یک درگاه بانک سامان دارم میخوام با لاراول پارمترها رو ارسال کنم سمت url و سایت بانک رو نمایش بدم
کد من
$client = new SoapClient('https://sep.shaparak.ir/payment.aspx');
$result = $client->Request(
[
'Amount' => $price,
'ResNum' => $res,
'RedirectURL' => $RedirectURL,
'MID' => $this->MerchantID,
]
);
خطا
SoapFault
SOAP-ERROR: Parsing WSDL: Couldn't load from 'https://sep.shaparak.ir/payment.aspx' : Premature end of data in tag html line 1
نکته: من اگر بصورت فرم اینپوت ها hidden درست کنم براحتی پارمترها ارسال و سایت بانک نمایش داده میشه مشکلی نیست ، فقط مشکل امنیتی داره اینجوری و هرکسی میتونه با یک inspect گرفتن مقادیر رو تغییر بده و یجورایی مشکل امنیتی داره حالا من میخوام سمت کنترلر پردازش انجام بشه
ممنون میشم اگر دوستانی راه حلی دارن به بنده هم بگن. سپاسگذارم
@juza666
کل پروسه پرداخت سامان به این شکل هست :
1- شما پارامترهای ابتدایی رو میفرستی به متد RequestToken که بانک بهت یه توکن بده
2- اگر توکن گرفتی ، میری واسه پرداخت ، این قسمت باید بصورت javascript نوشته بشه
3- توی صفحه callback باید پرداختت رو بررسی کنی
4- اگر همه چیز اوکی بود باید verify کنی
چهار مرحله بالا به این شکل میشه :
STEP 1 :
public function samanPay ()
{
$params = $this->request->getAssocParams();
$settings = $this->getSamanBankSetting();
$price = $params['price'];
$callbackUrl = $params['callbackUrl'];
$save = ( is_array( $params['save'] ) ) ? $params['save'] : [];
$client = new SoapClient ( 'https://sep.shaparak.ir/payments/initpayment.asmx?wsdl' );
$orderId = 'Order' . rand( 1000,9999 );
try
{
$token = $client->RequestToken( $settings['MID'], /// MID
$orderId, /// ResNum
$price /// TotalAmount
);
} catch ( Exception $e )
{
echo $e->error();
}
if ( $token )
{
$save[1]['bankid'] = 'saman';
$save[1]['orderid'] = $orderId;
\f\ttt::dal( 'core.setting.bank.savePay',$save );
return [ 'result' => 'success','message' => 'در حال اتصال به درگاه بانک سامان ...','params' => [ 'Token' => $token,'RedirectURL' => $callbackUrl ],'func' => 'goToBank' ];
} else
{
return [ 'result' => 'error','message' => 'خطا در اتصال به درگاه بانک!' ];
}
}
STEP 2 :
var form = document.createElement("form");
form.setAttribute("method", "POST");
form.setAttribute("action", "https://sep.shaparak.ir/payment.aspx");
form.setAttribute("target", "_self");
var hiddenField = document.createElement("input");
hiddenField.setAttribute("name", "token");
hiddenField.setAttribute("value", param.Token);
form.appendChild(hiddenField);
var hiddenField2 = document.createElement("input");
hiddenField2.setAttribute("name", "RedirectURL");
hiddenField2.setAttribute("value", param.RedirectURL);
form.appendChild(hiddenField2);
document.body.appendChild(form);
form.submit();
document.body.removeChild(form);
STEP 3 :
public function CallBackBank($params, $bank)
{
$order = \f\ttt::service('payment.getPayByOrderIdNew',
[
'orderId' => $params['ResNum'],
]);
if ($params['StateCode'] == -1) {
//for cancel trans
$status = 'cancel';
\f\ttt::service('payment.removeTransactionAndTurns',
[
'orderId' => $params['ResNum']
]);
} else {
$refId = $params['TRACENO'];
$result = \f\ttt::service('core.setting.bank.saman.verifySaman',
[
'orderId' => $params['ResNum'],
'refrenceId' => $params['RefNum']
]);
//echo $result;
if ($result == ($order['price'] * 10)) {
\f\ttt::service('payment.saveTransactionAndTurns',
[
'orderId' => $params['ResNum'],
'refrenceId' => $params['TRACENO']
]);
}
}
}
STEP 4 :
public function verifySaman()
{
$params = $this->request->getAssocParams();
$settings = $this->getSamanBankSetting();
$soapclient = new soapclient('https://sep.shaparak.ir/payments/referencepayment.asmx?WSDL');
$res= $soapclient->VerifyTransaction($params['refrenceId'],$settings['MID']);#reference number and sellerid
return $res;
}
(موارد مربوط به ثبت اطلاعات توی بانک اطلاعاتیت دیگه خودت میدونی کجاها باید انجام بشه ، ضمن اینکه من یه جاهایی یه متدهایی رو صدا زدم که دارم تنظیمات مربوط به درگاه رو میگیرم که مطمئنا اونارو هم متوجه میشی)
نکات دیگر جهت راهنمایی
-داکیومنت بانک سامان رو مطالعه کردم روشی نگفته با soap یا guzzle ولی من هردو رو چک کردم و به خطا خوردم
-بخوام یک صفحه رو با کدهای لاراول ایجاد کنم و با js دکمه رو submit کنم رو هم تست کردم چیز جالبی نیست و امنیتی هم نیست البته با کدهای پیچیده و طولانی شاید بشه ولی باز امنیت نداره.
سپاسگذارم
سلام میشه لطفا داکیومنت بانک سامان رو به اشتراک بگذارید تا با توجه به اون بتونیم راه حل پیدا کنیم
@juza666
داکیومنت بانک سامان رو مطالعه کردم روشی نگفته با soap یا guzzle ولی من هردو رو چک کردم و به خطا خوردم===>
در داکیومنت سامان اینو نوشته بود :
من میخوام سمت کنترلر پردازش انجام بشه ===> به نظر من حتما باید اینطوری باشه برای اینکار من به شکل زیر اینکارو انجام دادم
$client = new SoapClient('https://sep.shaparak.ir/payment.aspx', ['encoding' => 'UTF-8']);
$result = $client->PaymentRequest(
[
// Your Parameters
]
);
راستی شما باید route برگشتش رو هم تعریف کنید و result رو چک کنید.طبق داکیومنت این route رو هم باید برای بانک به صورت POSTارسال کنید.
@viva.mohammadi
این روش برای زرین پال هست، اون utf8 و اون متد paymentRequest ولی تویی soap سایر بانک ها request هست
این روش شما رو چک کردم 💜 ولی جواب نگرفتم
سلام
شاید مشکل از کش باشه، کش wsdl رو غیرفعال کنید.
ini_set("soap.wsdl_cache_enabled", 0);
یا
$client = new SoapClient('https://sep.shaparak.ir/payment.aspx', array('cache_wsdl' => WSDL_CACHE_NONE));
اگر حل نشد این راه حل رو هم تست کنید
https://stackoverflow.com/questions/21861077/soap-error-parsing-wsdl-couldnt-load-from-but-works-on-wamp
نه متاسفانه @roj
همه رو تست زدم الان ، از دوستانی که با بانک سامان ارتباط داشتن همه میگم فرم post بسازید اکشن بدید و فیدهای اینپونت رو مخفی کنید!
بهشون میگم اگر کسی دست ببره تو مبلغ، میگن تو وریفای بازگشتی بانک چک میکنیم که اگر کمتر از اون مبلغ بوده بهش پیام میدیم و میگیم که مبلغ رو اشتباه واریز کردی و با مدیر سایت در ارتباط باش و اونجا کارش رو پیگیری میکنیم و پرسش اخر من الان اینه اون mid که کدپذیرنده هستش ایا نباید یه جوری برای خودم باشه دست کسی نیافته؟!
سلام و خسته نباشید.
مشخصا مخفی کردن فیلدهای اینپوت در چنین صفحه مهمی راهحل خوبی نیست..
میشه بپرسم شما دارید از پکیج استفاده میکنید یا کدهای خودتون؟
public function samanPay ()
{
$settings = $this->getSamanBankSetting();
$price = $params['price'];
$callbackUrl = $params['callbackUrl'];
$save = ( is_array( $params['save'] ) ) ? $params['save'] : [];
$client = new SoapClient ( 'https://sep.shaparak.ir/payments/initpayment.asmx?wsdl' );
$orderId = 'Order' . rand( 1000,9999 );
//pre($price);
try
{
$token = $client->RequestToken( $settings['MID'], /// MID
$orderId, /// ResNum
$price /// TotalAmount
///,'SegAmount1' /// Optional
///,'SegAmount2' /// Optional
///,'SegAmount3' /// Optional
///,'SegAmount4' /// Optional
///,'SegAmount5' /// Optional
///,'SegAmount6' /// Optional
///,'ResNum1' /// Optional
///,'ResNum2' /// Optional
///,'10' /// Optional
);
$token = $client->RequestToken( $settings['MID'],$orderId,$price,0,0,0,0,0,0,"","",0 );
} catch ( Exception $e )
{
echo $e->error();
}
//pre($callbackUrl);
if ( $token )
{
// save transaction to database
} else
{
// else actions....
}
}
public function verifySaman()
{
$params = $this->request->getAssocParams();
$settings = $this->getSamanBankSetting();
$soapclient = new soapclient('https://sep.shaparak.ir/payments/referencepayment.asmx?WSDL');
$res= $soapclient->VerifyTransaction($params['refrenceId'],$settings['MID']);#reference number and sellerid
return $res;
}
دمت گرم ، مرسی از کدهات مشکلی از soap دیگه نمیگیره
ولی خطای -18 برمیگردنه، تعداد پارمتر ارسالی تویی کدهای شما 3 تاس ولی سایت 4 رو اجباری میخواد ، url back رو کجای آرایه بذارم؟
@mrza.soltani
این براساس مستندات سامان بانک قسمت توکن هست، نحوه استفاده ش رو مگید چطوریه؟!
بعد از ارسال سه پارمتر اول و برگشت توکن، من باید توکن، mid و url calback رو باز با Soap بدم یا با guzzle?
ممنون میشم راهنمایی بفرمایید
خطای -18 ، ای پی فروشنده اشتباه است
برروی هاست تست کردم اوکیه ولی صفحه ی بانکی باز نمیشه و فقط cal back میشه به همون ادرس
@juza666
کل پروسه پرداخت سامان به این شکل هست :
1- شما پارامترهای ابتدایی رو میفرستی به متد RequestToken که بانک بهت یه توکن بده
2- اگر توکن گرفتی ، میری واسه پرداخت ، این قسمت باید بصورت javascript نوشته بشه
3- توی صفحه callback باید پرداختت رو بررسی کنی
4- اگر همه چیز اوکی بود باید verify کنی
چهار مرحله بالا به این شکل میشه :
STEP 1 :
public function samanPay ()
{
$params = $this->request->getAssocParams();
$settings = $this->getSamanBankSetting();
$price = $params['price'];
$callbackUrl = $params['callbackUrl'];
$save = ( is_array( $params['save'] ) ) ? $params['save'] : [];
$client = new SoapClient ( 'https://sep.shaparak.ir/payments/initpayment.asmx?wsdl' );
$orderId = 'Order' . rand( 1000,9999 );
try
{
$token = $client->RequestToken( $settings['MID'], /// MID
$orderId, /// ResNum
$price /// TotalAmount
);
} catch ( Exception $e )
{
echo $e->error();
}
if ( $token )
{
$save[1]['bankid'] = 'saman';
$save[1]['orderid'] = $orderId;
\f\ttt::dal( 'core.setting.bank.savePay',$save );
return [ 'result' => 'success','message' => 'در حال اتصال به درگاه بانک سامان ...','params' => [ 'Token' => $token,'RedirectURL' => $callbackUrl ],'func' => 'goToBank' ];
} else
{
return [ 'result' => 'error','message' => 'خطا در اتصال به درگاه بانک!' ];
}
}
STEP 2 :
var form = document.createElement("form");
form.setAttribute("method", "POST");
form.setAttribute("action", "https://sep.shaparak.ir/payment.aspx");
form.setAttribute("target", "_self");
var hiddenField = document.createElement("input");
hiddenField.setAttribute("name", "token");
hiddenField.setAttribute("value", param.Token);
form.appendChild(hiddenField);
var hiddenField2 = document.createElement("input");
hiddenField2.setAttribute("name", "RedirectURL");
hiddenField2.setAttribute("value", param.RedirectURL);
form.appendChild(hiddenField2);
document.body.appendChild(form);
form.submit();
document.body.removeChild(form);
STEP 3 :
public function CallBackBank($params, $bank)
{
$order = \f\ttt::service('payment.getPayByOrderIdNew',
[
'orderId' => $params['ResNum'],
]);
if ($params['StateCode'] == -1) {
//for cancel trans
$status = 'cancel';
\f\ttt::service('payment.removeTransactionAndTurns',
[
'orderId' => $params['ResNum']
]);
} else {
$refId = $params['TRACENO'];
$result = \f\ttt::service('core.setting.bank.saman.verifySaman',
[
'orderId' => $params['ResNum'],
'refrenceId' => $params['RefNum']
]);
//echo $result;
if ($result == ($order['price'] * 10)) {
\f\ttt::service('payment.saveTransactionAndTurns',
[
'orderId' => $params['ResNum'],
'refrenceId' => $params['TRACENO']
]);
}
}
}
STEP 4 :
public function verifySaman()
{
$params = $this->request->getAssocParams();
$settings = $this->getSamanBankSetting();
$soapclient = new soapclient('https://sep.shaparak.ir/payments/referencepayment.asmx?WSDL');
$res= $soapclient->VerifyTransaction($params['refrenceId'],$settings['MID']);#reference number and sellerid
return $res;
}
(موارد مربوط به ثبت اطلاعات توی بانک اطلاعاتیت دیگه خودت میدونی کجاها باید انجام بشه ، ضمن اینکه من یه جاهایی یه متدهایی رو صدا زدم که دارم تنظیمات مربوط به درگاه رو میگیرم که مطمئنا اونارو هم متوجه میشی)
@mrza.soltani
ممنون مهندس جان ، مشکل با اولین کدهای که دادین برطرف کردم خیلی خیلی سپاسگذارم 💜
@mrza.soltani
سلام دوست عزیز روش بدون توکن رو دارید کدشو میخوام بره سمت بک بعد ریدایرکت شه به درگاه
روش بدون توکن رو دارید کدشو میخوام بره سمت بک بعد ریدایرکت شه به درگاه
متوجه نشدم؟!خب شما اول اطلاعات رو سمت بک اند ارسال میکنید تویی همون بک اند توکن رو دریافت میکنید ، بعدش یک فرم باید داشته باشین که اون توکن رو تویی خودش داشته باشه و بعدش با جاوا اسکریپت اون فرم رو سابمیت میکنین
سلام من همه کار هارو کردم پول رو هم ازم کسر میکنه ولی وقتی که برمیگرده ارور -18 میده و توی هاستم دارم تست میکنم طبق دایکومنت این ارور مال اینه که ip فروشنده نامعتبره خب من همون آی پی که برای اهراز هویت دادم همونجا آپلود کردم ولی خب ارور -18 میده کسی میدونه دلیلش چیه
@juza66
سلام
امکانش هست نمونه کدی که برای درگاه پرداخت نوشتید رو ارسال کنید من هنوز نتونستم پیاده سازی کنم و ارور دارم
آیا مایل به ارسال نوتیفیکیشن و اخبار از طرف راکت هستید ؟