راکت
حل شده

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

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

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

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

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

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

سپاسگذارم

vahid Mohammadi
vahid Mohammadi
@viva.mohammadi

@juza666

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

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

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

vahid Mohammadi
vahid Mohammadi
@viva.mohammadi

@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

تخصص: سی شارپ و پی اچ پی

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

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

Bahman Aliveisi
Bahman Aliveisi
@roj

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

تخصص: سی شارپ و پی اچ پی

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

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

علی بیات
علی بیات
@ali.bayat

تخصص: توسعه دهنده ارشد وب

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

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

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

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

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

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

@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

تخصص: سی شارپ و پی اچ پی

@mrza.soltani

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

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

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

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

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

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

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

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

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

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

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

علی اسماعیلی
علی اسماعیلی
@aliesmaili.code

تخصص: php Laravel

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

سیدعلی موسوی
سیدعلی موسوی
@juza66

تخصص: سی شارپ و پی اچ پی

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

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

مبین روشناس
مبین روشناس
@mobinroshnas

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

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

Javad Ezaz
Javad Ezaz
@sjavadez

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

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

محسن شرفی
محسن شرفی
@laravel 2

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

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

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

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