# زبان های اسکریپتی > PHP >  مشکل: درگاه بانک ملت با nusoap و دریافت خطا

## Cyletech

سلام،

من برای اولین بار درگاه بانکی (الآن ملت) رو نوشتم. از soap و nusoap هم استفاده نکرده بودم پیش از این. موقع اجرا خطای زیر رو دریافت میکنم.



> Function ("getError") is not a valid method for this service


حتی با کامنت کردن اون خط، به خط‌های دیگه گیر میده و مشابه خطای بالا رو میده. من خطوط مرتبط رو براتون میذارم ممنون بررسی کنید. سپاسگذارم.

$client = new soapclient('https://pgws.bpm.bankmellat.ir/pgwchannel/services/pgw?wsdl');
		$namespace = 'http://interfaces.core.sw.bps.com/';

		if ($err = $client->getError()) {
			echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
			exit;
		}
		
		if ($client->fault) {
			echo '<h2>Fault</h2><pre>';
			print_r($result);
			echo '</pre>';
			exit;
		}
		elseif($client->getError()){
			echo '<h2>Error</h2><pre>' . $err . '</pre>';
			exit;
		}
		else {
			return $client->call('bpPayRequest',$parameters,$namespace);
		}

----------


## ak1_2004

جست و جو کنی پیدا می کنی !
اما معمولا این مشکل به خاطر عدم نصب soap client روی سرور هست !

----------


## Cyletech

> جست و جو کنی پیدا می کنی !
> اما معمولا این مشکل به خاطر عدم نصب soap client روی سرور هست !


ممنونم. من قبل از اینکه این تاپیک رو بزنم بسیار جستجو کردم اما به نتیجه‌ی مطلوبی نرسیدم. پس نظر شما اینه که soalclient نصب نیست. من اینکلود کردم فایلش رو (همونی که توی فایل نمونه که بانک داده اینکلود شده، nusoap.php)

----------


## MMSHFE

اگه nusoap رو include کردین، کلاینت رو بصورت زیر بسازین:
$client = new NuSOAP_Client('https://pgws.bpm.bankmellat.ir/pgwchannel/services/pgw?wsdl', 'wsdl');

----------


## Cyletech

> اگه nusoap رو include کردین، کلاینت رو بصورت زیر بسازین:
> $client = new NuSOAP_Client('https://pgws.bpm.bankmellat.ir/pgwchannel/services/pgw?wsdl', 'wsdl');


بله مشکل برطرف شد. ممنونم ازتون. فقط یه مشکلی هست، خروجی رو که از call میگیرم به صورت زیر هست. ممکنه از چی باشه؟ ممنون میشم در این مورد هم کمکم کنید.




> Array
> (
>     [faultcode] => soap:Client
>     [faultstring] => Unexpected wrapper element bpPayRequest found.   Expected {http://interfaces.core.sw.bps.com/}bpPayRequest.
> )

----------


## MMSHFE

کد کاملتون رو بگذارین تا ببینیم مشکل چیه

----------


## Cyletech

> کد کاملتون رو بگذارین تا ببینیم مشکل چیه


سپاسگذارم.

$parameters = array(
			'terminalId'=>'terminal_id', #terminal id ke az bank daryaft kardid
			'userName' => 'username', #username ke az band daryaft kardid
            'userPassword' => 'password', #password ke az bank daryaft kardid
            'orderId' => rand(),
            'amount' => $amount,
            'localDate' => date('Ymd'),
            'localTime' => date('H:i:s'),
            'additionalData' =>  '',
            'callBackUrl' => 'http://'.$_SERVER['SERVER_NAME'].'users/member/payment/pay/callback/id:'.$this->Auth->user('id'),
            'payerId' => '0'
			);

		//$client = new soapclient('https://pgws.bpm.bankmellat.ir/pgwchannel/services/pgw?wsdl');
		$client = new NuSOAP_Client('https://pgws.bpm.bankmellat.ir/pgwchannel/services/pgw?wsdl', 'wsdl');
		$namespace = 'http://interfaces.core.sw.bps.com/';

		if ($err = $client->getError()) {
			echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
			exit;
		}
		
		if ($client->fault) {
			echo '<h2>Fault</h2><pre>';
			print_r($result);
			echo '</pre>';
			exit;
		}
		elseif($client->getError()){
			echo '<h2>Error</h2><pre>' . $err . '</pre>';
			exit;
		}
		else {
			return $client->call('bpPayRequest',$parameters,$namespace);
		}

----------


## MMSHFE

ظاهراً کدتون نباید مشکلی داشته باشه و مشکل توی وب سرویسه. اما با اینحال این کد رو تست کنید:

$parameters = array(
    'terminalId'     => 'terminal_id', #terminal id ke az bank daryaft kardid
    'userName'       => 'username', #username ke az band daryaft kardid
    'userPassword'   => 'password', #password ke az bank daryaft kardid
    'orderId'        => rand(),
    'amount'         => $amount,
    'localDate'      => date('Ymd'),
    'localTime'      => date('H:i:s'),
    'additionalData' =>  '',
    'callBackUrl'    => 'http://'.$_SERVER['SERVER_NAME'].'users/member/payment/pay/callback/id:' . $this->Auth->user('id'),
    'payerId'        => '0'
);

$client = new NuSOAP_Client('https://pgws.bpm.bankmellat.ir/pgwchannel/services/pgw?wsdl', 'wsdl');
$namespace = 'http://interfaces.core.sw.bps.com/';
if ($err = $client->getError()) {
    echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
    exit;
}
elseif ($client->fault) {
    echo '<h2>Fault</h2><pre>';
    print_r($result);
    echo '</pre>';
    exit;
}
else {
    return($client->call('bpPayRequest', $parameters, $namespace));
}

اگه جواب نداد، خط آخر بجای return از var_dump استفاده کنید ببینیم چی چاپ میشه.

----------


## rezaonline.net

این متد رکوئستی که من برای میهن پال استفاده میکنم ، یه کمی تغییرش بده امیداوارم کارت رو راه بندازه 
public function request($price = NULL , $order_id = NULL , $callback = NULL)
    {
        $parameters = array(
                'terminalId' => self::terminalID ,
                'userName' => self::username ,
                'userPassword' => self::password ,
                'orderId' => $order_id+5400 ,
                'amount' => $price * 10 ,
                'localDate' => date("Ymd") ,
                'localTime' => date("His") ,
                'additionalData' => '' ,
                'callBackUrl' => $callback ,
                'payerId' => '0' ,
        );
            $client = new nusoap_client('https://pgws.bpm.bankmellat.ir/pgwchannel/services/pgw?wsdl');
            $err = $client->getError();
            if($err)
                return -6;;

                
            $result = $client->call('bpPayRequest', $parameters, 'http://interfaces.core.sw.bps.com/');
            //print_r($result);
            $res = explode (',', $result);
            if( ! isset($res[0]) or $res[0] != "0" or ! isset($res[1]))
                return -6;

            else
            {
                return strip_tags($res[1]);
            }

            
        return -6;
    }

----------


## Cyletech

> اگه جواب نداد، خط آخر بجای return از var_dump استفاده کنید ببینیم چی چاپ میشه.


متاسفانه جواب نداد و این خروجی همونطور که خواسته بودید.




> array(2) {
>   ["faultcode"]=>
>   string(11) "soap:Client"
>   ["faultstring"]=>
>   string(107) "Unexpected wrapper element bpPayRequest found.   Expected {http://interfaces.core.sw.bps.com/}bpPayRequest."
> }


متاسفانه پارامتر دوم رو برای کلاس soap_client میفرستم خطای بالا رو میده. وقتی پارامتر دوم رو حذف کنم عمل میکنه و خروجی هم میگیرم همونطور که باید باشه ولی مسئله اینجاست اصلا به سایت بانک مراجعه نمیکنه و _POST به صفحه‌ی من ارسال نمیشه که به متغیر SaleReferenceId خطا میگیره و میگه وجود نداره. بنظر شما چرا به صفحه‌ی پرداخت هدایت نمیکنه؟ سپاسگذارم.

rezaonline.net جان کد‌های تقریبا این قسمتش مشابه هست. فقط تابع اولی که نوشته بودم (توی مثال‌های خود بانک بود) جواب نمیداد. از کد شما فهمیدم که تاریخ local اشتباست و اصلاحش کردم. دستت درد نکنه

----------


## rezaonline.net

متد برگشت هم برات مینویسم امیدوارم به دردت بخوره .
public function verify($price = NULL ,$order_id = NULL , $au = NULL)
{
    //print_r($_POST);
    $RefId = @$_POST['RefId']; // notNeed
    $ResCode = @$_POST['ResCode'];
    $SaleOrderId = (int) @$_POST['SaleOrderId'];
    $SaleReferenceId = @$_POST['SaleReferenceId'];
    //Logs::model()->add('SaleReferenceId',$SaleReferenceId .'-'.$RefId);
    
                $this->SaleReferenceId = $SaleReferenceId;
                /**/
    //check
    if($SaleOrderId != $order_id+5400 or $RefId!=$au or ! isset($_POST['ResCode']))
    {
        Logs::model()->add('برگشت بانک ملت','خطا : ورودی نامعتبر است !');
        return false;
    }
        
    if($ResCode !=0)
    {
        return false;
        #Logs::model()->add('برگشت بانک ملت','خطا : پرداخت انجام نشد .');
    }
    
    $client = new nusoap_client('https://pgws.bpm.bankmellat.ir/pgwchannel/services/pgw?wsdl');
    $err = $client->getError();
    if ($err) 
    {
        Logs::model()->add('برگشت بانک ملت',"_خطا : " . strip_tags($err) );
        return false;
    }

          
    $parameters = array(
            'terminalId' => self::terminalID ,
            'userName' => self::username ,
            'userPassword' => self::password ,
            'orderId' => $SaleOrderId ,
            'saleOrderId' => $SaleOrderId ,
            'saleReferenceId' => $SaleReferenceId
            );

        // Call the SOAP method
        unset($result);
        $result = $client->call('bpVerifyRequest', $parameters,'http://interfaces.core.sw.bps.com/');

        // Check for a fault
        //if ($client->fault) 
            //Logs::model()->add('برگشت بانک ملت','_خطا در اتصال به بانک .');

        
        $err = $client->getError();
        if ($err) 
        {
            Logs::model()->add('برگشت بانک ملت',"__خطا : " . strip_tags($err) );
            return false;
        }

        
        if(isset($result) and $result==0)
        {
            //settel
            unset($result);
            $result = $client->call('bpSettleRequest', $parameters,'http://interfaces.core.sw.bps.com/');
            if ($client->fault) 
            {
            Logs::model()->add('برگشت بانک ملت','خطا در اتصال به بانک .');
                return false;
            }

        
        $err = $client->getError();
        if ($err) 
        {
            Logs::model()->add('برگشت بانک ملت',"خطا : " . strip_tags($err) );
            return false;
        }

        
            if(isset($result) and $result==0)
            {
                return true;    
            }
        }
        return false;
}

----------


## Cyletech

> متد برگشت هم برات مینویسم امیدوارم به دردت بخوره .


حتما حتما بکارم میاد. دستت درد نکنه. من هر دو نمونه‌ای که بهم دادی رو نگه میدارم. ممنونم ازت. ولی فعلا توی همون رفتش هم من مشکل دارم؛ ایشاالله با کمک شما دوستان بتونم حلش کنم.

----------


## Cyletech

دوستان کسی اطلاعی از راه حل مشکلی که گفتم داره؟ ممنون میشم بهم کمک کنید

----------


## rezaonline.net

اول اینکه توی nu_soap پارامتر دوم رو ست نکن ، طبق چیزی که نوشتم (اینی که نوشتم الان کار میکنه روی میهن پال) .
مساله دوم order_id باید یکتا فرستاده بشه به بانک ، یا مثل من حساب کن یا از time() استفاده کن .
حالا متد bpPayRequest رو درخواست کن و نتیجه شو بذار اینجا .
باید دو قسمتی باشه ، که قسمت اولش صفر میشه اگر صحیح باشه .

اگر اینجا مشکل داشتی حتما از هاست ایران استفاده کن برای اتصال .
آی پی رو به بانک اعلام کردی ؟

کدهایی رو هم که نوشتی بذار اینجا بررسی کنیم .

----------


## Cyletech

چقدر داغونه؛ من از آخرین نسخه‌ی PHP استفاده می‌کنم. قبل از این، اون کد دو قسمتی رو بدست میاوردم ولی به صفحه‌ی پرداخت نمیرفت! بعد حالا نمیدونم چی شده وقتی از محتویات /lib در پوشه‌ی نمونه‌ی خود بانک هست استفاده می‌کنم خطای زیر رو میده:



> Warning (2): Creating default object from empty value


تصمیم گرفتم آخرین نسخه‌ی nusoap رو نصب کنم که خطا برطرف شد اما حالا خروجی درخواست، false هست.
بابت اطلاعات هم ممنونم. اون order_id رو اصلاح کردم. ممنونم ازت.

$parameters = array(
			'terminalId'=>'terminal_id', #terminal id ke az bank daryaft kardid
			'userName' => 'username', #username ke az band daryaft kardid
            'userPassword' => 'password', #password ke az bank daryaft kardid
            'orderId' => time(),
            'amount' => $amount,
            'localDate' => date('Ymd'),
            'localTime' => date('His'),
            'additionalData' =>  '',
            'callBackUrl' => 'http://'.$_SERVER['SERVER_NAME'].'/users/member/payment/pay/callback/id:'.$this->Auth->user('id'),
            'payerId' => '0'
			);

		$client = new nusoap_client('https://pgws.bpm.bankmellat.ir/pgwchannel/services/pgw?wsdl');
		$namespace = 'http://interfaces.core.sw.bps.com/';

		if ($err = $client->getError()) {
			echo '<h2>Constructor error</h2><pre>' . $err . '</pre>';
			exit;
		}
		
		if ($client->fault) {
			echo '<h2>Fault</h2><pre>';
			print_r($result);
			echo '</pre>';
			exit;
		}
		elseif($client->getError()){
			echo '<h2>Error</h2><pre>' . $err . '</pre>';
			exit;
		}
		else {
			return $client->call('bpPayRequest',$parameters,$namespace);
		}




> آی پی رو به بانک اعلام کردی ؟


من فقط برنامه‌نویس پروژه‌ای هستم و اطلاعی از این‌ها ندارم. اما میپرسم بهتون اطلاع میدم.

----------


## rezaonline.net

الان این هیچ مشکلی نداره .
ترمینال و یوزر نیم و پسورد رو درست بزنی حله .

----------


## Cyletech

درسته، احتمالا مشکل اینجا بود که من روی لوکال سعی میکردم جواب بگیرم. روی سرور درست عمل میکنه و خروجی همون کد دو بخشی هست. حالا بذارید یه تست کامل کنم نتیجه‌شو بهتون اعلام میکنم. بسیار بسیار بسیار ممنونم  :قلب: 

رضا جان خدا رو شکر وصل میشه به درگاه اما وقتی وصل شد توی خود صفحه‌ی اول درگاه خطای زیر رو میده. بنظر شما مشکل از کدوم پارامتر‌هاست؟



> متاسفانه، اطلاعات ارسال شده نامعتبر است و شما مجاز به انجام تراكنش نمي باشيد

----------


## rezaonline.net

باید اون refID رو با متد post بفرستی .
اون قسمت کدی که میفرستیش به بانک بذار اینجا .

----------


## imanitc

دوستان من خودم براي بانک ملت از اين کدها استفاده کردم خيلي راحت خوب بود. شما هم استفاده کنيد

----------


## Cyletech

دوستان خوبم، از همتون سپاسگذارم. اون خطا رو بانک همینطوری میده. گاهی درست میشه و گاهی این خطا رو میده. (دلیلش رو نمیدونم!) . بهرحال از همتون ممنونم.
فقط یک سوالی دارم، من مبلغی که کاربر واریز میکنه رو بخوام دریافت کنم در callback چطوری دریافت کنم؟ این الآن آخرین مشکلیه که دارم. ممنونم

----------


## Cyletech

> دوستان من خودم براي بانک ملت از اين کدها استفاده کردم خيلي راحت خوب بود. شما هم استفاده کنيد


 عزیزم اطلاعات درگاه رو از توی فایل بردار. برای ایمنی درگاهت میگم

----------


## MMSHFE

> دوستان خوبم، از همتون سپاسگذارم. اون خطا رو بانک همینطوری میده. گاهی درست میشه و گاهی این خطا رو میده. (دلیلش رو نمیدونم!) . بهرحال از همتون ممنونم.
> فقط یک سوالی دارم، من مبلغی که کاربر واریز میکنه رو بخوام دریافت کنم در callback چطوری دریافت کنم؟ این الآن آخرین مشکلیه که دارم. ممنونم


 شما معمولاً باید موقع سفارش اطلاعات خرید رو (مبلغ و شماره ref و... که تولید کردین) توی دیتابیس در یک جدول ذخیره کنید و وقتی خرید OK شد، شماره ref که بانک میده رو توی جدول جستجو کنید و مبلغ رو پیدا و Verify کنید.

----------


## Cyletech

آقایون من از همه‌تون کمال تشکر رو دارم. به لطف همه‌ی شما تونستم درگاه رو درست بنویسم و همه‌چی درست هست. خیلی خیلی ممنونم از همه‌تون

----------


## Cyletech

ببخشید دوستان، همیشه این اتفاق میوفته؟! که یه شب درگاه درست باز بشه و پرداخت انجام بشه و شب بعد اصلا call مقدار برگشتیش FALSE هست! آیا این درسته؟ گاهی هم که صفحه درگاه باز میشد و می‌گفت ورودی‌ها اشتباهه. 15 دقیقه بعد درست می‌شد. این‌ها طبیعیه؟ من دیشب کد رو امتحان کردم و درست بود. اما حالا خود nusoap هم اررور میده، خطای زیر:



> Notice (8): Undefined index:   [APP/Vendor/nusoap/nusoap.php, line 6636]


و ورودی هم که از call میگیرم FALSE هست.

ممنون میشم باز مثل همیشه در این رابطه هم کمکم کنید. من واقعا گیج شدم.

----------


## rezaonline.net

بانک ملت از دیشب قطع شده و قطعی تا کنون ادامه داره .
امیدوارم فردا درست کنند .

----------


## hamed_n911

با سلام به همه دوستان 
من تازه کد های sample  رو از بانک دریافت کردم از مراحلی قبلی که بیان کردین هم استفاده کردم تا به این خطا رسیدم

لطفا راهنمایی کنید، من از sample code خود بانک دارم استفاده میکنم.




        $parameters = array(
            'terminalId' => $terminalId,
            'userName' => $userName,
            'userPassword' => $userPassword,
            'orderId' => $orderId,
            'amount' => $amount,
            'localDate' => $localDate,
            'localTime' => $localTime,
            'additionalData' => $additionalData,
            'callBackUrl' => $callBackUrl,
            'payerId' => $payerId);
            
        // Call the SOAP method
        $result = $client->call('bpPayRequest', $parameters, $namespace);
        
        // Check for a fault
        if ($client->fault) {
            echo '<h2>Fault</h2><pre>';
            print_r($result);
            echo '</pre>';
            die();
        } 
        else {
            // Check for errors
            
            $resultStr  = $result;

            $err = $client->getError();
            if ($err) {
                // Display the error
                echo '<h2>Error</h2><pre>' . $err . '</pre>';
                die();
            } 
            else {
                // Display the result

                $res = explode (',',$resultStr);

                echo "<script>alert('Pay Response is : " . $resultStr . "');</script>";
                echo "Pay Response is : " . $resultStr;

                $ResCode = $res[0];





خطایی که به من میده اینه :
*Fault*

Array (     [faultcode] => soap:Client     [faultstring] => Unexpected wrapper element bpPayRequest found.   Expected {http://interfaces.core.sw.bps.com/}bpPayRequest. )

----------


## Cyletech

دوستان من یه مشکلی دارم که واقعا بدون کمک شما نمیتونم حلش کنم. کاربر به صفحه‌ی درگاه متصل میشه و تراکنش انجام میشه و برمیگرده و من نوشتم که بگه باموفقیت انجام شد اونم نشون میده ولی پولی که درخواست کرده بود به حساب ما نمیاد و برمیگرده به حساب کاربر. به عبارتی تراکنش به درستی انجام نمیشه. من براتون هرچیزی که نوشتم رو ضمیمه کردم. خیلی خیلی ممنون میشم بهش نگاه کنید و ایراداتش رو بواسطه تجربیاتتون بهم بگین تا درست کنم. خیلی سپاسگذارم. خیلی.  :قلب: 
اون فایل جاوا اسکریپت هم درسته و سر جاش گذاشتم ولی توی فایل‌های ضمیمه نگذاشتم دیگه.

----------


## aliphp1

سلام
این که قبل از تراکنش مبلغ رو در دیتابیس ذخیره کنیم و بعد از پرداخت از همون استفاده کنیم فکر می کنم ممکنه مشکل امنیتی ایجاد بکنه
راهی نیست که مبلغ رو مستقیم از خود بانک بگیریم یا حداقل چک کنیم که شماره تراکنش و مبلغ با هم می خونه یا نه (توی کال بک )
دوستانی که با تجربه هستن نظرشون رو بگن لطفا در این مورد

----------


## MMSHFE

نه ببینید شما موقع فروش یک کد منحصربفرد تحت عنوان Reference Number تولید میکنید و به بانک میدین و همون رو باید توی دیتابیس همراه با مبلغ و... ذخیره کنید و بانک در جواب تراکنش به شما Reference Number و Result Number رو میده (refNum و resNum) که اولی برای اینه که بدونید جوابی که اومده مال کدوم تراکنش توی سایت شماست و دومی نتیجه است که فکر میکنم ملت به refNum میگه orderId و به resNum میگه ResCode که این تفاوت در اسامی زیاد مهم نیست. حالا اگه تابع خاصی رو توی وب سرویس بانک تحت عنوان Settlement (فکر کنم واسه ملت اسمش bpSettleRequest بود) صدا نزنید، خرید شما قطعی نمیشه و برگشت میخوره. پس برای بانک ملت سه مرحله کار لازمه:
1- درخواست خرید با bpPayRequest
2- بررسی صحت خرید با bpVerifyRequest
3- تأیید و قطعی سازی خرید با bpSettleRequest
البته ملت متدهای دیگری هم اضافه کرده مثل bpInquiryRequest که استعلام وجه رو انجام میده و bpReversalRequest که درخواست برگشت وجه رو میفرسته (مثلاً اگه خرید انجام شد ولی دیدین کالای موردنظر تو انبار تمام شده و خواستین پول مشتری رو برگردونید).

----------


## MMSHFE

> این که قبل از تراکنش مبلغ رو در دیتابیس ذخیره کنیم و بعد از پرداخت از همون استفاده کنیم فکر می کنم ممکنه مشکل امنیتی ایجاد بکنه


 چه مشکل امنیتی؟ سیستم چک کردن مبلغ اینطوریه که شما مبلغ و شماره تراکنش رو به بانک اعلام میکنید و بهتون میگه که تراکنش با همون مبلغ انجام شده یا نه.

----------


## Cyletech

ببخشید دوستان، یک مشکلی برام پیش اومده؛ شرط زیر وقتی به صفحه‌ی callback میاد اجرا نمیشه. دلیلش چی میتونه باشه؟ ممنونم ازتون.
if (isset($_POST['‫‪saleReferenceId‬‬']) && !empty($_POST['‫‪saleReferenceId‬‬']))

----------


## rezaonline.net

saleReferenceId‬‬ نه SaleReferenceId‬‬

----------


## rezaonline.net

<?php

// vaghti ke hanooz submit nakarde

if (!empty($this->request->data) && !isset($this->request->params['pass'][2]))
{
    $resRef = $this->Mellat->request($this->request->data['quantity']);
    if (!isset($resRef[1]))
    {
        $this->Session->setFlash(__d('member', 'mellat_has_problem') , 'Info');
        return FALSE;
    }

    $this->Payment->save(array(
        'user_id' => $this->Auth->user('id') ,
        'time' => time() ,
        'amount' => $this->request->data['quantity'],
        'ref_id' => $resRef[1]
    ));
    $this->set('refId', $resRef[1]);
}

// bad az inke submit kard o raft o bargasht be safheye callback

if (isset($this->request->params['pass'][2]) && $this->request->params['pass'][2] == 'callback')
{
    if (isset($_POST['SaleReferenceId']) && !empty($_POST['SaleReferenceId']))
    {
        if ($this->Payment->find('count', array(
            'conditions' => array(
                'ref_id' => $_POST['RefId'],
                'user_id' => $this->Auth->user('id')
            )
        )) > 0)
        {
            $this->set('callback', $_POST['SaleReferenceId']);
            $pool = $this->Payment->find('first', array(
                'conditions' => array(
                    'user_id' => $this->Auth->user('id') ,
                    'ref_id' => $_POST['RefId']
                ) ,
                'fields' => 'amount'
            ));
            $this->Payment->updateAll(array(
                'sale_order_id' => $_POST['SaleOrderId'],
                'sale_reference_id' => $_POST['SaleReferenceId']
            ) , array(
                'ref_id' => $_POST['RefId'],
                'user_id' => $this->Auth->user('id')
            ));
            $amount = $pool['payments']['amount'] / 10; //vase toman kardanesh
            ClassRegistry::init('members')->updateAll(array(
                'credit' => "(`credit`+{$amount})"
            ) , array(
                'id' => $this->Auth->user('id')
            ));
        }

        if ($this->Mellat->verify($_POST['SaleOrderId'], $_POST['SaleReferenceId']))
        {
            $this->Payment->updateAll(array(
                'verified' => "'Y'",
                'sale_reference_id' => $_POST['SaleReferenceId']
            ) , array(
                'ref_id' => $_POST['RefId']
            ));
        }
    }

    if (isset($_POST['ResCode']))
    if (isset($_POST['ResCode']))
    {
        if ($_POST['ResCode'] == '0') $element = 'Errors';
        else $element = 'Successes';
        $this->Session->setFlash($this->Mellat->get_error($_POST['ResCode']) , $element);
    }
}

----------


## roytaa

خیلی خوشحال هستم که دیدم یکی بلاخره راجع به بانک ملت حرف زده
اقا من هیچ نمونه کدی نداشتم و چشم بسته کدمو ساختم در اصل
یه مشکل دارم تو برگشت
$_POST['SaleReferenceId']
خالی هست و همچین چیزی دریاف میکنم در کلیه POST ها
Array (     [RefId] => 26953931B1BE983C     [ResCode] => 17     [SaleOrderId] => 571211     [SaleReferenceId] =>      [CardHolderInfo] =>  ) 1

----------


## vebcir

داداش اسکریپتت کار نکرد
میشه راهنمایی کنی؟
ممنونم

----------


## vebcir

> دوستان من یه مشکلی دارم که واقعا بدون کمک شما نمیتونم حلش کنم. کاربر به صفحه‌ی درگاه متصل میشه و تراکنش انجام میشه و برمیگرده و من نوشتم که بگه باموفقیت انجام شد اونم نشون میده ولی پولی که درخواست کرده بود به حساب ما نمیاد و برمیگرده به حساب کاربر. به عبارتی تراکنش به درستی انجام نمیشه. من براتون هرچیزی که نوشتم رو ضمیمه کردم. خیلی خیلی ممنون میشم بهش نگاه کنید و ایراداتش رو بواسطه تجربیاتتون بهم بگین تا درست کنم. خیلی سپاسگذارم. خیلی. 
> اون فایل جاوا اسکریپت هم درسته و سر جاش گذاشتم ولی توی فایل‌های ضمیمه نگذاشتم دیگه.


ببینید باید از سمت سایت فروشنده یه کد به بانک ارسال بشه که بانک متوجه بشه محصول برای کاربر نمایش داده شده وگرنه بین 10 دقیقه تا 72 ساعت مبلغ برمیگرده به حساب خریدار...
نمونه تست برای درگاه هایی که درست کار میکنند وقتی خرید از سایت انجام شد و قبل از برگشت از بانک به سایت سرور رو ریستر کنید تا سیاتتون بالا نیاد میبینید مبلغ برگشت میخوره با اینکه موفقیت امیز بوده
پس باید یک کد مجدد ارسال بشه

----------


## moh3n_lucky

دوستان سلام؛
با استفاده از راهنمایی های عزیزان و استادان گرامی، موفق به نوشتن یک کلاس برای درگاه پرداخت بانک ملت شدم که خودتون میتونید بسته به کار خودتون شخصی سازی کنید.
سعی کردم در متن کدها، راهنمایی و کامنت های لازم را هم بگذارم. (SELF COMMENTED)
به امید اینکه مثمر ثمر واقع شود.

لینک دانلود :
http://s2.picofile.com/file/78423777...ample.rar.html

اگر مشکلی داشتید، در خدمت هستم.

----------


## dr.farhad

سلام بر دوستان کارشناس طاعات و عبادات قبول درگاه حق،
من برنامه نویس نیستم اما در این زمینه مطالعه میکنم پزشک هستم و مشکلی برای سایت موسسه حیریه ای که مدیریت میکنم پیش آمده ، سعی میکنم مشکلات سایت را خودم رفع کنم ، خیلی گشتم تا به این تایپیک رسیدم که واقعا زحمت میکشید و مشورت میدهید، مشکل اینه که چند روزه که درگاه سایت ما به بانک ملت متصل نمیشه و این خطا رو میده:

*Warning*:  include(nusoap/nusoap.php) [function.include]: failed to open stream: No such file or directory in */home/asayes/public_html/payment/Mellat.php* on line *20*

*Warning*:  include(nusoap/nusoap.php) [function.include]: failed to open stream: No such file or directory in */home/asayes/public_html/payment/Mellat.php* on line *20*

*Warning*:  include() [function.include]: Failed opening 'nusoap/nusoap.php' for inclusion (include_path='.:/usr/lib/php:/usr/local/lib/php') in */home/asayes/public_html/payment/Mellat.php* on line *20*

*Fatal error*:  Class 'soapclient' not found in */home/asayes/public_html/payment/Mellat.php* on line *24*

نمیدونم ربطی داره یا نه ولی این مشکل تقریبا بعد از ابن رخ داد که برای بهتر شدن وضعیت سئوی سایت پیوند یکتای سایت رو از id به عنوان مطلب تغییر دادم اما حالا اگر به حالت قبل هم برگردونم حل نمیشه
ممنون میشم اگر راهنمایی بفرمایید چون یرای چمع آوری کمکهای مردمی تبلیغات کردیم حالا درگاه کار نمیکنه
آدرس سایت: asayeshgahqom.com
ایمیل:asayeshgahqom@yahoo.com

----------


## 55348812

با سلام
باید خدمدتتون عرض کنم که من از تمامی کدهای بالا که گفتین به شکلهای مختلف استفاده کردم اما یه مشکل خیلی پیش پا افتاده دارم اونم اینکه تو فایلی که بانک قرار فراخونی کنه و نتیجه کار رو با متد post  ارسال کنه من $_POST('RefId ') و بقیه پارامترهای دیگم به هیج عنوان هیچی بر نمی گردونن با بانک هم صحبت کردم گفتن که اطلاعات داره post میشه امام من هیچی از متد post نمی تونم بخونم
ممنون میشم اگه بگید کار خاصی باید انجام بدم تا بتونم مقادیر رو بخونم از متد post یا نه؟

----------


## aminlv

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

تا اونجایی که می دونم از بعد این شاپرک شدن باید حتما بعد از پرداخت متد verify و settle انجام بشه تا برنگرده به حساب طرف و ظاهرا هم هست توی callback.php

ممنون میشم اگر کسی از دوستان می تونه چک کنه ببینه چیه ماجرا.
pay.zip

----------


## capitan-h

با سلام
من به خطا 24 بر می خورم یعنی (( '‫اطلاعات كاربري پذيرنده نامعتبر است‬' )) دلیل این خطا چی می تونه باشه؟
گاهی اوقات هم خطای 21 میده(('پذيرنده نامعتبر است‬')).
پسورد و نام کاربری و شماه ترمینال همگی چک  کردم درسته.
ip و موارد دیگه درست هست.
تو urlcallback این آدرس رو زدم درسته؟ 
http://www.example.com/bankphp/callback.php

----------


## MMSHFE

دوست عزیز، توی Callback باید آدرس صفحه ای از سایت خودتون رو بدین که بانک باید نتیجه تراکنش رو براش پس بفرسته. example.com یک دامنه نمونه هست (Example = مثال) که توی کدها از این اسم استفاده میشه و باید بجاش دامنه خودتون رو بگذارین.

----------


## capitan-h

خیلی ممنون. اما من عمدا example گذاشتم تو فروم، ولی تو کد خودم درست نوشتم.(سایت مورد نظر خودم) حالا میشه دوباره مطلب بالا رو بخونید و ببینید مشکل کجاست. ممنون

----------


## MMSHFE

خوب خطا که خیلی واضحه. اطلاعات پذیرنده معتبر نیست (یا پذیرنده معتبر نیست). ببینید IP سایتتون توی بانک چی ثبت شده. بعضی بانکها هم (مثل پارسیان) اگه سایتتون روی سرورهای خارجی باشه، باید به سرور جداگانه ای وصل بشین. البته ملت اگه این خطا رو بده معمولاً نام کاربری و رمز عبور رو اشتباه وارد کردین. از پشتیبانی دوباره اطلاعات رو بگیرین. گاهی اوقات اشتباه میفرستن (چند مورد تا حالا پیش اومده).

----------


## capitan-h

خیلی ممنون از پاسخ شما.
پس شاید اطلاعات اشتباه دادن چون من تمام موارد(پسورد، نام کاربری، شماره ترمینال و ip ) رو چک کردم. بعد سوال رو مطرح کردم که سوال اضافی تو فروم نگذارم. ممنون از توجه

----------


## capitan-h

سلام
صفحه پرداخت حتما به session نیاز داره؟

----------


## abtahi16

سلام دوستان!
کسی نمونه کد اتصال به درگاه رو داره که ازش جواب گرفته باشه؟
یه کد ساده میخوام بدون تم، خودم تم واسش درست می کنم. فقط اینکه کد کار کنه واسم مهمه!
ممنون میشم اگر کسی داره واسم میل کنه!
abtahi16@gmail.com

----------


## mamal72

سلام. وقت بخیر.
من توی callback پرداخت مشکل دارم. اطلاعات callback به درستی دریافت میشه و هیچ مشکلی نداره. اما وقتی متد ‫‪bpVerifyRequest‬‬ رو اجرا میکنم، نتیجه‌اش یه پیغام خطاست که خب درست درکش نمیکنم. به نظرتون مشکل کجاست؟
کد:

$params = array(
                'terminalId' => 'x',
                'userName' => 'y',
                'userPassword' => 'z',
                'orderId' => Input::get('SaleOrderId'),
                '‫‪saleOrderId‬‬' => Input::get('SaleOrderId'),
                '‫‪saleReferenceId‬‬' => Input::get('SaleReferenceId')
                );
            $result = $client->call('‫‪bpVerifyRequest‬‬', $params, $namespace);
            return $result;

نتیجه:


{
"faultcode": "soap:Client",
"faultstring": "Error reading XMLStreamReader."
}

----------


## mamal72

برای استفاده از nusoap تمامی فایل‌های داخل پوشه lib لازمه؟ چون من فقط محتوای nusoap.php رو توی یه فایلی کپی کردم و از اون استفاده میکنم.

----------


## misaqkfm

سلام دوستان عزیز جدیدترین کلاس ها و کدهای اتصال به درگاه بانک ملت (با سیستم شاپرک) در تاپیک زیر دنبال کنید
https://barnamenevis.org/showthread.p...85%D9%84%D8%AA

----------


## msfa2005

سلام دوستان و مهندسین گرامی 
من درگاه پرداخت رو برای سایتم راه انداختم اما ارور زیر رو میده کسی میتونه راهنمایی کنه
ممنون
Deprecated: Function split() is deprecated in /home/u711462261/public_html/pey/admin/php/sys.php on line 22

Deprecated: Function split() is deprecated in /home/u711462261/public_html/pey/admin/php/banks/epay.php on line 36
SendURL('','POST',{RefId:'3CFD5DA1BC63E187'});

----------


## msfa2005

سلام دوستان من اسکریپتو دانلود کردم و نصب کردم اما این پیغام رو میده نمیدونم چکارش کنم لطفا راهنمایی کنید
این پیغامو می ده :

Deprecated: Function split() is deprecated in /home/u711462261/public_html/pey/admin/php/sys.php on line 22

Deprecated: Function split() is deprecated in /home/u711462261/public_html/pey/admin/php/banks/epay.php on line 36
SendURL('','POST',{RefId:'8CD879D0146F1C65'});
که البته یکی از دوستان گفت بجای تابع split از تابع explode استفاده کن یا غیر فعال کن split رو که بلد نیستم 
از مهندسین عزیز و برنامه نویسان گرامی خواهشمندم کمک کنید مرسی

----------

