Xây dựng hệ thống referral trong Laravel

Bài viết được sự cho phép của tác giả Kien Dang Chung

Hiện nay, thương mại điện tử đang đạt đến đỉnh cao, rất nhiều các chương trình được đưa ra nhằm tăng doanh số bán hàng, quảng bá sản phẩm mạnh mẽ hơn. Một trong những cách thức đó là các chương trình giới thiệu bán hàng (referral system), nó giống như mô hình truyền thống trong việc mở rộng các đại lý phân phối sản phẩm, tuy nhiên có một điểm khác biệt là các đại lý truyền thống cần có sản phẩm để bán thì với chương trình này, đại lý chỉ việc giới thiệu các sản phẩm, dựa trên uy tín của mình, đại lý có thể giới thiệu được nhiều sản phẩm và có thu nhập tốt.

Tham khảo tuyển dụng Laravel mới nhất trong tháng này

Hệ thống referral là cần thiết?

Các chương trình giới thiệu bán hàng đã tận dụng được lợi thế về quảng bá trên Internet giúp bạn nhanh chóng mở rộng được đại lý bán hàng, tuy nhiên bạn cũng phải thường xuyên tạo ra các chương trình chia sẻ lợi nhuận hấp dẫn, thiết kế các mẫu quảng bá thu hút người xem (hoặc do các đại lý thiết kế) và quan trọng hơn nữa là thường xuyên tạo ra các chương trình chi ân nhằm giữ chân khách hàng lâu dài. Như vậy, có thể thấy Referral là hệ thống quan trọng đối với một website bán hàng, với các website khác áp dụng hệ thống referral cũng là cách tốt để có được lượng traffict lớn ngoài các thành viên thường xuyên.

Trong mô hình trên, bạn có thể thấy tất cả các đối tượng tham gia đều được hưởng lợi:

  • Người giới thiệu (hay còn gọi là đại lý): sẽ nhận được hoa hồng khi giao dịch thành công.
  • Người được mời (người mua): nhận được các chương trình giảm giá, chương trình chi ân khách hàng từ hệ thống. Các hệ thống bán hàng có thể giảm giá tốt hơn với các khách hàng tiềm năng này.
  • Nhà phân phối (có hệ thống giới thiệu bán hàng – referral system): tăng doanh số bán hàng, tiếp cận được nhiều khách hàng tiềm năng.

Xây dựng hệ thống giới thiệu bán hàng – referral system trong ứng dụng Laravel

Chúng ta sẽ tạo ra hai bảng referral_programs và referral_links:

Created Migration

:

2023_04_24_075438_create_referral_programs_table

Created Migration

:

2023_04_24_075503_create_referral_links_table

Created Migration

:

2023_04_24_081042_create_referral_relationships_table

<?php

use

IlluminateSupportFacadesSchema

;

use

IlluminateDatabaseSchemaBlueprint

;

use

IlluminateDatabaseMigrationsMigration

;

class

CreateReferralProgramsTable

extends

Migration

{

public

function

up

(

)

{

Schema

::

create

(

'referral_programs'

,

function

(

Blueprint

$table

)

{

}

)

;

}

public

function

down

(

)

{

Schema

::

dropIfExists

(

'referral_programs'

)

;

}

}

Với file 2023_04_24_075503_create_referral_links_table:

<?php

use

IlluminateSupportFacadesSchema

;

use

IlluminateDatabaseSchemaBlueprint

;

use

IlluminateDatabaseMigrationsMigration

;

class

CreateReferralLinksTable

extends

Migration

{

public

function

up

(

)

{

Schema

::

create

(

'referral_links'

,

function

(

Blueprint

$table

)

{

}

)

;

}

public

function

down

(

)

{

Schema

::

dropIfExists

(

'referral_links'

)

;

}

}

Thêm nội dung tạo referral_relationships:

<?php

use

IlluminateSupportFacadesSchema

;

use

IlluminateDatabaseSchemaBlueprint

;

use

IlluminateDatabaseMigrationsMigration

;

class

CreateReferralRelationshipsTable

extends

Migration

{

public

function

up

(

)

{

Schema

::

create

(

'referral_relationships'

,

function

(

Blueprint

$table

)

{

}

)

;

}

public

function

down

(

)

{

Schema

::

dropIfExists

(

'referral_relationships'

)

;

}

}

Tiếp theo thực hiện tạo hai bảng này bằng lệnh php artisan migrate

Migrated

:

2023_04_24_075438_create_referral_programs_table
Migrated

:

2023_04_24_075503_create_referral_links_table
Migrated

:

2023_04_24_081042_create_referral_relationships_table

Bước 2: Tạo Eloquent Model

Sử dụng câu lệnh artisan make:model để tạo ba model là ReferralProgram, ReferralLink và ReferralRelationship

Model created successfully

.



Model created successfully

.



Model created successfully

.

Trong project này chúng ta sẽ sử dụng package ramsey/uuid là một thư viện làm việc với Universally Unique Identifiers (UUID) tương thích với tiêu chuẩn RFC 4122 phiên bản 1, 3, 4 và 5. Thực hiện cài đặt vào dự án bằng lệnh composer.

Using version

^

3.6

for

ramsey

/

uuid

.

/

composer

.

json has been updated
Loading composer repositories with package information
Updating dependencies

(

including

require

dev

)


Package operations

:

0

installs

,

1

update

,

0

removals
Writing lock file
Generating autoload files
Generating optimized

class

loader


The compiled services file has been removed

.

Ngoài ra chúng ta cần cài đặt thêm gói moontoast/math được sử dụng trong các thuật toán của ramsey/uuid:

Using version

^

1.1

for

moontoast

/

math

.

/

composer

.

json has been updated
Loading composer repositories with package information
Updating dependencies

(

including

require

dev

)


Package operations

:

1

install

,

0

updates

,

0

removals

Installing moontoast

/

math

(

1.1

.

2

)

:

Downloading

(

100

%

)


Writing lock file
Generating autoload files
Generating optimized

class

loader


The compiled services file has been removed

.

Nội dung các model như sau, ReferralProgram:

<?php

namespace

App

;

use

IlluminateDatabaseEloquentModel

;

class

ReferralProgram

extends

Model

{

protected

$fillable

=

[

'name'

,

'uri'

,

'lifetime_minutes'

]

;

}

ReferralLink:

<?php

namespace

App

;

use

IlluminateDatabaseEloquentModel

;

use

RamseyUuidUuid

;

class

ReferralLink

extends

Model

{

protected

$fillable

=

[

'user_id'

,

'referral_program_id'

]

;

protected

static

function

boot

(

)

{

static

::

creating

(

function

(

ReferralLink

$model

)

{

}

)

;

}

private

function

generateCode

(

)

{

}

public

static

function

getReferral

(

$user

,

$program

)

{

return

static

::

firstOrCreate

(

[

]

)

;

}

public

function

getLinkAttribute

(

)

{

}

public

function

user

(

)

{

}

public

function

program

(

)

{

}

public

function

relationships

(

)

{

}

}

ReferralRelationship:

<?php

namespace

App

;

use

IlluminateDatabaseEloquentModel

;

class

ReferralRelationship

extends

Model

{

protected

$fillable

=

[

'referral_link_id'

,

'user_id'

]

;

}

Bước 3: Quản lý các đường link giới thiệu

Middleware created successfully

.

và thay đổi nội dung appMiddlewaresStoreReferralCode.php như sau:

<?php

namespace

AppHttpMiddleware

;

use

Closure

;

use

AppReferralLink

;

class

StoreReferralCode

{

public

function

handle

(

$request

,

Closure

$next

)

{

$response

=

$next

(

$request

)

;

}

return

$response

;

}

}

Sau đó đăng ký middleware này như một global middleware bằng cách thêm vào trong file appHttpKernel.php:

.

.

.

App

Http

Middleware

StoreReferralCode

::

class

,

]

Phương thức handle() của middleware StoreReferralCode sẽ thực hiện kiểm tra tất cả các request nếu có tham số ref sẽ tìm kiếm

Bước 4: Tạo Event và Listener quản lý các hành động người dùng

Khi hành động như mong muốn được người dùng thực hiện (ở đây là đăng ký tài khoản mới), chúng ta thực hiện tạo ra một event và dùng listener để bắt sự kiện đó, trong listener sẽ thực hiện tặng thưởng cho người dùng. Thêm cấu hình vào chúng tôi trong thư mục appProviders:

    

protected

$listen

=

[

.

.

.

'AppListenersRewardUser'

,

]

,

]

;

Events

and

listeners generated successfully

!

Thay đổi nội dung của Event appEventsUserReferred.php:

<?php

namespace

AppEvents

;

use

IlluminateBroadcastingChannel

;

use

IlluminateQueueSerializesModels

;

use

IlluminateBroadcastingPrivateChannel

;

use

IlluminateBroadcastingPresenceChannel

;

use

IlluminateFoundationEventsDispatchable

;

use

IlluminateBroadcastingInteractsWithSockets

;

use

IlluminateContractsBroadcastingShouldBroadcast

;

class

UserReferred

{

use

Dispatchable

,

InteractsWithSockets

,

SerializesModels

;

public

$referralId

;

public

$user

;

public

function

__construct

(

$referralId

,

$user

)

{

}

public

function

broadcastOn

(

)

{

return

new

PrivateChannel

(

'channel-name'

)

;

}

}

Thêm nội dung của appListenerRewardUser.php:

<?php

namespace

AppListeners

;

use

AppEventsUserReferred

;

use

IlluminateQueueInteractsWithQueue

;

use

IlluminateContractsQueueShouldQueue

;

class

RewardUser

{

public

function

__construct

(

)

{

}

public

function

handle

(

UserReferred

$event

)

{

if

(

!

is_null

(

$referral

)

)

{

}

}

}

}

Ok, tiếp theo chúng ta sẽ tạo ra một event appEventsUserReferred.php khi người dùng đăng ký bằng cách can thiệp vào phương thức create() của chúng tôi nằm trong appHttpControllersAuth:

 
    

protected

function

create

(

array

$data

)

{

$user

=

User

::

create

(

[

]

)

;

return

$user

;

}

Bước 5: Thêm view và route cho referral system

Thêm route vào routes/web.php:

Route

::

get

(

'/referral'

,

function

(

)

{

return

view

(

'fontend.referral'

)

;

}

)

;

Tạo view chúng tôi trong resources/views/fontend:

@

extends

(

'layouts.default'

)

@

section

(

'content'

)

@empty Không có chương trình referral nào

!

@endforelse @endsection

Thêm menu Referral System vào resources/views/layouts/menu.php:

{

!

!

Form

::

close

(

)

!

!

}


@

if

(

Session

::

has

(

‘login’

)

&&

Session

::

get

(

‘login’

)

==

true

)


@

endif

Kiểm tra kết quả hoạt động hệ thống referral

Trước khi đi vào kiểm tra hoạt động hệ thống referral, chúng ta cùng xem qua luồng hoạt động của nó.

Psy Shell v0

.8

.

3

(

PHP

5.6

.

20

ΓÇö cli

)

by Justin Hileman
uri

:

“register”

,


updated_at

:

“2017-04-24 08:24:42”

,


created_at

:

“2017-04-24 08:24:42”

,


id

:

1

,

}


Exit

:

Goodbye

.

Như vậy, thành viên này đã có referral link, thành viên này muốn kiếm tiền có thể đưa đường dẫn này vào bất kỳ đâu: – Mạng xã hội Facebook, Google Plus, Twitter, Github…

  • Website: Blog, trang tin tức…
  • Email: Gửi email trong nội dung có đường dẫn này.

Trong khoảng thời gian này, nếu người dùng trên thực hiện đăng ký tài khoản, referral system sẽ biết do đã cài đặt các Event và Listener. Khi đó tùy thuộc vào chương trình giới thiệu bán hàng chúng ta sẽ xử lý trả thưởng cho cả người chia sẻ link và người dùng link trong phương thức hanlde() của Listener.

 

public

function

handle

(

UserReferred

$event

)

{

if

(

!

is_null

(

$referral

)

)

{

}

}

}

Để kiểm tra các công đoạn này, chúng ta mở một trình duyệt khác và dán vào đường dẫn referral ở trên (Trong bài viết này, người chia sẻ link dùng Chrome, người dùng link sử dụng Firefox):

Khi thực hiện đăng ký xong, quay trở lại với người chia sẻ link chúng ta sẽ thấy số lượng người sử dụng link tăng lên:

Ok, như vậy referral system của chúng ta đã hoạt động tốt. Với khung ứng dụng này, chúng ta hoàn toàn có thể thực hiện các hệ thống referral với các sự kiện phức tạp hơn.