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.