آموزش نحوه راه اندازی درگاه پی لاین در php با ثبت تراکنش در پایگاه داده
0 0

آموزش نحوه راه اندازی درگاه پی لاین در php با ثبت تراکنش در پایگاه داده


آموزش نحوه راه اندازی درگاه پی لاین در php با ثبت تراکنش در پایگاه داده

در پست های قبلی نحوه راه اندازی درگاه پرداخت پی لاین در Asp.Net و  Asp.Net MVC 5 و php را بررسی کردیم. و در این قسمت به صورت کامل نحوه راه اندازی درگاه پرداخت پی لاین در Php با ثبت اطلاعات تراکنش در پایگاه داده می پردازیم .

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

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

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

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

1- فیلد Id

2- فیلد UserId : یعنی تراکنش متعلق به کدام کاربر می باشد.

3- OrderId : یعنی این تراکنش  متعلق به کدام سفارش  می باشد.

4- Amount : مبلغ تراکنش

5- TransId : کد پیگیری تراکنش که پی لاین بر می گرداند.

6- IdGet : شماره تراکنش که پی لاین بر می گرداند.

حال به سراغ صفحات مورد نظر رفته و تک تک صفحات را توضیح می دهیم.

برای راه اندازی درگاه پی لاین ما به پنج صفحه نیاز داریم. که شامل صفحات index.php ، send.php ، return.php و sender.php و db_connection.php که به ترتیب این پنج صفحه را توضیح خواهیم داد.

فایل sender.php : کدهای فایل sender.php به صورت زیر می باشند.

<?php
function send($url,$api,$amount,$redirect){
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_POSTFIELDS,"api=$api&amount=$amount&redirect=$redirect");
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    $res = curl_exec($ch);
    curl_close($ch);
    return $res;
}
function get($url,$api,$trans_id,$id_get){
    $ch = curl_init();
    curl_setopt($ch,CURLOPT_URL,$url);
    curl_setopt($ch,CURLOPT_POSTFIELDS,"api=$api&id_get=$id_get&trans_id=$trans_id");
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE);
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
    $res = curl_exec($ch);
    curl_close($ch);
    return $res;
}

در این فایل دو تابع send و get وجود دارند که از تابع send برای ارسال اطلاعات به درگاه پی لاین استفاده می شود که از این تابع در فایل send.php استفاده کرده ایم.

تابع دیگر که تابع get می باشد برای دریافت اطلاعات از طرف پی لاین استفاده می شود. که شماره تراکنش ، کد پیگیری و پیغام مورد نظر که آیا پرداخت موفق بوده یاخیر را بر می گرداند.

فایل index.php : کدهای فایل index.php به صورت زیر می باشند.

<?php
session_start();
?>
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <title>درگاه پی لاین-ایران گنج</title>
    <meta charset="UTF-8">
    <link href="Content/style.css" rel="stylesheet"/>
</head>
<body>
<?php
$url = "";
$message = "";
if (isset($_POST['submit'])) {
    $price = $_POST['amount'];

    if ($price != "") {
        if (is_numeric($price)) {
            //ثبت اطلاعات در پایگاه داده
            $userId = 1;//شما باید ای دی کاربر را وارد نمایید
            $orderId = 100;// باید شماره سفارش را که در جدول سفارش ذخیره کردید در اینجا وارد نمایددد
            $_SESSION['price'] = $price;
            include_once("db_connection.php");
            $query = "INSERT INTO payment (";
            $query .= " Id,UserId,OrderId,Amount,TransId,IdGet ";
            $query .= ") VALUES (";
            $query .= " NULL,{$userId},{$orderId},{$price},NULL,NULL ";
            $query .= ")";
            $result = mysqli_query($connection, $query);
            if ($result) {
                $query = "SELECT * ";
                $query .= "FROM  payment ";
                $query .= "ORDER BY Id DESC ";
                $query .= "LIMIT 1 ";
                $result_set = mysqli_query($connection, $query);
                if ($payment = mysqli_fetch_assoc($result_set)) {
                    $id = $payment['Id'];
                    $url = "send.php?id={$id}";
                    header("Location: $url");
                } else {
                    $message = "مشکلی در سیستم به وجود آمد دوباره تلاش کنید";
                }
            } else {
                $message = "مشکلی در سیستم به وجود آمد دوباره تلاش کنید";
            }

        } else {
            $message = "مبلغ وارد شده معتبر نیست";
        }
    } else {
        $message = "شما مبلغی را وارد نکرده اید";
    }
}
?>

<div class="main">

    <form name="pay" action="index.php" method="post">
        <table class="tbl">
            <tr>
                <td colspan="2">
                    <h2>درگاه پی لاین</h2>
                </td>
            </tr>
            <tr>
                <td>مبلغ:</td>
                <td>
                    <input type="text" id="amount" name="amount"/>
                </td>
            </tr>
            <tr>
                <td colspan="2" style="text-align: left;">
                    <input type="submit" name="submit" value="پرداخت"/>
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    <?php
                    if (isset($message)) {
                        echo $message;
                        $message = "";
                    }
                    ?>
                </td>
            </tr>
            <tr>
                <td colspan="2">
                    <a href="http://iranganj.ir" target="_blank">www.iranganj.ir</a>
                </td>
            </tr>
        </table>
    </form>
</div>
</body>
</html>

در این صفحه ما یک فرم ساده داریم که کاربر مبلغ تراکنش را وارد کرده و بر روی دکمه پرداخت کلیک می کند. قبل از اینکه کاربر را به صفحه پرداخت متصل نماییم ابتدا UserId و OrderId را دریافت می کنیم. ما در اینجا خودمان 2 عدد به صورت انتخابی قرار دادیم ولی در پرداخت واقعی شما باید UserId و OrderId واقعی که می توانید برای دریافت آنها از سشن یا Query String استفاده نمایید.

حال با استفاده از دستور Insert فیلدهای مورد نظر را در پایگاه داده ثبت می کنیم. سپس با استفاده از یک دستور Select آخرین Id ثبت شده را به دست می آوریم. و با استفاده از Query String به صفحه Send.php ارسال می کنیم.

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

فایل send.php : کدهای فایل send.php به صورت زیر می باشند.

<?php
session_start();
?>
<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8">
    <title>درگاه پی لاین-ایران گنج</title>
    <link href="Content/style.css" rel="stylesheet"/>
</head>
<?php
include_once("sender.php");
$url = 'http://payline.ir/payment-test/gateway-send';
$api = 'adxcv-zzadq-polkjsad-opp13opoz-1sdf455aadzmck1244567';
$message = "";
if (isset($_SESSION['price']) && isset($_GET['id']) && is_numeric($_GET['id'])) {
    $amount = $_SESSION['price'];
    unset($_SESSION['price']);
    $id = $_GET['id'];
    include_once("db_connection.php");
    $query = "SELECT * ";
    $query .= "FROM  payment ";
    $query .= "WHERE Id={$id} ";
    $query .= "LIMIT 1 ";
    $result_set = mysqli_query($connection, $query);
    if ($payment = mysqli_fetch_assoc($result_set)) {
        $redirect = urlencode("http://localhost:8080/PaylineWithDatabase/return.php?id={$id}");
        $result = send($url, $api, $amount, $redirect);
        if ($result > 0 && is_numeric($result)) {
            $go = "http://payline.ir/payment-test/gateway-$result";
            header("Location: $go");
        }
        switch ($result) {
            case '-1':
                $message = 'api ارسالی با نوع api تعریف شده در payline سازگار نیست';
                break;
            case '-2':
                $message = 'مقدار مبلغ کمتر از 1000 ریال می باشد';
                break;
            case '-3':
                $message = 'آدرس بازگشتی خالی می باشد';
                break;
            case '-4':
                $message = 'درگاهی با درگاه ارسالی شما یافت نشد';
                break;
        }
    } else {
        $message = "تراکنش شما معتبر نمی باشد";
    }

} else {
    $message = "تراکنش شما معتبر نمی باشد";
}

?>
<body>
<div class="main">
    <table class="tbl">
        <tr>
            <td colspan="2">
                <h2>درگاه پی لاین</h2>
            </td>
        </tr>

        <tr>
            <td> پیام خطا</td>
            <td>
                <?php
                echo $message;
                ?>
            </td>
        </tr>
        <tr>
            <td colspan="2">
                <a href="http://iranganj.ir" target="_blank">www.iranganj.ir</a>
            </td>
        </tr>
    </table>
</div>
</body>
</html>

در فایل send.php ابتدا فایل sender.php را اینکلود کرده ایم چون می خواهیم از تابع send.php استفاده کنیم.

ما در صفحه index.php مبلغ مورد نظر را توسط سشن به صفحه send.php ارسال کرده ایم و در این صفحه چک می کنیم که آیا سشن وجود دارد یا نه ، سپس مبلغ مورد نظر را دریافت کرده و سشن را خالی می کنیم. همچنین Id که به این صفحه ارسال شده است را چک می کنیم  که معتبر باشد. سپس در پایگاه داده Id دریافت شده را جستجو می کنیم که آیا این Id وجود دارد یا نه ، اگر وجود نداشت یا مشکلی در ثبت در پایگاه داده به وجود آمده یا اینکه Id ارسالی نامعتبر است و دستکاری شده است. سپس اطلاعات مورد نظر که شامل آدرس درگاه پرداخت پی لاین ، api مورد نظر ، مبلغ تراکنش و آدرس برگشتی از بانک می باشد را توسط تابع send ارسال می نماییم. سپس مقدار برگشتی تابع send را در متغیر result ذخیره می کنیم. سپس مقدار برگشتی را چک می کنیم که بزرگتر از صفر و همچنین عدد باشد در این صورت کاربر به صفحه پرداخت هدایت می شود. و اگر شرط درست نباشد حتما خطایی رخ داده است که در بخش switch آن را چک کرده ایم و خطای مورد نظر را چاپ می کنیم.

نکته :درآدرس برگشتی Id تراکنش را با Query String ارسال کردیم تا بتوانیم هنگام برگشت از پی لاین اطلاعات مورد نظر را در پایگاه داده ثبت نماییم.

فایل return.php : کدهای فایل return.php به صورت زیر می باشند.

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml">
<head>
    <meta charset="utf-8">
    <title>درگاه پی لاین-ایران گنج</title>
    <link href="Content/style.css" rel="stylesheet"/>
</head>
<?php

include_once("sender.php");
$url = 'http://payline.ir/payment-test/gateway-result-second';
$api = 'adxcv-zzadq-polkjsad-opp13opoz-1sdf455aadzmck1244567';
if (isset($_POST['trans_id']) && isset($_POST['id_get'])) {
    if (isset($_GET['id']) && is_numeric($_GET['id'])) {
        $id = $_GET['id'];
        include_once("db_connection.php");
        $query = "SELECT * ";
        $query .= "FROM  payment ";
        $query .= "WHERE Id={$id} ";
        $query .= "LIMIT 1 ";
        $result_set = mysqli_query($connection, $query);
        if ($payment = mysqli_fetch_assoc($result_set)) {
            $id = $payment['Id'];
            $trans_id = $_POST['trans_id'];
            $id_get = $_POST['id_get'];
            $result = get($url, $api, $trans_id, $id_get);
            switch ($result) {
                case '-1' :
                    $message = 'api ارسالی با نوع api تعریف شده در payline سازگار نیست';
                    break;
                case '-2' :
                    $message = 'شماره تراکنش نامعتبر است';
                    break;
                case '-3' :
                    $message = 'id_get نانعتبر است';
                    break;
                case '-4' :
                    $message = 'چنین تراکنشی در سیستم وجود ندارد یا تراکنش نامعتبر است';
                    break;
                case '1' :
                    $message = 'تراکنش موفقیت آمیز بوده است';
                    break;
            }
            $query = "UPDATE payment ";
            $query .= " SET TransId='{$trans_id}',IdGet='{$id_get}' ";
            $query .= " WHERE Id='{$id}' ";
            $result_set = mysqli_query($connection, $query);
            if ($result_set) {
                $message = 'تراکنش موفقیت آمیز بوده است';
            } else {
                $message = "مشکلی در سیستم به وجود آمده است";
            }
        } else {
            $message = "تراکنش نامعتبر است";
        }
    } else {
        $message = "تراکنش نامعتبر است";
    }
} else {
    $message = "تراکنش نامعتبر است";
}
?>
<body>
<div class="main">
    <table class="tbl">
        <tr>
            <td colspan="2">
                <h2>درگاه پی لاین</h2>
            </td>
        </tr>
        <tr>
            <td>شماره تراکنش</td>
            <td>
                <?php
                if (isset($id_get)) {
                    echo $id_get;
                } else {
                    echo "شماره تراکنش نامعتبر است";
                }
                ?>
            </td>
        </tr>
        <tr>
            <td>کد پیگیری</td>
            <td>
                <?php
                if (isset($trans_id)) {
                    echo $trans_id;
                } else {
                    echo "کد پیگیری نامعتبر است";
                }
                ?>
            </td>
        </tr>
        <tr>
            <td>وضعیت پرداخت</td>
            <td>
                <?php
                if (isset($message)) {
                    echo $message;
                } else {
                    echo "پرداختی صورت نگرفته است";
                }
                ?>
            </td>
        </tr>
        <tr>
            <td colspan="2">
                <a href="http://iranganj.ir" target="_blank">www.iranganj.ir</a>
            </td>
        </tr>
    </table>
</div>
</body>
</html>

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

در این صفحه ابتدا چک می کنیم که trans_id وid_get وجود دارد یا نه اگر وجود نداشت پیغام خطا را صادر می کنیم. سپس Id تراکنش را از Url دریافت می کنیم و دوباره در پایگاه داده جستجو می کنیم که آیا تراکنشی با این Id وجود دارد یا نه. اگر وجود داشت Id دریافتی درست می باشد وگرنه دستکاری شده است.

سپس از تابع get استفاده کرده و مقادیر را دوباره به درگاه پرداخت ارسال می کنیم. سپس خروجی تابع get را در متغیر result ذخیره می کنیم. و با توجه به مقدار برگشتی result پیغام مناسب را به کاربر نمایش می دهیم.

در نهایت در پایان با Id دریافتی کد پیگیری دریافتی و شماره تراکنش را در پایگاه داده ثبت می کنیم که این با دستور Update انجام می گیرد.

فایل db_connection.php : کدهای فایل db_connection.php به صورت زیر می باشند.

<?php
define("DB_SERVER", "localhost");
define("DB_USER", "root");
define("DB_PASS", "");
define("DB_NAME", "dbpayline");
$connection = mysqli_connect(DB_SERVER, DB_USER, DB_PASS, DB_NAME);
mysqli_query($connection, "set names 'utf8'");
if (mysqli_connect_errno()) {
    die("database connection failed: " .
        mysqli_connect_error() .
        "(" . mysqli_connect_errno() . ")"
    );
}
?>

در این فایل کدهای لازم برای ارتباط با پایگاه داده وجود دارد که نیاز به توضیح ندارد همچنین در پست های آموزش php این موارد توضیح داده شده است.

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

توجه : فایل sql پایگاه داده نیز ضمیمه برنامه می باشد.

دانلود

نویسنده حسین فتحی
گروه مطلب PHP
نوع مطلب سورس کد و آموزش
تاریخ انتشار ۱۹ بهمن ۱۳۹۴
منبع ایران گنج
تعداد نظرات ۰
قیمت کاربران VIP
توضیح توجه:
  • زمانی که روی لینک دانلود کلیک می کنید لینک دانلود به مدت 24 ساعت معتبر خواهد بود
  • لینک های دانلود دوره های آموزشی تا پایان دوره قابل دانلود می باشد.
  • برای خارج کردن فایل ها از حالت فشرده از ورژن جدید نرم افزار winrar استفاده کنید.
  • برای خارج کردن فایل ها از حالت فشرده لینک های دانلودی که چندین قسمت می باشند فقط قسمت اول را از حالت فشرده خارج کنید.
  • لطفا توضیحات نوشته شده برای مطالب را با دقت بخوانید.
  • برای نمایش فیلم ها می توانید از نرم افزار هایی مانند Km Player , VLC Player یا Media Player Classic استفاده کنید.

نظر / سوال

Captcha

این صفحه را می‌پسندم