# زبان های اسکریپتی > PHP > CakePHP > حرفه ای: کامپوننت پرداخت آنلاین بانک ملت  در فریم ورک کیک

## Mahdi-563

با توجه به اینکه سیستم پرداخت بانک ملت تغییرات زیادی داشته کامونت اصلاح  شده و 100 تضمین شده را به تمامی آشپز های عزیز تقدیم می کنم :
[ نکته : این کد بروی سرور های خارجی کاملا تست شده و جواب میده ]


//you can find more about it in http://www.webuniq.com
//by : m. mousavi

<!doctype html>
<html>
<head>
    <script>
        function postRefId(refIdValue) {
            var form = document.createElement("form");
            form.setAttribute("method", "POST");
            form.setAttribute("action", "https://pgw.bpm.bankmellat.ir/pgwchannel/startpay.mellat");
            form.setAttribute("target", "_self");
            var hiddenField = document.createElement("input");
            hiddenField.setAttribute("name", "RefId");
            hiddenField.setAttribute("value", refIdValue);
            form.appendChild(hiddenField);

            document.body.appendChild(form);
            form.submit();
            document.body.removeChild(form);
        }
    </script>
</head>
<body>

<?php
App::import('Vendor', 'nusoap');
App::uses('Component', 'Controller');
Class MellatPaymentComponent extends Component
{

public function CheckStatus($ecode)
    {
                       $tmess="شرح خطا:";
                       switch ($ecode) 
                         {
                          case 0:
                            $tmess="تراکنش با موفقیت انجام شد";
                            break;
                          case 11:
                            $tmess="شماره کارت معتبر نیست";
                            break;
                          case 12:
                            $tmess= "موجودی کافی نیست";
                            break;
                          case 13:
                            $tmess= "رمز دوم شما صحیح نیست";
                            break;
                          case 14:
                            $tmess= "دفعات مجاز ورود رمز بیش از حد است";
                            break;
                          case 15:
                            $tmess= "کارت معتبر نیست";
                            break;
                          case 16:
                            $tmess= "دفعات برداشت وجه بیش از حد مجاز است";
                            break;
                          case 17:
                            $tmess= "کاربر از انجام تراکنش منصرف شده است";
                            break;
                          case 18:
                            $tmess= "تاریخ انقضای کارت گذشته است";
                            break;
                          case 19:
                            $tmess= "مبلغ برداشت وجه بیش از حد مجاز است";
                            break;
                          case 111:
                            $tmess= "صادر کننده کارت نامعتبر است";
                            break;
                          case 112:
                            $tmess= "خطای سوییچ صادر کننده کارت";
                            break;
                          case 113:
                            $tmess= "پاسخی از صادر کننده کارت دریافت نشد";
                            break;
                          case 114:
                            $tmess= "دارنده کارت مجاز به انجام این تراکنش نمی باشد";
                            break;
                          case 21:
                            $tmess= "پذیرنده معتبر نیست";
                            break;
                          case 23:
                            $tmess= "خطای امنیتی رخ داده است";
                            break;
                          case 24:
                            $tmess= "اطلاعات کاربری پذیرنده معتبر نیست";
                            break;
                          case 25:
                            $tmess= "مبلغ نامعتبر است";
                            break;
                          case 31:
                            $tmess= "پاسخ نامعتبر است";
                            break;
                          case 32:
                            $tmess= "فرمت اطلاعات وارد شده صحیح نیست";
                            break;
                          case 33:
                            $tmess="حساب نامعتبر است";
                            break;
                          case 34:
                            $tmess= "خطای سیستمی";
                            break;
                          case 35:
                            $tmess= "تاریخ نامعتبر است";
                            break;
                          case 41:
                            $tmess= "شماره درخواست تکراری است";
                            break;
                          case 42:
                            $tmess= "تراکنش Sale یافت نشد";
                            break;
                          case 43:
                            $tmess= "قبلا درخواست Verify داده شده است";
                            break;
                          case 44:
                            $tmess= "درخواست Verify یافت نشد";
                            break;
                          case 45:
                            $tmess= "تراکنش Settle شده است";
                            break;
                          case 46:
                            $tmess= "تراکنش Settle نشده است";
                            break;
                          case 47:
                            $tmess= "تراکنش Settle یافت نشد";
                            break;
                          case 48:
                            $tmess= "تراکنش Reverse شده است";
                            break;
                          case 49:
                            $tmess= "تراکنش Refund یافت نشد";
                            break;
                          case 412:
                            $tmess= "شناسه قبض نادرست است";
                            break;
                          case 413:
                            $tmess= "شناسه پرداخت نادرست است";
                            break;
                          case 414:
                            $tmess= "سازمان صادر کننده قبض معتبر نیست";
                            break;
                          case 415:
                            $tmess= "زمان جلسه کاری به پایان رسیده است";
                            break;
                          case 416:
                            $tmess= "خطا در ثبت اطلاعات";
                            break;
                          case 417:
                            $tmess= "شناسه پرداخت کننده نامعتبر است";
                            break;
                          case 418:
                            $tmess= "اشکال در تعریف اطلاعات مشتری";
                            break;
                          case 419:
                            $tmess= "تعداد دفعات ورود اطلاعات بیش از حد مجاز است";
                            break;
                          case 421:
                            $tmess= "IP معتبر نیست";
                            break;
                          case 51:
                            $tmess= "تراکنش تکراری است";
                            break;
                          case 54:
                            $tmess= "تراکنش مرجع موجود نیست";
                            break;
                          case 55:
                            $tmess= "تراکنش نامعتبر است";
                            break;
                          case 61:
                            $tmess= "خطا در واریز";
                            break;
                         }    
    return $ecode.':'.$tmess;
    }

    function startup(Controller $controller)
    {
        $this->controller = $controller;
    }

    private function getResRef($amount = 0, $url)
    {
        $orderID    = rand();
        $date       = date("Ymd");
        $time       = date("His");
        $parameters = array(
            'terminalId'     => Configure::read('Settings.pay.terminalId'),
            'userName'       => Configure::read('Settings.pay.userName'),
            'userPassword'   => Configure::read('Settings.pay.password'),
            'orderId'        => $orderID,
            'amount'         => $amount,
            'localDate'      => $date,
            'localTime'      => $time,
            'additionalData' => '',
            'callBackUrl'    => $url,
            'payerId'        => "0"
        );
        $client     = new nusoap_client('https://pgwsf.bpm.bankmellat.ir:443/pgwchannel/services/pgw?wsdl');
        $namespace  = 'http://interfaces.core.sw.bps.com/';

        return $client->call('bpPayRequest', $parameters, $namespace);
    }

    public function paymentRequest($amount = 0, $url)
    {
        $ResRef = $this->getResRef($amount, $url);
        $ResRef = explode(',', $ResRef);

        $ResCode = $ResRef[0];
        settype($ResCode, "string");
        if (!empty($ResRef[1])) {
            $RefId = $ResRef[1];
            settype($RefId, "string");
        }

        if (isset($RefId))
            echo "<script>postRefId('" . $RefId . "');</script>";
        else
            echo "<script>alert('امکان اتصال وجود ندارد ، لطفاً دوباره تلاش کنید.');</script>";
    }
}

?>
</body>
</html>

----------


## zoghal

درود بر شما. 
دوست عزیز غیر استاندارد و غیر اصولی کار کردید. یک کلاس کاموننت+html!!!
درضمن نحوه فراخوانیش رو هم مشخص نکردید.
پیشنهاد می کنم بعد از کامل کردن در گیت هاپ هم متشرش کنید.

----------


## cybercoder

> [ نکته : این کد بروی سرور های خارجی کاملا تست شده و جواب میده ]


100% چون من از همین روش پارسال استفاده و قبل از release تستش کرده بودم.

در ضمن این حالت کمینه ترین حالت این کامپوننت هست. رعایت ساختار MVC وحی منزل نیست و در برخی موارد نیاز به OverRide هست تا Optimum کار بشه. البته بعید می دونم برای برخی که در حد کپی paste هستن قابل درک باشه زیاد توجه نکن.

----------


## Mahdi-563

با تشکر از تمامی دوستان

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

فراخوانی خیلی سادس

شما با متد paymentRequest می تونید یک RefID دریافت کنید و به بانک ارسال می شوید و سپس پس از بازگشت به صفحه  callback با متد CheckStatus می تونید وضعیت خطاش رو چک کنید

برای ست تل و تکمیل سفارش کد را من توی  callback نوشتم خواستیتد اونم واستون می ذارم

----------


## Mahdi-563

> در ضمن این حالت کمینه ترین حالت این کامپوننت هست. رعایت ساختار MVC وحی منزل نیست و در برخی موارد نیاز به OverRide هست تا Optimum کار بشه. البته بعید می دونم برای برخی که در حد کپی paste هستن قابل درک باشه زیاد توجه نکن.


دوست عزیز من متوجه منظورتون نشدم

----------


## zoghal

> با تشکر از تمامی دوستان
> 
> بله می دونم کد اچ تی ام ال نباید داخل کامگونت باشه ولی باتوجه به زمان کمی که داشتم و جستجویی که کردم متاسفانه روشی برای اجرای جاوا اسکرپیت پیدا نکردم
> چون جاوا اسکریپت به تنهایی توی صفحه ای که تگ های اچ تیی ام ال نباشه کار نمی کنه، و این روش بهترین روشی بود که به ذهنم رسید
> 
> فراخوانی خیلی سادس
> 
> شما با متد paymentRequest می تونید یک RefID دریافت کنید و به بانک ارسال می شوید و سپس پس از بازگشت به صفحه  callback با متد CheckStatus می تونید وضعیت خطاش رو چک کنید
> 
> برای ست تل و تکمیل سفارش کد را من توی  callback نوشتم خواستیتد اونم واستون می ذارم


خوب دوست عزیز با این تفاسیر به نظر شما بهتر نیست. این کامپوننت رو به هلپر تبدیل کنید!. اینطوری به لایه ویو دسترسی کامل دارید.

----------


## cybercoder

آره Helper کنه بعد توی کنترل گر مستقیماً دسترسی نداشته باشه نه؟!
بعد محاسبات مالی رو رو تو view کنه با فرم پست کنه نه؟
تا حالا کلاً یک پروژه با پدر مادر با کیک اجرا کردی؟ یا همش مثل مدیر فایلته  :قهقهه: 
برو تو همون فرومی که صاحاب شدی از این جواب های بی مصرف بزن 4 تا بچه نادون مثل خودت واست کف بزنن!

----------


## zoghal

> آره Helper کنه بعد توی کنترل گر مستقیماً دسترسی نداشته باشه نه؟!
> بعد محاسبات مالی رو رو تو view کنه با فرم پست کنه نه؟


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




> دوست عزیز من متوجه منظورتون نشدم


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




> تا حالا کلاً یک پروژه با پدر مادر با کیک اجرا کردی؟ یا همش مثل مدیر فایلته 
> برو تو همون فرومی که صاحاب شدی از این جواب های بی مصرف بزن 4 تا بچه نادون مثل خودت واست کف بزنن!


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

این پروفایلم تو گیت هاپ هست.


```
https://github.com/zoghal
```

رتبه 35 ام رو در کامیت کردن بین حدود 1447 Contributors پروژه کیک پی اچ پی دارم.


```
https://github.com/cakephp/cakephp/graphs/contributors
```

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


```
http://forum.cakephp.ir/user-1.html
```

تو ایران پی اچ پی. اورگ هم سمت مدیریت رو دارم 


```
http://forum.iranphp.org/User-zoghal
```

اما اعتراف می کنم هنوز نمی دونم پروژه چیه. ممنون میشم راهنمایی کنید. :تشویق: 

اها اها برای اولین بار هم موفق شدم فونت های فارسی رو مشکلاتش رو فیکس کنم.(فعلا 3تا) فکر کنم پروژه به این میگن نهههه :متفکر: 



```
http://www.ritaco.net/webfonts2/
```

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


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

امیدوارم زود بزرگ بشید.

----------


## cybercoder

شما عرضه داری بهترش رو بنویس به جای ایراد بی خود گرفتن! کد هیچ درگیری با کنترلر نداره این مغز توئه که در یک ساختار مشخص که برات تعریف کردن،  :گیج:  گیر کرده!
تو هنوز نمی دونی که مسائل مالی رو در کدام لایه MVC باید انجام داد!
4 تا Contribute کردن نشانه بی کاری آدم رو می رسونه!
فونت فارسی قبل از این که تو بخوای از این مسخره بازی ها به جای کار در بیاری انجام شده! کپی کاری فونتت هم مثل خریدن به جای ریکاور کردن دامنه، کار محسوب میشه!  :قهقهه: 
اونایی هم که با فونت فارسی در وب مشکل دارن امثال خودتن که نمی دونن چی رو چجوری استفاده کنن.
کسی قصد تخریب تو رو نداره چون تو اصلا عددی نیستی که بخوام تخریبت کنم.
برو تو همون فرومهایی که صاحب و مدیری فعالیت کن و فخر بفروش و برای دیگران اظهار فضل و بزرگی کن. من به آدم هایی مثل تو باج نمیدم ، اینجا چرند تحویل ملت بدی به جای جواب صحیح، آبروت رو می برم. هر چند شک دارم مونده باشه دیگه چیزی!
مگه کلا کاری غیر از خودنمایی هم می کنی تو!؟!  :قهقهه:

----------


## zoghal

بله بله شما درست می گید. حق با شماست.

فقط لطفا این رو پاسخ بده لنگشیم بد



> نوشته شده توسط *cybercoder*  
>  				در ضمن این حالت کمینه ترین حالت این کامپوننت  هست. رعایت ساختار MVC وحی منزل نیست و در برخی موارد نیاز به OverRide هست  تا Optimum کار بشه. البته بعید می دونم برای برخی که در حد کپی paste  هستن قابل درک باشه زیاد توجه نکن.
> 			
> 		
> 
> دوست عزیز من متوجه منظورتون نشدم

----------


## cybercoder

نوشتم که برای امثال تو قابل درک نیست که! تو نمی فهمی من چیکار کنم برو یه بزرگتر پیدا کن بفهمه حالیت کنه! :قهقهه:

----------


## rezaonline.net

بخش verify پیاده سازی نشده .
اصلاح شود لطفا .

----------


## Mahdi-563

چشم حتما فرصت نکردم حتما می گذارم

----------

