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

8 ساعت پیش توسط Javad Ezaz آپدیت شد
آفلاین
user-avatar
سیدعلی موسوی ( 142798 تجربه )
3 سال پیش
تخصص : سی شارپ و پی اچ پی

لینک کوتاه اشتراک گذاری

1

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

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

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

بهترین پاسخ
آفلاین
user-avatar
Mohammadreza Soltani
3 سال پیش

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

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

آفلاین
user-avatar
سیدعلی موسوی ( 142798 تجربه )
3 سال پیش
تخصص : سی شارپ و پی اچ پی

لینک کوتاه اشتراک گذاری

1

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

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

سپاسگذارم

آفلاین
user-avatar
vahid Mohammadi ( 37202 تجربه )
3 سال پیش

لینک کوتاه اشتراک گذاری

2

@juza666

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

آفلاین
user-avatar
سیدعلی موسوی ( 142798 تجربه )
3 سال پیش
تخصص : سی شارپ و پی اچ پی

لینک کوتاه اشتراک گذاری

آفلاین
user-avatar
vahid Mohammadi ( 37202 تجربه )
3 سال پیش

لینک کوتاه اشتراک گذاری

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ارسال کنید.

آفلاین
user-avatar
سیدعلی موسوی ( 142798 تجربه )
3 سال پیش
تخصص : سی شارپ و پی اچ پی

لینک کوتاه اشتراک گذاری

1

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

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

آفلاین
user-avatar
Bahman Aliveisi ( 18462 تجربه )
3 سال پیش

لینک کوتاه اشتراک گذاری

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

آفلاین
user-avatar
سیدعلی موسوی ( 142798 تجربه )
3 سال پیش
تخصص : سی شارپ و پی اچ پی

لینک کوتاه اشتراک گذاری

1

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

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

آفلاین
user-avatar
علی بیات ( 439989 تجربه )
3 سال پیش
تخصص : توسعه دهنده ارشد وب

لینک کوتاه اشتراک گذاری

1

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

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

آفلاین
user-avatar
سیدعلی موسوی ( 142798 تجربه )
3 سال پیش
تخصص : سی شارپ و پی اچ پی

لینک کوتاه اشتراک گذاری

1

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

آفلاین
user-avatar
Mohammadreza Soltani ( 995 تجربه )
3 سال پیش
تخصص : برنامه نویس موبایل

لینک کوتاه اشتراک گذاری

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;
   }
آفلاین
user-avatar
سیدعلی موسوی ( 142798 تجربه )
3 سال پیش
تخصص : سی شارپ و پی اچ پی

لینک کوتاه اشتراک گذاری

1

@mrza.soltani

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

آفلاین
user-avatar
سیدعلی موسوی ( 142798 تجربه )
3 سال پیش
تخصص : سی شارپ و پی اچ پی

لینک کوتاه اشتراک گذاری

1

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

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

آفلاین
user-avatar
سیدعلی موسوی ( 142798 تجربه )
3 سال پیش
تخصص : سی شارپ و پی اچ پی

لینک کوتاه اشتراک گذاری

1

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

آفلاین
user-avatar
Mohammadreza Soltani ( 995 تجربه )
3 سال پیش
تخصص : برنامه نویس موبایل

لینک کوتاه اشتراک گذاری

5

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

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

آفلاین
user-avatar
سیدعلی موسوی ( 142798 تجربه )
3 سال پیش
تخصص : سی شارپ و پی اچ پی

لینک کوتاه اشتراک گذاری

2

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

آفلاین
user-avatar
Mohammadreza Soltani ( 995 تجربه )
3 سال پیش
تخصص : برنامه نویس موبایل

لینک کوتاه اشتراک گذاری

2

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

آفلاین
user-avatar
علی اسماعیلی ( 17656 تجربه )
1 سال پیش
تخصص : php Laravel

لینک کوتاه اشتراک گذاری

-1

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

آفلاین
user-avatar
سیدعلی موسوی ( 142798 تجربه )
1 سال پیش
تخصص : سی شارپ و پی اچ پی

لینک کوتاه اشتراک گذاری

1

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

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

آفلاین
user-avatar
مبین روشناس ( 9130 تجربه )
1 سال پیش
تخصص : برنامه نویس وب

لینک کوتاه اشتراک گذاری

0

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

آفلاین
user-avatar
Javad Ezaz ( 49987 تجربه )
8 ساعت پیش
تخصص : برنامه نویس php و لاراول

لینک کوتاه اشتراک گذاری

0

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

برای ارسال پاسخ لازم است، ابتدا وارد سایت شوید.