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

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


ثبت پرسش جدید
محمدرضا سلطانی
تخصص : برنامه نویس موبایل
@mohrezani 5 سال پیش مطرح شد
7

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

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


محسن شرفی
تخصص : برنامه نویس
@laravel 2 10 ماه پیش مطرح شد
0

سلام داداش خوبی میشه کداتو بقرستی من نتونتسم وصل شم؟ و این ک توکن رو باید خودمون جنریت کنیم یا بانک بده؟


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

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