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