سلام
دوستان يك نگاهي به كلاس پرداخت زير بكنيد ببينيد كجاش مشكل داره.
من كه گيج موندم.
پرداخت انجام ميشه ولي وقتي از سايت بانك به سايت ما مياد ميگه پرداخت با موفقيت انجام شد ولي بالاي صفحه اين ارور رو ميده : The following error occured:
و وضعيت فاكتور همون پرداخت نشده باقي ميمونه.
دوستان اگر راه حلي دارند بفرمايند.

کد:
<html>
<head>
<META HTTP-EQUIV="REFRESH" CONTENT="5;URL=http://domain.org/clientarea.php">
<title>نتیجه پرداخت شما</title>
</head>
<body>

</body>
</html>
<?php

    /*
      CREATE TABLE sbpayment (id INT(10) NOT NULL AUTO_INCREMENT,
                              res_num CHAR(20) NOT NULL,
                              ref_num CHAR(20) NOT NULL,
                              total_amont INT NOT NULL,
                              payment INT NOT NULL DEFAULT 0,
                              date_start INT(12) NOT NULL,
                              primary key(id),
                              unique(res_num),
                              index(ref_num));
    */

    class SBPayment
    {

        public $action  = 'https://acquirer.sb24.com/CardServices/controller';

        public $webMethodURL = 'https://Acquirer.sb24.com/ref-payment/ws/ReferencePayment?WSDL';

        public $redirectURL = 'http://domain.org/modules/gateways/callback/saman.php';

        public $totalAmont;

        public $refNum;

        public $resNum;

        protected $payment;

        protected $merchantID;

        protected $password;

        protected $msg = array();

        protected $errorState = array(
        'Canceled By User'     => 'تراکنش بوسيله خريدار کنسل شده',
        'Invalid Amount'       => 'مبلغ سند برگشتي  از مبلغ تراکنش اصلي بيشتر است',
        'Invalid Transaction'  => 'درخواست برگشت تراکنش رسيده است در حالي که تراکنش اصلي پيدا نمي شود',
        'Invalid Card Number'  => 'شماره کارت اشتباه است',
        'No Such Issuer'       => 'چنين صادر کننده کارتي وجود ندارد',
        'Expired Card Pick Up' => 'از تاريخ انقضاي کارت گذشته است',
        'Incorrect PIN'        => 'رمز کارت اشتباه است pin',
        'No Sufficient Funds'  => 'موجودي به اندازه کافي در حساب شما نيست',
        'Issuer Down Slm'      => 'سيستم کارت بنک صادر کننده فعال نيست',
        'TME Error'            => 'خطا در شبکه بانکي',
        'Exceeds Withdrawal Amount Limit'      => 'مبلغ بيش از سقف برداشت است',
        'Transaction Cannot Be Completed'      => 'امکان سند خوردن وجود ندارد',
        'Allowable PIN Tries Exceeded Pick Up' => 'رمز کارت 3 مرتبه اشتباه وارد شده کارت شما غير فعال اخواهد شد',
        'Response Received Too Late'           => 'تراکنش در شبکه بانکي تايم اوت خورده',
        'Suspected Fraud Pick Up'              => 'اشتباه وارد شده cvv2 ويا ExpDate فيلدهاي'
        );

        protected $errorVerify = array(
        '-1'  => 'خطاي داخلي شبکه',
        '-2'  => 'سپرده ها برابر نيستند',
        '-3'  => 'ورودي ها حاوي کاراکترهاي غير مجاز ميباشد',
        '-4'  => 'کلمه عبور يا کد فروشنده اشتباه است',
        '-5'  => 'خطاي بانک اطلاعاتي',
        '-6'  => 'سند قبلا برگشت کامل خورده',
        '-7'  => 'رسيد ديجيتالي تهي است',
        '-8'  => 'طول ورودي ها بيشتر از حد مجاز است',
        '-9'  => 'وجود کارکترهاي غير مجاز در مبلغ برگشتي',
        '-10' => 'رسيد ديجيتالي حاوي کارکترهاي غير مجاز است',
        '-11' => 'طول ورودي ها کمتر از حد مجاز است',
        '-12' => 'مبلغ برگشتي منفي است',
        '-13' => 'مبلغ برگشتي براي برگشت جزيي بيش از مبلغ برگشت نخورده رسيد ديجيتالي است',
        '-14' => 'چنين تراکنشي تعريف نشده است',
        '-15' => 'مبلغ برگشتي به صورت اعشاري داده شده',
        '-16' => 'خطاي داخلي سيستم',
        '-17' => 'برگشت زدن تراکنشي که با کارت بانکي غير از بانک سامان انجام شده',
        '-18' => 'فروشنده نامعتبر است ip address'
        );

        public $style = array('TableBorderColor' => '',
                              'TableBGColor'     => '',
                              'PageBGColor'      => '',
                              'PageBorderColor'  => '',
                              'TitleFont'        => '',
                              'TitleColor'       => '',
                              'TitleSize'        => '',
                              'TextFont'         => '',
                              'TextColor'        => '',
                              'TextSize'         => '',
                              'TypeTextColor'    => '',
                              'TypeTextColor'    => '',
                              'TypeTextSize'     => '',
                              'LogoURI'          => ''
                              );

        function __construct($mID = 'xxxxxxxxx',$pass = 'xxxxxxxx')
        {
            $this->merchantID = $mID;
            $this->password   = $pass;

        }

 function get_content($url)  
 {  
    $ch = curl_init();  
   
    curl_setopt ($ch, CURLOPT_URL, $url);  
    curl_setopt ($ch, CURLOPT_HEADER, 0);  
   
    ob_start();  
   
    curl_exec ($ch);  
    curl_close ($ch);  
    $string = ob_get_contents();  
   
    ob_end_clean();  
      
    return $string;      
   
 }        protected function createResNum()
        {
            do{
                $m = md5(microtime());
                $resNum = substr($m,0,20);
                $search = mysql_query("SELECT res_num FROM sbpayment WHERE res_num = '$resNum'");
                if( mysql_num_rows($search) < 1 ) {
                    break;
                }
            }while( true ); 
            $this->resNum = $resNum;
        }

        protected function searchResNum( $resNum )
        {
            $search = mysql_query( "select * FROM sbpayment WHERE res_num='$resNum'");
            if ( mysql_num_rows( $search ) < 1 ) {
                return false;
            }
            return mysql_fetch_assoc( $search );
        }

        protected function searchRefNum( $refNum )
        {
            $search = mysql_query( "select * FROM SBPayment WHERE ref_num = '$refNum'" );
            if ( mysql_num_rows( $search ) < 1 ) {
                return false;
            }
            return mysql_fetch_assoc( $search );
        }

        protected function saveBankInfo( $payment )
        {
            $this->payment = $payment;
            return mysql_query( "UPDATE sbpayment SET ref_num = '$this->refNum' ,payment = '$payment' WHERE res_num = '$this->resNum'" ) or $this->setMsg(mysql_error());
        }

        public function saveStoreInfo( $totalAmont )
        {
            if( $totalAmont == '' ) {
                $this->setMsg( "Error: TotalAmont" );
                return false;
            }
            $time = time();
            $this->totalAmont = $totalAmont;
            $this->createResNum();
            return mysql_query( "INSERT INTO sbpayment SET res_num = '$this->resNum', total_amont = '$this->totalAmont', date_start = $time" ) or $this->setMsg(mysql_error());
        }

         public function receiverParams( $resNum = '' , $refNum = '' ,$state = '' )
        {
            if( ( empty($state) or empty($resNum) or strlen($refNum) != 20 ) or $state != 'OK' ) {
                if(isset($this->errorState[$state])) {
                    $this->setMsg( 'state',$state );
                } else {
                    $this->setMsg("error state");
                }
                return false;
            }

            $searchResNum = $this->searchResNum( $resNum );

            if( is_array( $searchResNum ) ) {
                if( $searchResNum['payment'] > 0) {
                    $this->setMsg( "لطفا به قسمت رهگيري سفازش مراجعه کنيد" );
                    return false;
                }
            } else {
                $this->setMsg("همچين تراکنشي در سمت فروشنده تعريف نشده");
                return false;
            }

            $this->refNum     = $refNum;
            $this->resNum     = $resNum;
            $this->totalAmont = $searchResNum['total_amont'];

            return $this->lastCheck();
        }


        protected function lastCheck()
        {
            if( empty($this->resNum) or strlen($this->refNum) != 20 ) {
                $this->setMsg( "Error: resNum or refNum is empty" );
                return false;
            }
            //web method verify transaction
            $verify     = $this->verifyTrans();

            if( $verify > 0 ) {
                if( $verify == $this->totalAmont ) {

                    $this->saveBankInfo( $verify );
                    $this->setMsg("پرداخت با موفقيت انجام شد  لطفا کد رهگيري را يادداشت کنيد");
                    $this->setMsg( "$this->resNum"." : کد رهگيري " );
                    $this->addPaymentToInvoice($this->resNum,$this->refNum);
get_content("http://domain.org/includes/addinvoicepayment.php?invoiceid=4050&transid=test");
                    return true;


                } elseif( $verify > $this->totalAmont ) {
/*
                    //web method partial reverse transaction
                    $revAmont = $verify - $this->totalAmont;
                    $reverse  = $this->reverseTrans( $revAmont );

                    $this->setMsg("کاربر گرامي  مبلغ پرداختي بيش از مبلغ درخواستي است");
                    if( $reverse == 1 ) {
                        $this->setMsg("مابقي مبلغ پرداخت شده به حساب شما برگشت خورده");
                        $this->saveBankInfo( $this->totalAmont );
                    } else {
                        $this->setMsg( 'verify',$reverse );
                        $this->setMsg( "ما بقي مبلغ پرداختي شما در اينده اي نزديک به حساب شما برگشت خواهد خورد " );
                        $this->saveBankInfo( $verify );
                    }
*/
                    $this->setMsg("پرداخت با موفقيت انجام شد  لطفا کد رهگيري را يادداشت کنيد");
                    $this->setMsg( "$this->resNum"." : کد رهگيري " );
                    $this->addPaymentToInvoice($this->resNum,$this->refNum);
                     //add invoice to whmcs
                    return true;


                } elseif( $verify < $this->totalAmont ) {

                    //web method full reverse transaction
                    $rev     = $this->reverseTrans( $verify );
                    $this->setMsg("مبلغ پرداختي شما کمتر از مباغ سفارش است ");
                    if( $rev == 1 ) {
                        $this->setMsg("کل مبلغ پرداختي به حساب شما برگشت خورده");
                        $this->saveBankInfo( 0 );
                    } else {
                        $this->setMsg("در اينده اي نزديک کل مبلغ پرداختي به حساب شما برگشت خواهد خورد لطفا براي پي گيري کد رهگيري را يادداشت کنيد");
                        $this->setMsg( "$this->resNum"." : کد رهگيري " );
                        $this->setMsg( 'verify',$rev );
                        $this->saveBankInfo( $verify );
                    }
                    return false;
                }
                //Error transaction
            } elseif ( $verify < 0 or $verify == false ) {
                $this->setMsg( "کاربر گرامي مشکلي در تاييد  پرداخت پيش امده" );
                $this->setMsg( 'verify',$verify );
                $this->saveBankInfo( 0 );
                return false;
            }
        }
       protected function verifyTrans()
        {
            if(empty($this->refNum) or empty($this->merchantID) ) {
                return false;
            }
            $soapClient = new nusoap_client( $this->webMethodURL,'wsdl' );
            $soap*****  = $soapClient->get*****();
            $result     = false;

            for( $a=1;$a<6;++$a ) {
                $result  = $soap*****->verifyTransaction( $this->refNum,$this->merchantID );
                if( $result != false ) {
                    break;
                }
            }
            return $result;
        }

        protected function reverseTrans( $revNumber )
        {
            if( $revNumber <= 0 or empty($this->refNum) or empty($this->merchantID) or empty($this->password) ) {
                return false;
            }
            $soapClient = new nusoap_client( $this->webMethodURL,'wsdl' );
            $soap*****  = $soapClient->get*****();
            $result     = false;

            for( $a=1;$a<6;++$a ) {
                $result     = $soap*****->reverseTransaction( $this->refNum,$this->merchantID,$this->password,$revNumber );
                if( $result != false )
                    break;
            }
            return $result;
        }

       public function addPaymentToInvoice($resNum,$refNum)
       {

        $url = "http://domain.org/includes/api.php"; # URL to WHMCS API file
        $username = "Admin"; # Admin username goes here
        $password = "demo"; # Admin password goes here

        $postfields["username"] = $username;
        $postfields["password"] = md5($password);
        $postfields["action"] = "addinvoicepayment"; #action performed by the API:Functions
        $postfields["invoiceid"] = $resNum;
        $postfields["transid"] = $refNum;
        $postfields["gateway"] = "Saman Bank";

        $ch = curl_init();
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_POST, 1);
        curl_setopt($ch, CURLOPT_TIMEOUT, 100);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields);
        $data = curl_exec($ch);
        curl_close($ch);

        $data = explode(";",$data);
        foreach ($data AS $temp) {
        $temp = explode("=",$temp);
        $results[$temp[0]] = $temp[1];
        }

        if ($results["result"]=="success") {
        # Result was OK!
        } else {
        # An error occured
        echo "The following error occured: ".$results["message"];
        }
}
        public function sendParams()
        {

            if ( $this->totalAmont <= 0 or empty($this->action) or empty($this->redirectURL) or empty($this->resNum) or empty($this->merchantID) ) {
                $this->setMsg( "Error: function sendParams()" );
                return false;
            }
            $form  = "<html>";
            $form .= "<body onLoad=\"document.forms['sendparams'].submit();\" >";
            $form .= "<form name=\"sendparams\" method=\"POST\" action=\"$this->action\" enctype=\"application/x-www-form-urlencoded\" >\n";
            foreach ( $this->style as $key=>$val ) {
                if( $val != '' ) {
                    $form .= "<input type=\"hidden\" name=\"$key\" value=\"$val\" />\n";
                }
            }
            $form .= "<input type=\"hidden\" name=\"Amont\" value=\"$this->totalAmont\" />\n";
            $form .= "<input type=\"hidden\" name=\"ResNum\" value=\"$this->resNum\" />\n";
            $form .= "<input type=\"hidden\" name=\"MID\" value=\"$this->merchantID\" />\n";
            $form .= "<input type=\"hidden\" name=\"RedirectURL\" value=\"$this->redirectURL\" />\n";
            $form .= "</form>";
            $form .= "</body>";
            $form .= "</html>";

            print $form;
        }

        protected function setMsg($type='',$index='')
        {
            if ( $type == 'state' and isset( $this->errorState[$index] ) ) {
                $this->msg[] = $this->errorState[$index];

            } elseif( $type == 'verify' and isset($this->errorVerify[$index]) ) {
                $this->msg[] = $this->errorVerify[$index];

            } elseif( $type != 'verify' and $type != 'state') {
                $this->msg[] = "$type";
            }
        }

        public function getMsg($dis='')
        {
            if( count($this->msg) == 0 ) return array();
            if( $dis == 'display' ) {
                $msg  = "<div style=vertical-align:middle;margin-top:100px;text-align:center;font-family:Tahoma;font-weight:bold;font-size:9pt;><ul>\n";
                foreach ( $this->msg as $v ) { $msg .= "<li> $v </li>\n"; }
                $msg .= "</ul></div>\n";
                return print $msg;
            }
            return $this->msg;
        }
    }


    ?>