آموزش استفاده از متدهای گزارشگیری درگاه سداد‎(بانک ملی)

تیر ۳۱, ۱۳۹۳ توسط : ReZa

طبق مستنداتی که درگاه سداد (درگاه پرداخت اینترنتی بانک ملی) ارائه داده ، شما می تونید از تراکنش های خودتون گزارش گیری کنید.
در این مقاله قصد دارم تا روش استفاده از این امکان رو به شما آموزش بدم

متدهایی که من قصد دارم تا نحوه استفاده از اون ها رو براتون قرار بدم :

  1. GetCommitReport : این متد لیست ۱۰۰ تراکنش موفق آخر رو برای شما برمی گردونه
  2. GetCommitReportByPageNumber : این متد هم دقیقا کار متد بالایی رو انجام میده با این تفاوت که لیست تراکنش های رو بر اساس بازه زمانی مد نظرتون بر می گردونه
  3. GetTransactionReportByPageNumber : این متد هم لیست تراکنش ها رو برمی گردونه

خوب برای شروع آموزش متد GetCommitReportByPageNumberرو توضیح می دم :

GetCommitReportByPageNumber($merchant_id,$terminal_id,$timestamp,$fp,$from_date,$to_date,$from_hour,$to_hour,$trace_no,$amount,$order_id,$page)

 

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

پارامترهای این تابع به صورت زیر باید ارسال بشن :
$merchant_id :     شماره مشتری
$terminal_id   :    شماره پذیرنده
$timestamp    :    زمان سرور
$fp :         امضای دیجیتال
$from_date :    تاریخ شروع گزارش به صورت شمسی و به فرمت ۱۳۹۳۰۴۲۹ ( همون تاریخ شمسی خودمون بدون / )
$to_date :    تاریخ پایان گزارش به صورت شمسی و به فرمت ۱۳۹۳۰۴۳۱ ( همون تاریخ شمسی خودمون بدون / )
$from_hour :     ساعت شروع با فرمت ۰۰:۰۰
$to_hour :    ساعت پایان با فرمت ۲۳:۵۹
$trace_no :     شماره پیگیری
$amount :     مبلغ تراکنش
$order_id :     شماره سفارش
$page :         شماره صفحه

خروجی این تابع یه آرایه است که به صورت زیر برای شما برگشت داده میشه :

array(
    XMLReportSchema,                # شمای خروجی xml
    TotalPage,                # تعداد کل صفحات
    GetCommitReportByPageNumberResult        # لیست تراکنش ها به صورت xml
)

چند تا نکته مهم در مورد این متد :

 

 

 

تابع GetCommitReport

این متد هم مثل متد GetCommitReportByPageNumber هست با این تفاوت که تنها ۱۰۰ تراکنش آخر رو برمی گردونه و دیگه خبری از شماره صفحه و تعداد کل صفحات نیست.

GetCommitReport($merchant_id,$terminal_id,$timestamp,$fp,$from_date,$to_date,$from_hour,$to_hour,$trace_no,$amount,$order_id)

پارامتر های این متد به صورت زیر هست
$merchant_id :     شماره مشتری
$terminal_id   :    شماره پذیرنده
$timestamp    :    زمان سرور
$fp :         امضای دیجیتال
$from_date :    تاریخ شروع گزارش به صورت شمسی و به فرمت ۱۳۹۳۰۴۲۹
$to_date :    تاریخ پایان گزارش به صورت شمسی و به فرمت ۱۳۹۳۰۴۳۱
$from_hour :     ساعت شروع با فرمت ۰۰:۰۰
$to_hour :    ساعت پایان با فرمت ۲۳:۵۹
$trace_no :     شماره پیگیری
$amount :     مبلغ تراکنش
$order_id :     شماره سفارش

خروجی این متد به صورت زیر هست

array(
    XMLReportSchema,                # شمای خروجی xml
    GetCommitReportResult            # لیست تراکنش ها به صورت xml
)
که GetCommitReportResult لیست تراکنش ها به صورت xml هست

متد GetTransactionReportByPageNumber

این متد تراکنش های شما در تاریخ خاصی رو به صورت صفحه های ۱۰۰ تایی در اختیار شما قرار میده

 

GetTransactionReportByPageNumber($merchant_id,$terminal_id,$timestamp,$fp,$date,$page)

پارامتر های این متد به صورت زیر هست
$merchant_id :     شماره مشتری
$terminal_id   :    شماره پذیرنده
$timestamp    :    زمان سرور
$fp :         امضای دیجیتال
$date :        تاریخ تراکنش ها به صورت ۱۳۹۳۰۴۳۱
$page:        شماره صفحه

خروجی این متد به صورت زیر هست

array(
    XMLReportSchema,                # شمای خروجی xml
    TotalPage,                # تعداد کل صفحات
    GetTransactionReportByPageNumberResult    # لیست تراکنش ها به صورت xml
)

متد GetTransactionReportWithSettlementDateByPageNumber

این متد تراکنش ها رو براساس تاریخ تسویه به صورت صفحه های ۱۰۰ تایی برمی گرداند

GetTransactionReportWithSettlementDateByPageNumber($merchant_id,$terminal_id,$timestamp,$fp,$date,$date_settle,$page)

پارامتر های این متد به صورت زیر هست
$merchant_id :     شماره مشتری
$terminal_id   :    شماره پذیرنده
$timestamp    :    زمان سرور
$fp :         امضای دیجیتال
$date :        تاریخ تراکنش ها به صورت ۱۳۹۳۰۴۳۱
$date_settle :    تاریخ تسویه به صورت ۱۳۹۳۰۴۳۱
$page:        شماره صفحه

خروجی این متد به صورت زیر هست

array(
    XMLReportSchema,                # شمای خروجی xml
    TotalPage,                # تعداد کل صفحات
    GetTransactionReportByPageNumberResult    # لیست تراکنش ها به صورت xml
)

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

خب متدهای بالا رو که مطالعه کردید.حالا بریم یه نمونه کد هم ببینیم تا همه چی برامون روشن بشه :

<?php
class ReportSadad {
    private $_merchant_id     = 'Your Merchant ID';
    private $_terminal_id       = 'Your Terminal ID';
    private $_transactionKey     = 'Your Transaction Key';
    private $_url         = 'https://sadad.shaparak.ir/services/MerchantUtility.asmx?wsdl';
    /**
    * تولید امضای دیجیتالی
    * @param int $time            زمان سرور سداد
    * @return string
    */
    private function generate_fp($time) {
        $string = $time.$this->_merchant_id.$this->_terminal_id.$this->_transactionKey;
        $hash = strtoupper(md5($string));
        $len = strlen($hash);
        $i = 0;
        $fp = '';
        while($i < $len) {
            $fp.=substr($hash,$i,2).'-';
            $i += 2;
        }
        $fp = substr($fp,0,-1);
        return $fp;
    }

    /**
      *  دریافت کانکشن وب سرویس درگاه بانکی
     * @return nusoap_client
     * @throws Exception
     */
    private function getClient() {
        $client = new nusoap_client($this->_url,'wsdl');
        if($client !== FALSE)
            return $client->getProxy();

        throw new Exception('در اتصال به وب سرویس بانک خطایی رخ داده است.');
    }

    /**
      *  دریافت لیست تراکنش های موفق
     * @param string $from    تاریخ شروع 
     * @param string $from_hour    ساعت شروع 
     * @param string $to    تاریخ پایان
     * @param string $to_hour    تاریخ پایان
     * @param int $page    شماره صفحه
     * @return array
     */    
    public function commit_transactions($from,$from_hour,$to,$to_hour,$page = 1) {
        $client = $this->getClient();
        $time = $client->CalcTimeStamp();    # دریافت زمان سرور سداد
        $time = $time['CalcTimeStampResult'];    

        $result = $client->GetCommitReportByPageNumber($this->_merchant_id,$this->_terminal_id,$time,$this->generate_fp($time),$from,$to,$from_hour,$to_hour,NULL,NULL,NULL,$page);
        
        # چون خروجی به صورت xml هست اول باید اون رو parse کنیم تا بتونیم ازش در پروژه مون استفاده کنیم
        $output = array();        
        if(isset($result['GetCommitReportByPageNumberResult'])) {
            $xml = simplexml_load_string($result['GetCommitReportByPageNumberResult']);
            foreach($xml->Transaction as $transaction) {
                $output['transaction'] = objectToArray($transaction);
            }
            $output['total_page'] = $xml['TotalPage'];
        }
        
        return $output;
    }

    /**
      *  دریافت لیست تراکنش های یک تاریخ خاص
     * @param string $date    تاریخ
     * @param int $page    شماره صفحه
     * @return array
     */    
    public function transactions($date,$page = 1) {
        $client = $this->getClient();
        $time = $client->CalcTimeStamp();    # دریافت زمان سرور سداد
        $time = $time['CalcTimeStampResult'];    

        $result = $client->GetTransactionReportByPageNumber($this->_merchant_id,$this->_terminal_id,$time,$this->generate_fp($time),$date,$page);
        
        # چون خروجی به صورت xml هست اول باید اون رو parse کنیم تا بتونیم ازش در پروژه مون استفاده کنیم
        $output = array();        
        if(isset($result['GetTransactionReportByPageNumber'])){
            $xml = simplexml_load_string($result['GetTransactionReportByPageNumber']);
            foreach($xml->InternetTransaction as $transaction) {
                $output['transaction'] = objectToArray($transaction);
            }
            $output['total_page'] = $xml['TotalPage'];
        }
        
        return $output;
    }

    /**
      *  دریافت لیست تراکنش ها براساس تاریخ تسویه
     * @param string $date    تاریخ تسویه
     * @param int $page    شماره صفحه
     * @return array
     */    
    public function transactions_settle($date,$page = 1) {
        $client = $this->getClient();
        $time = $client->CalcTimeStamp();    # دریافت زمان سرور سداد
        $time = $time['CalcTimeStampResult'];    

        $result = $client->GetTransactionReportWithSettlementDateByPageNumber($this->_merchant_id,$this->_terminal_id,$time,$this->generate_fp($time),$date,$page);
        
        # چون خروجی به صورت xml هست اول باید اون رو parse کنیم تا بتونیم ازش در پروژه مون استفاده کنیم
        $output = array();        
        if(isset($result['GetTransactionReportWithSettlementDateByPageNumberResult'])){
            $xml = simplexml_load_string($result['GetTransactionReportWithSettlementDateByPageNumberResult']);
            foreach($xml->InternetTransaction as $transaction) {
                $output['transaction'] = objectToArray($transaction);
            }
            $output['total_page'] = $xml['TotalPage'];
        }
        
        return $output;
    }

}

/**
 * تبدیل آبجت به آرایه
 * @param object $object
 * @return array
 */
function objectToArray( $object )
{
    if( !is_object( $object ) && !is_array( $object ) ) {
        return $object;
    }
    if( is_object( $object ) ) {
        $object = get_object_vars( $object );
    }
    return array_map( 'objectToArray', $object );
}


$report = new ReportSadad();
echo '<pre>&#039;;
print_r($report-&gt;transactions(&#039;13930431&#039;,1));
print_r($report-&gt;commit_transactions(&#039;13930428&#039;,&#039;00:00&#039;,&#039;13930430&#039;,&#039;23:59&#039;,1));
print_r($report-&gt;transactions_settle(&#039;13930431&#039;,1));

echo &#039;</pre>';
?>

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

هر سوالی داشتید من در خدمتم

موفق باشید

 

بازدید : ۴۳۰۱

محسن
مرداد ۲, ۱۳۹۳ @ ۴:۰۳ ب.ظ

درود بر شما. آیا سورس آماده درگاه بانک ملی را دارید؟

پاسخ دادن
شاهین
اردیبهشت ۱۷, ۱۳۹۴ @ ۶:۵۸ ب.ظ

سلام و سپاس از این آموزش
من lib نوسواپ رو به اول کدهای شما اضافه کردم ، اما خروجی آن خالی است: Array()

مشکل از کجاست؟

پاسخ دادن
شاهین
تیر ۲۶, ۱۳۹۴ @ ۶:۱۸ ب.ظ

Warning: Illegal string offset ‘CalcTimeStampResult’ in /home/admin/domains/example.com/public_html/gozaresh.class.php on line 65
Array ( )
Warning: Illegal string offset ‘CalcTimeStampResult’ in /home/admin/domains/example.com/public_html/gozaresh.class.php on line 91
Array ( )

پاسخ دادن
شاهین
تیر ۲۶, ۱۳۹۴ @ ۶:۲۰ ب.ظ

ارور بالا به چه دلیل رخ داده است؟
لطفا راهنمایی فرمائید

پاسخ دادن
    شاهین
    شهریور ۳۰, ۱۳۹۴ @ ۱۲:۲۲ ق.ظ

    سلام
    شما که پاسخگو نیستید! چرا عنوان میکنید هر سوالی بود در خدمتم؟

    پاسخ دادن

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *


*