سیدعلی موسوی
6 سال پیش توسط سیدعلی موسوی مطرح شد
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 6 سال پیش مطرح شد
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;
   }

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


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 6 سال پیش مطرح شد
1

نکات دیگر جهت راهنمایی

-داکیومنت بانک سامان رو مطالعه کردم روشی نگفته با soap یا guzzle ولی من هردو رو چک کردم و به خطا خوردم
-بخوام یک صفحه رو با کدهای لاراول ایجاد کنم و با js دکمه رو submit کنم رو هم تست کردم چیز جالبی نیست و امنیتی هم نیست البته با کدهای پیچیده و طولانی شاید بشه ولی باز امنیت نداره.

سپاسگذارم


vahid Mohammadi
@viva.mohammadi 6 سال پیش مطرح شد
2

@juza666

سلام میشه لطفا داکیومنت بانک سامان رو به اشتراک بگذارید تا با توجه به اون بتونیم راه حل پیدا کنیم


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 6 سال پیش مطرح شد
vahid Mohammadi
@viva.mohammadi 6 سال پیش آپدیت شد
2

@juza666
داکیومنت بانک سامان رو مطالعه کردم روشی نگفته با soap یا guzzle ولی من هردو رو چک کردم و به خطا خوردم===>
در داکیومنت سامان اینو نوشته بود :
Image of Yaktocat

من میخوام سمت کنترلر پردازش انجام بشه ===> به نظر من حتما باید اینطوری باشه برای اینکار من به شکل زیر اینکارو انجام دادم

    $client = new SoapClient('https://sep.shaparak.ir/payment.aspx', ['encoding' => 'UTF-8']);

        $result = $client->PaymentRequest(
            [
               // Your Parameters
            ]
        );

راستی شما باید route برگشتش رو هم تعریف کنید و result رو چک کنید.طبق داکیومنت این route رو هم باید برای بانک به صورت POSTارسال کنید.


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 6 سال پیش مطرح شد
1

@viva.mohammadi
این روش برای زرین پال هست، اون utf8 و اون متد paymentRequest ولی تویی soap سایر بانک ها request هست

این روش شما رو چک کردم 💜 ولی جواب نگرفتم


Bahman Aliveisi
@roj 6 سال پیش آپدیت شد
2

سلام
شاید مشکل از کش باشه، کش 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


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 6 سال پیش مطرح شد
1

نه متاسفانه @roj
همه رو تست زدم الان ، از دوستانی که با بانک سامان ارتباط داشتن همه میگم فرم post بسازید اکشن بدید و فیدهای اینپونت رو مخفی کنید!

بهشون میگم اگر کسی دست ببره تو مبلغ، میگن تو وریفای بازگشتی بانک چک میکنیم که اگر کمتر از اون مبلغ بوده بهش پیام میدیم و میگیم که مبلغ رو اشتباه واریز کردی و با مدیر سایت در ارتباط باش و اونجا کارش رو پیگیری میکنیم و پرسش اخر من الان اینه اون mid که کدپذیرنده هستش ایا نباید یه جوری برای خودم باشه دست کسی نیافته؟!


علی بیات
تخصص : توسعه دهنده ارشد وب
@ali.bayat 6 سال پیش مطرح شد
1

سلام و خسته نباشید.
مشخصا مخفی کردن فیلدهای اینپوت در چنین صفحه مهمی راه‌حل خوبی نیست..

میشه بپرسم شما دارید از پکیج استفاده میکنید یا کدهای خودتون؟


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 6 سال پیش مطرح شد
1

خودم ، کدش اول سوالم نوشتم


محمدرضا سلطانی
تخصص : برنامه نویس موبایل
@mohrezani 6 سال پیش آپدیت شد
2

@juza666

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

سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 6 سال پیش مطرح شد
1

@mrza.soltani

دمت گرم ، مرسی از کدهات مشکلی از soap دیگه نمیگیره
ولی خطای -18 برمیگردنه، تعداد پارمتر ارسالی تویی کدهای شما 3 تاس ولی سایت 4 رو اجباری میخواد ، url back رو کجای آرایه بذارم؟


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 6 سال پیش مطرح شد
1

@mrza.soltani
این براساس مستندات سامان بانک قسمت توکن هست، نحوه استفاده ش رو مگید چطوریه؟!

بعد از ارسال سه پارمتر اول و برگشت توکن، من باید توکن، mid و url calback رو باز با Soap بدم یا با guzzle?
ممنون میشم راهنمایی بفرمایید


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 6 سال پیش آپدیت شد
1

خطای -18 ، ای پی فروشنده اشتباه است
برروی هاست تست کردم اوکیه ولی صفحه ی بانکی باز نمیشه و فقط cal back میشه به همون ادرس


محمدرضا سلطانی
تخصص : برنامه نویس موبایل
@mohrezani 6 سال پیش مطرح شد
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;
   }

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


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 6 سال پیش مطرح شد
2

@mrza.soltani
ممنون مهندس جان ، مشکل با اولین کدهای که دادین برطرف کردم خیلی خیلی سپاسگذارم 💜


محمدرضا سلطانی
تخصص : برنامه نویس موبایل
@mohrezani 6 سال پیش مطرح شد
2

@juza666
خواهش میکنم ، موید باشی


علی اسماعیلی
تخصص : php Laravel
@aliesmaili.code 5 سال پیش مطرح شد
-1

@mrza.soltani
سلام دوست عزیز روش بدون توکن رو دارید کدشو میخوام بره سمت بک بعد ریدایرکت شه به درگاه


سیدعلی موسوی
تخصص : سی شارپ و پی اچ پی
@juza66 5 سال پیش آپدیت شد
1

روش بدون توکن رو دارید کدشو میخوام بره سمت بک بعد ریدایرکت شه به درگاه

متوجه نشدم؟!خب شما اول اطلاعات رو سمت بک اند ارسال میکنید تویی همون بک اند توکن رو دریافت میکنید ، بعدش یک فرم باید داشته باشین که اون توکن رو تویی خودش داشته باشه و بعدش با جاوا اسکریپت اون فرم رو سابمیت میکنین


مبین روشناس
تخصص : برنامه نویس وب
@mobinroshnas 4 سال پیش مطرح شد
0

سلام من همه کار هارو کردم پول رو هم ازم کسر میکنه ولی وقتی که برمیگرده ارور -18 میده و توی هاستم دارم تست میکنم طبق دایکومنت این ارور مال اینه که ip فروشنده نامعتبره خب من همون آی پی که برای اهراز هویت دادم همونجا آپلود کردم ولی خب ارور -18 میده کسی میدونه دلیلش چیه


Javad Ezaz
تخصص : برنامه نویس php و لاراول
@sjavadez 3 سال پیش مطرح شد
0

@juza66
سلام
امکانش هست نمونه کدی که برای درگاه پرداخت نوشتید رو ارسال کنید من هنوز نتونستم پیاده سازی کنم و ارور دارم


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

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