نحوه اتصال به درگاه پرداخت بانک ملت

نحوه اتصال به درگاه پرداخت بانک ملت

نحوه اتصال به درگاه پرداخت بانک ملت با زبان PHP (آموزش و راهنمای کامل نصب سایت به درگاه پرداخت بانک ملت)

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

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

نحوه اتصال به درگاه پرداخت بانک ملت

بخش اول: پیش نیازها

شما برای استفاده از درگاه پرداخت بانک ملت پس از ارائه درخواست به این بانک از سامانه به پرداخت سه مقدار را دریافت می کنید :

۱- شماره ترمینال (Terminal ID)

2- نام کاربری (Username)

3- کلمه عبور (Password)

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

1- کاربر یک فرم برای تعیین مبلغ افزایش اعتبار پر خواهد کرد

2- مقادیر فرم را برای سرور ارسال می کند و  سرور کاربر را به درگاه پرداخت متصل میکند.

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

بخش دوم: فرم اتصال به درگاه پرداخت

فرم ما تنها یک مقدار ورودی دارد و آن مبلغی است که کاربر می خواهد به اعتبار خود در سایت اضافه کند. در این فرآیند ما پیش بینی کرده ایم که کاربر پیشتر در سایت وارد شده است و مقادیر اطلاعاتی کاربر در متغیر SESSION_$ ذخیره شده است. مقادیری که در متغیر SESSION_$ وجود دارد به شرح زیر است :

$_SESSION['username'] = "Username" String; //نام کاربری
$_SESSION['member_id'] = "Member ID" Int; //آی دی کاربر در دیتابیس

کد فرم ورود مبلغ به شکل زیر می باشد:

<form method="post" action="payment.php">
<table>
<tr>
<td>مبلغ</td>
<td><input type="text" value="" placeholder="مبلغ مورد نظر به ریال" name="price"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="افزایش اعتبار" name="submit">/td>
</tr>
</table>
</form>

فرم بسیار ساده طراحی شده است. در صورتی که نیاز دارید مقدار دیگری به فرم اضافه کنید به سادگی قابلیت افزوده شدن به فرم را دارد. فرم از طریق متد POST مقدار price را به صفحه payment.php ارسال می نماید.

بخش سوم‌: صفحه Payment.php

ما جهت ارسال درخواست به سرورهای بانک ملت از Soap استفاده می نماییم. دقت کنید آموزش ها و کدهای نمونه ای که بانک ملت ارائه نموده است از کتابخانه NuSoap استفاده نموده است که در نسخه های PHP 5.3 به بالا با مشکل مواجه می شود. به همین جهت ما در این آموزش از Saop Client استفاده می نماییم. حتما مد نظر داشته باشید که توابع Soap Client در سرور شما فعال باشند. جهت اطلاع از این موضوع از روش های مختلفی می توانید استفاده نمایید. ساده ترین روش استفاده از تابع phpinfo می باشد. در صورتی که توابع Soap در سرور شما غیر فعال بود درخواست فعال سازی آن را به سرور خود اعلام نمایید.

در صفحه payment.php ابتدا ما یک درخواست پرداخت برای سرور بانک ملت ارسال می نماییم. در صورتی که سرور آماده پرداخت بود کاربر را از طریق ارسال یک فرم به صفحه پرداخت بانک ملت متصل می نماییم.

جهت ارسال درخواست پرداخت باید مقادیر مختلفی را برای وب سرویس بانک ارسال نماییم. آدرس وب سرویس بانک ملت https://bpm.shaparak.ir/pgwchannel/services/pgw?wsdl می باشد و مقادیری که باید ارسال شود به شرح زیر است :

$terminalId = “########”; // شماره ترمینال دریافتی از بانک که در بخش اول به آن اشاره شد

$userName = “########”; // نام کاربری دریافتی از بانک که در بخش اول به آن اشاره شد

$userPassword = “########”; // کلمه عبور دریافتی از بانک که در بخش اول به آن اشاره شد

$orderId = “Integer Number”; // شماره پرداخت که باید یک رقم یکتا باشد.

$amount = “Integer Number”; // مبلغ قابل پرداخت که به صورت ریال باید ارسال شود

$localDate = date(‘Ymd’); // تاریخ پرداخت

$localTime      = date(‘Gis’); //ساعت پرداخت

$additionalData = “String Description” // توضیحات دلخواه مربوط به پرداخت

$callBackUrl = “String Call Back URL” // آدرس صفحه ای که کاربر پس از پرداخت به آن وارد می شود

$payerId = 0 ; //شناسه پرداخت کاربر برای کاربرانی که می خواهند از طریق شناسه پرداخت مبلغ را واریز کنند. جهت پرداخت معمولی مقدار 0 تنظیم گردیده است.

این مقادیر را در یک آرایه به نام $parameters قرار می دهیم و از طریق Soap Client به وب سرویس شاپرک متصل خواهیم شد. کد این بخش به این صورت می باشد :

$parameters = array(
        'terminalId'        => $terminalId,
        'userName'          => $userName,
        'userPassword'      => $userPassword,
        'orderId'           => $orderId,
        'amount'            => $amount,
        'localDate'         => $localDate,
        'localTime'         => $localTime,
        'additionalData'    => $additionalData,
        'callBackUrl'       => $callBackUrl,
        'payerId'           => $payerId);
    try {
        $client = new SoapClient('https://bpm.shaparak.ir/pgwchannel/services/pgw?wsdl', array('encoding'=>'UTF-8')); // اتصال به وب سرویس شاپرک با یونیکد UTF-8
        $result = $client->bpPayRequest($parameters); // اتصال به متد پرداخت بانک ملت و ارسال پارامترهای پرداخت
    } catch (Exception $e) {
            die("خطا در اتصال به وب سرویس شاپرک : " : $e->getMessage());
    }

در صورتی که اتصال با موفقیت انجام شود در پاسخ به متد bpPayRequest مقدار متغیر Result با دو مقدار پر خواهد شد. این دو مقدار به صورت String می باشند که با یک علامت , از هم جدا شده اند. مقدار اول وضعیت اتصال به درگاه پرداخت و مقدار دوم کدی که با آن می توان به درگاه پرداخت متصل شد و آن را RefId می نامیم.

مقدار متغیر Result به این شکل می باشد :

0,AF82041a2Bf6989c7fF9

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

$res= explode (',', $result->return);

نتیجه فراخوانی این تابع یک آرایه متشکل از دو مقدار هست. مقدار 0 وضعیت و مقدار 1 کد RefId می باشد. با توجه به مستندات بانک ملت می دانیم در صورتی همه چیز آماده اتصال به درگاه پرداخت می باشد که مقدار وضعیت برابر عدد 0 باشد. بنابراین برای اتصال به درگاه پرداخت از کدهای زیر استفاده می نماییم.

$ResCode    = $res[0];
    if ($ResCode == "0") {
            echo '<form name="myform" action="https://bpm.shaparak.ir/pgwchannel/startpay.mellat" method="POST">
                        <input type="hidden" id="RefId" name="RefId" value="'. $res[1] .'">
                    </form>
                    <script type="text/javascript">window.onload = formSubmit; function formSubmit() { document.forms[0].submit(); }</script>';
            exit;
    } else {
            echo "Error : ". $ResCode;
            exit;
    }

در کد بالا اگر مقدار وضعیت برابر صفر باشد با استفاده از یک فرم که با load شدن صفحه post می شود مقدار RefId را به آدرس https://bpm.shaparak.ir/pgwchannel/startpay.mellat ارسال می نماییم تا کاربر وارد درگاه پرداخت شود. در غیر این صورت نیز کد خطا را نمایش می دهیم.

 

بخش چهارم صفحه تایید (Verify.php)

همانطور که در بخش پیش مشاهده کردید ما برای بانک یک آدرس Call Back ارسال می کنیم. پس از اینکه کاربر عملیات پرداخت را انجام می دهد. به صفحه Call Back باز می گردد که در این صفحه ما باید وضعیت پرداخت کاربر را تایید کنیم و درصورتی که پرداخت به درستی انجام شده بود درخواست واریز وجه به حساب را ارسال کنیم و در غیر اینصورت درخواست بازگشت وجه به حساب کاربر ارسال گردد. درگاه پرداخت به صفحه ای که ما به عنوان callBackUrl معرفی کردیم 4 مقدار را POST خواهد کرد. این چهار مقدار عبارتند از :

$RefId = $_POST[‘RefId’]; // کدی که ما برای درگاه پرداخت ارسال کردیم
$ResCode = $_POST[‘ResCode’]; // کد نتیجه پرداخت که درصورت 0 بودن پرداخت موفقیت آمیز بوده
$saleOrderId = $_POST[‘SaleOrderId’]; // شماره پرداختی که ما برای وب سرویس ارسال کردیم
$SaleReferenceId = $_POST[‘SaleReferenceId’]; // شماره تراکنش بانک

بنابراین در ابتدا ما باید مقدار ResCode را بررسی کنیم و سپس با اتصال به وب سرویس با استفاده از Soap تایید یا عدم تایید پرداخت و درخواست واریز و یا بازگرداندن وجه را به بانک ارائه کنیم. برای تعیین وضعیت تایید از متد bpVerifyRequest و برای درخواست واریز وجه از متد bpSettleRequest و برای بازگشت وجه از متد bpReversalRequest استفاده میکنیم. برای اجرای تمامی متدهای بالا باید یک آرایه شامل موارد زیر ارسال گردد :

$terminalId = “########”; // شماره ترمینال دریافتی از بانک که در بخش اول به آن اشاره شد

$userName = “########”; // نام کاربری دریافتی از بانک که در بخش اول به آن اشاره شد

$userPassword = “########”; // کلمه عبور دریافتی از بانک که در بخش اول به آن اشاره شد

$orderId= $_POST[‘SaleOrderId’]; // شماره پرداخت تعریف شده در وبسایت ما

$verifySaleOrderId = $_POST[‘SaleOrderId’]; // شماره پرداخت تعریف شده در وبسایت ما

$verifySaleReferenceId = $_POST[‘SaleReferenceId’]; // شماره تراکنش بانک

مانند بخش سوم تمامی مقادیر بالا را در یک آرایه به نام parameters قرار می دهیم و این متغیر را به هر کدام از متدها مورد نظر ارسال میکنیم. نهایتا نتیجه کار در صفحه تایید به شکل زیر می باشد:

if ($_POST['ResCode'] == '0') {
    $client = new SoapClient('https://bpm.shaparak.ir/pgwchannel/services/pgw?wsdl');
    $terminalId         = "2240204";                    // Terminal ID
    $userName       = "kar558";                     // Username
    $userPassword   = "99706923";                   // Password
    $orderId                 = $_POST['SaleOrderId'];        // Order ID
    $verifySaleOrderId         = $_POST['SaleOrderId'];
    $verifySaleReferenceId     = $_POST['SaleReferenceId'];
            
    $parameters = array(
        'terminalId' => $terminalId,
        'userName' => $userName,
        'userPassword' => $userPassword,
        'orderId' => $orderId,
        'saleOrderId' => $verifySaleOrderId,
        'saleReferenceId' => $verifySaleReferenceId);
       //ارائه درخواست تایید
    $result = $client->bpVerifyRequest( $parameters);
    if($result == 0) {
            // ثبت درخواست واریز وجه
        $result = $client->bpSettleRequest($parameters);
        if($result == 0) {
            echo 'پرداخت با موفقیت انجام شد.';
        } else {
            // در درخواست واریز وجه مشکل به وجود آمد. درخواست بازگشت وجه داده شود.
            $client->bpReversalRequest($parameters);
            echo 'خطا : '. $result;
        }
    } else {
        //-- وریفای به مشکل خورد٬ نمایش پیغام خطا و بازگشت زدن مبلغ
        $client->call->bpReversalRequest($parameters);
        echo 'خطا : '. $result;
    }
} else {
    //-- پرداخت با خطا همراه بوده
    echo 'خطا : '. $_POST['ResCode'];
}

در پایان نگاه کلی به روند پرداخت خواهیم داشت :

مرحله اول صفحه payment.html :

<!DOCTYPE html>
<!--[if IE 9]> <html lang="fa" class="ie9"> <![endif]-->
<!--[if !IE]><!-->
<html lang="fa" dir="rtl">
<!--<![endif]-->
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">   
        <meta content="width=device-width, initial-scale=1.0" name="viewport" />
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>افزایش اعتبار</title>
<meta name="author" content="AMOS">
    
</head>
<body>
<form method="post" action="payment.php">
<table>
<tr>
<td>مبلغ</td>
<td><input type="text" value="" placeholder="مبلغ مورد نظر به ریال" name="price"></td>
</tr>
<tr>
<td colspan="2"><input type="submit" value="افزایش اعتبار" name="submit">/td>
</tr>
</table>
</form>
</body>
</html>

مرحله دوم صفحه payment.php :

<?php
    ini_set("soap.wsdl_cache_enabled", "0");
    $terminalId         = "########";                    // Terminal ID
    $userName       = "########";                     // Username
    $userPassword   = "########";                   // Password
    $orderId        = "Int number";                       // Order ID
    $amount         = "Int Price";                       // Price / Rial
    $localDate      = date('Ymd');                  // Date
    $localTime      = date('Gis');                  // Time
    $additionalData     = "Member Id";
    $callBackUrl    = "http://Your Website.com/verify.php";     // Callback URL
    $payerId        = "0";
    $parameters = array(
        'terminalId'        => $terminalId,
        'userName'          => $userName,
        'userPassword'      => $userPassword,
        'orderId'           => $orderId,
        'amount'            => $amount,
        'localDate'         => $localDate,
        'localTime'         => $localTime,
        'additionalData'    => $additionalData,
        'callBackUrl'       => $callBackUrl,
        'payerId'           => $payerId);
    try {
        $client = new SoapClient('https://bpm.shaparak.ir/pgwchannel/services/pgw?wsdl', array('encoding'=>'UTF-8'));
        $result = $client->bpPayRequest($parameters);
    } catch (Exception $e) {
            die($e->getMessage());
    }
    $res        = explode (',', $result->return);
    $ResCode    = $res[0];
    if ($ResCode == "0") {
            echo '<form name="myform" action="https://bpm.shaparak.ir/pgwchannel/startpay.mellat" method="POST">
                        <input type="hidden" id="RefId" name="RefId" value="'. $res[1] .'">
                    </form>
                    <script type="text/javascript">window.onload = formSubmit; function formSubmit() { document.forms[0].submit(); }</script>';
            exit;
    } else {
            echo "Error : ". $ResCode;
            exit;
    }
?>

مرحله سوم صفحه Verify.php :

if ($_POST['ResCode'] == '0') {
    $client = new SoapClient('https://bpm.shaparak.ir/pgwchannel/services/pgw?wsdl');
    $terminalId         = "2240204";                    // Terminal ID
    $userName       = "kar558";                     // Username
    $userPassword   = "99706923";                   // Password
    $orderId                 = $_POST['SaleOrderId'];        // Order ID
    $verifySaleOrderId         = $_POST['SaleOrderId'];
    $verifySaleReferenceId     = $_POST['SaleReferenceId'];
            
    $parameters = array(
        'terminalId' => $terminalId,
        'userName' => $userName,
        'userPassword' => $userPassword,
        'orderId' => $orderId,
        'saleOrderId' => $verifySaleOrderId,
        'saleReferenceId' => $verifySaleReferenceId);
       //ارائه درخواست تایید
    $result = $client->bpVerifyRequest( $parameters);
    if($result == 0) {
            // ثبت درخواست واریز وجه
        $result = $client->bpSettleRequest($parameters);
        if($result == 0) {
            echo 'پرداخت با موفقیت انجام شد.';
        } else {
            // در درخواست واریز وجه مشکل به وجود آمد. درخواست بازگشت وجه داده شود.
            $client->bpReversalRequest($parameters);
            echo 'خطا : '. $result;
        }
    } else {
        //-- وریفای به مشکل خورد٬ نمایش پیغام خطا و بازگشت زدن مبلغ
        $client->call->bpReversalRequest($parameters);
        echo 'خطا : '. $result;
    }
} else {
    //-- پرداخت با خطا همراه بوده
    echo 'خطا : '. $_POST['ResCode'];
}

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

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

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

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

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

موفق و پیروز و سربلند باشید.

منبع: سئو فاکس

آخرین بروزرسانی توسط احسان اسکندری در تاریخ 30 خرداد 1396 انجام شده است
دیدگاه ها
درباره نویسنده
مطالب مرتبط

پاسخ دهید

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

احسان اسکندریکارشناس سئو

3 سالی هست که در حوضه سئو موضوعات رقابتی، بازاریابی اینترنتی و طراحی وب سایت فعالیت می کنم و در طول این مدت پروژه های بزرگی را با موفقیت به اتمام رساندم.

دنبال کردن در اینستاگرام