۵۰٪ تخفیف فقط تا پایان جشنواره؛ بعدش همه‌چیز به قیمت قبل برمی‌گرده!

مشاهده دوره‌ها
ثانیه
دقیقه
ساعت
روز
راکت
حل شده

اتصال به بانک سامان

21 پاسخ

با سلام خدمت عزیزان

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

ممنون میشم اگر دوستانی راه حلی دارن به بنده هم بگن. سپاسگذارم

ثبت پرسش جدید

پاسخ‌ها

21
محمدرضا سلطانی
محمدرضا سلطانی
@mohrezani

تخصص: برنامه نویس موبایل

بهترین پاسخ

@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;
   }

(موارد مربوط به ثبت اطلاعات توی بانک اطلاعاتیت دیگه خودت میدونی کجاها باید انجام بشه ، ضمن اینکه من یه جاهایی یه متدهایی رو صدا زدم که دارم تنظیمات مربوط به درگاه رو میگیرم که مطمئنا اونارو هم متوجه میشی)

شاید پاسخ شما همین‌جا باشد

برای ارسال پاسخ لازم است وارد شده یا ثبت‌نام کنید

ورود یا ثبت‌نام