کلاس پرداخت بانک سامان SBPayment

saidshp

Member
با سلام.
اقا من یه کلاس نوشتم برای پرداخت بانک سامان که می خوام اینجا بزارم .

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

توجه داشته باشین که اگر از extension soap_php استفاده میکنید نمی تونید تو برنامه از ماژول nusoap استفاده کنید و همین طور بر عکس چون این دو یک کلاس به نام soapclient دارند به همین دلیل موقع اجرا این خطا رو میده
fatal error :Cannot redeclare class soapclient
البته تو nu soap می خواستن اسم کلاس رو تغییر بدن

در ضمن رو پیغامها هم فکر می کنم بیشتر باید کار بشه.


برای شروع یه جدول داریم با فیلدهای?

id:
res_num :کد رهگیری سمت فروشنده
ref_num : رسید بانکی
total_amont : مبلغ کل سفارش که باید پرداخت بشه
payment : مبلغی که خریدار به حساب فروشنده واریز کرده .
date_start : زمان شروع تراکنش از لحظه ای که خریدار به بانک هدایت می شود. ثانیه ای

اگر payment برابر با صفر باشه پولی پرداخت نشده ویا جواب تایید بانک بدستمون نرسیده به هر حال refNum ذخیره میشه در هر حالتی چون ممکن بعدا کاربر درخواست بده وباید بررسی بشه.
حالا اگر این دو تا فیلد یعنی totalamont و payment با هم برابر باشن پول پرداخت شده .
اگر payment کمتر از totalamont باشه مقدار پولی که کاربر واریز کرده تایید شده اما نتونستیم کل مبلغ رو برگشت بزنیم که در اینده باید این کار رو انجام بدیم.
اگر payment بیشتر از totalamont باشه پولی که کاربر واریز کرده بیشتر از کل مبلغ سفارش بوده و تایید شده اما نتونستیم مابقی مبلغ رو برگشت بزنیم که در اینده باید این کار رو انجام بدیم .

حالا کلاس .

متغیرها
action$ : ادرس ارسال مقادیر اولیه به بانک.
webMethodURL$ : ادرس اجرای وب متدها
redirectURL$ : ادرس ارسال از بانک به سایت فروشنده
totalAmont$ : کل مبلغ
refNum$ : رسید بانکی
resNum$ : کد رهگیری
merchantID$ : کد فرشنده
password$ : رمز فروشنده
msg$ : ذخیره خطا ها
errorState$ : خطاهای وضعیت
errorVerify$ : خطاهای تایید و برگشت مبلغ
state$ : تنظیم style

متدها.

سازنده : password ,merchantid رو تنظیم میکنه .

createResNum : یه کد رهگیری سمت فروشنده میسازه .

searchResNum( $ResNum ) : دنبال یه کد رهگیری می گرده .

searchRefNum( $RefNum ) : دنبال یه رسید بانکی میگرده .

saveStoreInfo( $TotalAmont ) : با گرفتن کل مبلغ سفارش کد رهگیری و مبلغ سفارش را ذخیره میکنه .

saveBankInfo($payment ) : کل مبلغی که به حساب فروشنده واریز شده رو می گیره و با رسید بانکی ذخیره میکنه .

recieverParams( $ResNum,$RefNum,$State ): پارامترهای بانک رو میگیره.


lastCheck(): وضعیت پرداخت رو مشخص می کنه تایید و یا برگشت​

VerifyTrans() : تایید پرداخت .

ReverseTrans( $revNumber ) : با گرفتن یک مبلغ اون رو به حساب کاربر برگشت میزنه.

SendParams() : کاربر رو به بانک هدایت میکنه .

setMsg($type,$index) : خطاها رو تنظیم میکنه .

getMsg($dis) : بدست اوردن خطا و یا نمایش خطا .

PHP:
<?php
/*******************************************************************************
 *                                                                             *
 * @version  sbpayment.php version 0.1                                         *
 * @copyright Copyright (c) 2008.                                              *
 * @license http://opensource.org/licenses/gpl-license.php GNU Public License. *
 * @author  [email protected].                                  *
 *                                                                             *
 *******************************************************************************/

/*
  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//www.yourdomain.com/sbpayment.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 = '',$pass = '')
    {
        $this->merchantID = $mID;
        $this->password   = $pass;

    }

    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"." : کد رهگیری " );
                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"." : کد رهگیری " );
                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 soapclient( $this->webMethodURL,'wsdl' );
        $soapProxy  = $soapClient->getProxy();
        $result     = false;

        for( $a=1;$a<6;++$a ) {
            $result  = $soapProxy->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 soapclient( $this->webMethodURL,'wsdl' );
        $soapProxy  = $soapClient->getProxy();
        $result     = false;

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

    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=\"Amount\" 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  = "<ul>\n";
            foreach ( $this->msg as $v ) { $msg .= "<li> $v </li>\n"; }
            $msg .= "</ul>\n";
            return print $msg;
        }
        return $this->msg;
    }
}


?>
مثال.

PHP:
<?php
ob_start();
header("content-type: text/html; charset=utf-8");

include './nusoap/lib/nusoap.php';
include './sbpayment.php';


$conn = mysql_connect('localhost','root','');
mysql_select_db('store',$conn);

$sb = new SBPayment("merchantID","password");

if( isset($_POST['State']) ){
    $State  = $_POST['State'];
    $RefNum = $_POST['RefNum'];
    $ResNum = $_POST['ResNum'];
    
    $sb->receiverParams($ResNum,$RefNum,$State);
    $sb->getMsg('display');

} elseif( isset( $_POST['submit'] ) ) {

    if( $sb->saveStoreInfo( $_POST['totalAmont'] ) ) {
        $sb->sendParams();
    } else {
        $sb->getMsg('display');
    }
} else { ?>

    <form action="<?php print $_SERVER['PHP_SELF']; ?>" method="post" />
    مبلغ سفارش<input type="text" name="totalAmont" />
    <input type="submit" name="submit" value="payment" />
    </form>
<?php } ?>
_____________________________________________________________________________________

فایل راهنما و sample
www.sep.ir/sample.zip
 
آخرین ویرایش:

jhoseini

Member
مرسی! : )
مشکل خیلیا با این کلاس حل میشه، کار بجای بود
18.gif
 

saidshp

Member
اقا فایلهای نمونه و راهنمای پارسیان و pardakht.com یا iranmarketcenter.com رو کسی نداره

اگه هست لینک بدین لطفا.
 

solhdoust

New Member
خطا در بازگشت از بانک سامان

سلام
من در بازگشت از بانک سامان با این خطا مواجه می شم:
fatal error :Cannot redeclare class soap
هر کار هم کردم درست نشد.
از دوستان اگر کسی آشنا هست با این تلفن تماس بگیره: 09352527726
در ضمن هزینه های احتمالی رو هم متقبل می شم
 

JS-mahdi

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

solartec

Member
دوست عزیز
جناب 531531 میشه بفرمائید این یعنی چی
شما برای قرار دادن تبلیغات مکان های بهتری وجود دارد نه در یک این سایت و نه در مبحث کلاس پرداخت بانک سامان
لطفا از قرار دادن تبلیغات که مغایر با قوانین سایت و انجمن می باشد جدا خودداری فرمائید.
 

saidshp

Member
سلام
من در بازگشت از بانک سامان با این خطا مواجه می شم:
fatal error :Cannot redeclare class soap
هر کار هم کردم درست نشد.
از دوستان اگر کسی آشنا هست با این تلفن تماس بگیره: 09352527726
در ضمن هزینه های احتمالی رو هم متقبل می شم
سلام
توجه داشته باشین که اگر از extension soap_php استفاده میکنید نمی تونید تو برنامه از ماژول nusoap استفاده کنید و همین طور بر عکس چون این دو یک کلاس به نام soapclient دارند به همین دلیل موقع اجرا این خطا رو میده
fatal error :Cannot redeclare class soapclient
البته تو nu soap می خواستن اسم کلاس رو تغییر بدن.
 
آخرین ویرایش:

HamidP

Member
سلام دوستان
با تشکر از آقا سعید
ورژن PHP من 5.2.5 هستش و ورژن library مربوط به کلاس nusoap هم 1.114 2007/11/06 هست، من توی هیچ جاش مشکل ندارم فقط وقتی از سایت بانک بر می گردم با خطای "کاربر گرامی مشکلی در تایید پرداخت پیش آمده" مواجه می شم، فکر کنم تابع VerifyTransaction که نمی دونم کجا تعریف شده کار خودش رو درست انجام نمی ده این تابع توی library خود nusoap هم نیست.
لطفا کمک کنید خیلی بهش احتیاج دارم
ممنون
 

saidshp

Member
سلام
فکر نمی کنم مشکل از nusoap باشه.

درضمن تابع verifytransaction تابعه ای هست که روی سرور بانکه و ما درخواست می کنیم که اجرا بشه و جواب تایید رو به ما بده.

همین الان متوجه یه مشکل کوچیک شدم که شاید اشکال تابع هم از اون باشه
طبق فایل نمونه بانک و استاندارد uml تابع verifyTransaction با حرف کوچیک شروع میشه در حالی که توی کلاس تابع رو با حرف بزرگ شروع کردم
البته در مورد تابع reverseTransaction هم احتما لا همین طور هست.
پس verifyTransaction
و reverseTransaction
درست هست
کلاس رو تو پست اول ویرایش میکنم

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

HamidP

Member
ممنون سعید جان اما همون قبلیه درسته چون من الان نمونه های بانک رو نگاه کردم و دیدم که با حرف بزرگ شروع کرده، مطمئنم مشکل از همین تابع هست اما چرا، نمی دونم!
 

saidshp

Member
سلام
یه مشکل دیگه هم داشت که رفع شد.
لطفا یه بار دیگه کلاس رو کپی کنید و تست کنید.
اگر هم نشد بگید ایا خطای مربوط به ارایه errorVerify رو نمایش میده یا نه.
با سپاس از شما.
 
آخرین ویرایش:

جدیدترین ارسال ها

بالا