راه اندازی سیستم فروش فایل با لاراول و زرین پال

راه اندازی سیستم فروش فایل با لاراول

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

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

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

راه اندازی سیستم فروش فایل با لاراول و زرین پال

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

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

حال پروژه را شروع می کنیم.

ترمینال را باز کرده و با دستور زیر لاراول را نصب می کنیم.

composer create-project --prefer-dist laravel/laravel RoxoPayment

نصب پکیج nusoap

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

دستور زیر را در ترمینال وارد کنید.

	
composer require econea/nusoap:dev-master

ایجاد پایگاه داده

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

php artisan migrate:make create_downloads_table

با اجرای کد بالا یک فایل migration ساخته می شود. حال این فایل migration را باز کنید و کدهای زیر را داخل متد up() آن قرار دهید.

توجه کنید که این جدول نمایانگر فایل های دانلودی شما است که این فایل ها دارای فیلدهای زیر می باشد:

  • id: شناسه فایل
  • name: نام فایل
  • filepath: مسیر فایل
  • price: قیمت فایل
  • timestamps: زمان ایجاد و بروزرسانی فایل

در این جدول محصولاتی که قصد داریم آنها را در سیستم فروش فایل با لاراول به فروش برسانیم، ثبت می کنیم.

Schema::create('downloads', function($table)
{
    $table->increments('id')->unsigned();        
    $table->string('name', 255);      
    $table->string('filepath', 255);      
    $table->integer('price');            
    $table->timestamps();
});

filepath به مسیر فایلی که می خواهیم آن را بفروش برسانیم (محصول دیجیتالی) اشاره می کند.

در قدم بعد در مسیر app -> models یک فایل با نام Download.php ایجاد کنید و کدهای زیر را در آن قرار دهید.

// app/models/Download.php
class Download extends Eloquent {
    protected $fillable = array('name', 'filepath', 'price');
}

در مدل فوق با استفاده از خصیصه fillable مقادیر جدول filepath و name و price را فعال کرده ایم.

اگر چنانچه با فریم ورک لاراول آشنایی ندارید لطفا دوره آموزش ویدیویی لاراول را از لینک زیر دریافت نمایید:

حال چند محصول آزمایشی را در جدول درج می کنیم. برای اینکار ما از یک کلاس seeder مانند زیر استفاده کرده ایم:

class DownloadsSeeder extends Seeder {

    /**
     * Run the database seeds.
     *
     * @return void
     */
    public function run()
    {
        $data = array(
            array(
                'name'            =>    'Sample download 1',
                'filepath'    =>    'downloads/one.zip',
                'price'            =>    500,
            ),
            array(
                'name'            =>    'Sample download 2',
                'filepath'    =>    'downloads/two.zip',
                'price'            =>    1000,
            ),
        );

        foreach ($data as $properties) {

            $download = new Download($properties);
            $download->save();            

        }
    }

}    

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

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

همچنین یک جدول در پایگاه داده جهت ذخیره سفارش ها ایجاد می کنیم. نام این جدول orders می باشد. جدول orders با جدول users که به صورت پیشفرض ایجاد کرده اید روابط یک به چند دارد. یعنی هر کاربر می تواند چندین سفارش داشته باشد.

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

بنابراین داریم:

Schema::create('orders', function($table)
{
    $table->increments('id')->unsigned();        
    $table->integer('user_id')->unsigned();  
    $table->integer('download_id')->unsigned();
    $table->tinyint('status')->unsigned();    
    $table->timestamps();
});

سپس فایل Order.php را در بخش مدل با دستور زیر ایجاد می کنیم:

php artisan make:model Order

درون این فایل روابط بین این جدول با جداول users و downloads را به صورت زیر می نویسیم:

public function user(){
  return $this->belongsTo(User::class);
}

public function orders(){
 return $this->hasMany(Order::class);
}

ایجاد صفحه نمایش محصولات

حال قصد داریم یک صفحه ایجاد کنیم و در این صفحه لیست تمام محصولاتی که قصد داریم در سایت برای فروش عرضه کنیم را نمایش دهیم.

ابتدا فایل web.php را باز کنید و کدهای زیر را در آن قرار دهید.

Route::get('/', function()
{
    $downloads = Download::get();    
    return View::make('index', array('downloads' => $downloads));
});


Route::post('/buy/{id}','siteController@add_order');

یعنی با استفاده از دستور فوق یک route‌ ایجاد کرده ایم که مسیر صفحه کلیه محصولات به آدرس yoursite.com را مشخص میکند. از طرفی مسیر yoursite.com/buy/id برای افزودن سفارش و پرداخت آنلاین مب شاد.

حال یک صفحه با نام index.blade.php در مسیر resources -> Views ایجاد کنید و کدهای زیر را در آن قرار دهید.

// app/views/index.blade.php
<h1>Select your download:</h1>

<table class="table table-bordered">
@foreach ($downloads as $download)
    <tr>
        <td>{{ $download->name }}</td>
        <td>&pound;{{ round($download->price/100) }}</td>
        <td><a href="/buy/{{ $download->id }}" class="btn btn-primary">Buy</a></td>
    </tr>
@endforeach
</table>

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

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

در مسیر app - > lib یک فایل به نام zarinpal.php ایجاد کرده و کدهای زیر را در آن قرار دهید.

//zarrinpal.php


<?php
namespace App\lib;
use DB;
/*require_once 'nusoap.php';*/
use nusoap_client;
class zarinpal
{
    public $MerchantID;
    public function __construct()
    {
        $this->MerchantID="5e682ada-3b69-11e8-aaf3-005056a205be";
    }
    public function pay($Amount,$Email,$Mobile)
    {
                    $Description = 'فروش محصول';  // Required
                    $CallbackURL = url('/order'); // Required
            
            
                $client = new nusoap_client('https://www.zarinpal.com/pg/services/WebGate/wsdl', 'wsdl');
                $client->soap_defencoding = 'UTF-8';
                $result = $client->call('PaymentRequest', [
                    [
                        'MerchantID'     => $this->MerchantID,
                        'Amount'         => $Amount,
                        'Description'    => $Description,
                        'Email'          => $Email,
                        'Mobile'         => $Mobile,
                        'CallbackURL'    => $CallbackURL,
                    ],
                ]);
            
                //Redirect to URL You can do it also by creating a form
                if ($result['Status'] == 100) {
                    return $result['Authority'];
                } else {
                    return false;
                }
                
    
    
    }
 
}

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

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

.....
 
class zarinpal
{
    public $MerchantID;
    public function __construct()
    {
        $this->MerchantID="5e682ada-3b69-11e8-aaf3-005056a205be";//کد مربوط به خودتان را وارد کنید
    }
 
    ......

قسمت description و callbackURL را باید ویرایش کنید.

  1. callbackURL آدرسی است که پس از پرداخت کاربر به آن هدایت می شود
  2. description توضیحاتی است که به هنگام خرید توسط سایت فروش فایل با لاراول به زرین پال ارسال می شود

مسیردهی برای فروش فایل با لاراول

حال ترمینال را باز کرده و با اجرای کد زیر یک کنترلر با نام siteController ایجاد می کنیم.

php artisan make:controller siteController

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

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

 //siteController.php
 
    ......
 
     public function add_order($id)
    {
	$downlaod=Download.find($id);
        Session::put('purchased_download_id', $download->id);
        $order = new zarinpal();
        $res = $order->pay($downlaod->price,$downlaod->email,$downlaod->mobile);
        return redirect('https://www.zarinpal.com/pg/StartPay/' . $res);
 
    }
    ..........

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

در فایل web.php مسیر زیر را تعریف خواهیم کرد:

Route::get('/order/', 'siteController@order');

در مرحله بعد، کنترلر siteController را باز کرده و یک متد با نام order() ایجاد کرده و کدهای زیر را در آن قرار دهید.

public function order(Request $request){
 
        $MerchantID = '5e682ada-3b69-11e8-aaf3-005056a205be';
        $Authority =$request->get('Authority') ;
                
        //ما در اینجا مبلغ مورد نظر را بصورت دستی نوشتیم اما در پروژه های واقعی باید از دیتابیس بخوانیم
        $Amount = 100;
        if ($request->get('Status') == 'OK') {
            $client = new nusoap_client('https://www.zarinpal.com/pg/services/WebGate/wsdl', 'wsdl');
            $client->soap_defencoding = 'UTF-8';
 
            //در خط زیر یک درخواست به زرین پال ارسال می کنیم تا از صحت پرداخت کاربر مطمئن شویم
            $result = $client->call('PaymentVerification', [
                [
                    //این مقادیر را به سایت زرین پال برای دریافت تاییدیه نهایی ارسال می کنیم
                    'MerchantID'     => $MerchantID,
                    'Authority'      => $Authority,
                    'Amount'         => $Amount,
                ],
            ]);
 
            if ($result['Status'] == 100) {
		$download = Download::findOrFail(Session::get('purchased_download_id);
		$order = new Order();
                $order->user_id = Auth::user()->id;
                $order->download_id = $download->id;
                $order->status = 1;
                $order->save();
		return Redirect::to('confirmed', compact(['download']);
 
            } else {
                    return 'خطا در انجام عملیات';
            }
        }
        else
        {
            return 'خطا در انجام عملیات';
        }
 
 
 
    }

پس از پرداخت، وب سایت زرین پال یک پاسخ را در قالب متغییر request (مشابه درخواست ها در لاراول) برای سایت فروش فایل با لاراول، ارسال می کند. در این حالت باید request را مورد بررسی قرار دهیم. داخل request اطلاعاتی به شرح زیر است:

Authority: وضعیت احراز هویت کاربر پس از پرداخت

Status:  وضعیت پرداخت یا عدم پرداخت مبلغ مورد نظر

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

حال اگر سفارش با موفقیت ثبت شده بود یعنی status برابر ۱۰۰ بود، ابتدا سفارش کاربر در جدول orders ذخیره می شود و سپس کاربر به صفحه confirm هدایت می گردد.

مسیردهی برای دانلود فایل در لاراول

پس از اینکه وضعیت پرداخت کاربر مشخص شد (پرداخت شده یا نشده) او را به صفحه موردنظر که در callback‌ تعریف کرده ایم هدایت می کنیم. این صفحه مسیر yoursite.com/order نام دارد. در این حالت اگر وضعیت سفارش پرداخت شده بود (status == 100) او را به مسیر confirm هدایت می کنیم.

حال باید یک صفحه برای دسترسی به فایل دانلودی کاربر ایجاد کنیم. نام این صفحه را confirm.blade.php قرار میدهیم. بنابراین به مسیر resources -> views رفته و سپس فایل confirm را به صورت زیر ایجاد می کنیم:

<h1>سفارش شما با موفقیت ثبت شد</h1>

<p>هم اکنون می توانید این محصول را از طریق لینک زیر دریافت کنید:</p>

<p><a href="/download/{{ $download->id }}" class="btn btn-lg btn-primary">دانلود</a></p>

همانطور که از کدهای html این صفحه مشخص است، ما کاربر را به یک لینک هدایت خواهیم کرد. حال باید این مسیر را ایجاد کنیم. بنابراین در فایل web.php خواهیم داشت:

Route::get('/download/{id}', function($id)
{
    $download = Download::find($id);
    $order = Order::where('user_id', Auth::user()->id)->where('download_id', $download->id)->first();        
    if (order && (Session::get('purchased_download') == $download->id))) {
        Session::forget('purchased_download_id');
        return Response::download(storage_path().'/'.$download->filepath);    
    } else {
        App::abort(401, 'Access denied');
    }
});

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

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

در نهایت با دستور Session تعیین می کنیم که آیا کاربر محصول موردنظر را خریداری کرده است یا خیر؟ اگر محصول را خریده داری کرده باشد، سشن purchased_download_id را در حذف و سپس لینک دانلود محصول را با استفاده از دستور Response::download در اختیار او قرار می دهیم. در غیر اینصورت عبارت Access denied یا عدم دسترسی را نمایش خواهیم داد.

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

نویسنده شوید
دیدگاه‌های شما (2 دیدگاه)

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

نخعی
26 آبان 1402
با سلام از این پکیج استفاده کردم تا چند روز پیش درست کار می‌کرده الان رفتم داخل سایتم خطا میده مقدار بولین داره علتش چیه $result['status']==100

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.

سهند
09 آذر 1397
سلام و خداقوت لطفا کدهای اموزش ها را برای دانلود بزارید

در این قسمت، به پرسش‌های تخصصی شما درباره‌ی محتوای مقاله پاسخ داده نمی‌شود. سوالات خود را اینجا بپرسید.