با سلام خدمت عزیزان
من یک درگاه بانک سامان دارم میخوام با لاراول پارمترها رو ارسال کنم سمت 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;
}@mrza.soltani
این براساس مستندات سامان بانک قسمت توکن هست، نحوه استفاده ش رو مگید چطوریه؟!
بعد از ارسال سه پارمتر اول و برگشت توکن، من باید توکن، mid و url calback رو باز با Soap بدم یا با guzzle?
ممنون میشم راهنمایی بفرمایید
@mrza.soltani
ممنون مهندس جان ، مشکل با اولین کدهای که دادین برطرف کردم خیلی خیلی سپاسگذارم 💜
@juza666
خواهش میکنم ، موید باشی
@mrza.soltani
سلام دوست عزیز روش بدون توکن رو دارید کدشو میخوام بره سمت بک بعد ریدایرکت شه به درگاه
@juza66
سلام
امکانش هست نمونه کدی که برای درگاه پرداخت نوشتید رو ارسال کنید من هنوز نتونستم پیاده سازی کنم و ارور دارم