با سلام خدمت عزیزان
من یک درگاه بانک سامان دارم میخوام با لاراول پارمترها رو ارسال کنم سمت 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;
}
(موارد مربوط به ثبت اطلاعات توی بانک اطلاعاتیت دیگه خودت میدونی کجاها باید انجام بشه ، ضمن اینکه من یه جاهایی یه متدهایی رو صدا زدم که دارم تنظیمات مربوط به درگاه رو میگیرم که مطمئنا اونارو هم متوجه میشی)
شاید پاسخ شما همینجا باشد