首頁 >後端開發 >php教程 >PHP仿微信發紅包領紅包效果

PHP仿微信發紅包領紅包效果

墨辰丷
墨辰丷原創
2018-05-31 09:44:203046瀏覽

最近專案開發要求實現紅包功能,仿微信(不含留言),但只能使用餘額發紅包。下面小編跟大家分享PHP仿微信發紅包領紅包效果,有興趣的朋友一起看看吧

近期專案需要在聊天的基礎上新增紅包功能,需求:仿微信(不含留言),但只能使用餘額發紅包。於是多次使用微信紅包,了解各種互動介面及業務需求,如展示資訊、分類(個人,群普通,群拼手氣)、個數限制(100)、金額限制(200)、過期時間(24小時)等等,然後著手開發,以下提及的基本全是提供給app端的接口,畢竟我是phper。

一、設計資料表如下

CREATE TABLE `red_packet` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '用户id',
`for_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '发放对象(用户或群id)',
`pay_status` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '支付状态:0未支付,1已支付',
`type` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '类型:1、个人,2、群普通,3、群拼手气',
`intro` varchar(255) NOT NULL DEFAULT '' COMMENT '简介',
`number` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '个数',
`total_money` decimal(10,2) unsigned NOT NULL DEFAULT '0.0' COMMENT '总金额',
`single_money` decimal(10,2) unsigned NOT NULL DEFAULT '0.0' COMMENT '单个红包金额(群拼手气时为0)',
`return_money` decimal(10,2) unsigned NOT NULL DEFAULT '0.0' COMMENT '退还金额',
`is_cli_handle` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否经过cli退款处理:0否,1是',
`expend_time` mediumint(1) unsigned NOT NULL DEFAULT '0' COMMENT '领取消耗时间',
`add_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
`pay_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '支付时间',
PRIMARY KEY (`id`),
KEY `user_id` (`user_id`),
KEY `pay_status` (`pay_status`),
KEY `pay_time` (`pay_time`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='红包发放表';
CREATE TABLE `red_packet_log` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`rp_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '红包id',
`user_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '领取人id',
`money` decimal(10,2) unsigned NOT NULL DEFAULT '0.0' COMMENT '领取金额',
`is_good` tinyint(1) unsigned NOT NULL DEFAULT '0' COMMENT '是否手气最佳:0否,1是',
`add_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '添加时间',
`update_time` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '领取时间',
PRIMARY KEY (`id`),
KEY `rp_id` (`rp_id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='红包领取日志表';

二、發紅包

由於支付成功之後,紅包就馬上發到聊天介面了,所以在左圖「塞錢進紅包」時,就把紅包資訊插入red_pa​​cket 表(支付狀態未支付),並分配好金額、計算手氣打亂後插入red_pa​​cket_log 表(領取人和領取時間為空),右圖「確認支付」成功之後,更新red_pa​​cket 表的支付狀態,然後發出紅包。

三、領紅包(這裡只針對群紅包進行分析)

領紅包的各種前提校驗請自己腦補,這裡說一個搶群紅包的並發問題(群裡的幾十個人搶幾個紅包),引入MQ來解決。在發紅包的時候,先把紅包個數依序寫入MQ,例如發3個紅包,就依序寫入1、2、3。搶紅包的時候從MQ取值,取得到數字說明你是第幾個搶到紅包,對應red_pa​​cket_log 表裡的第幾個紅包,接下來的就是更新red_pa​​cket_log 表的領取人和領取時間,以及餘額加錢而記流水等業務處理了,然後返回領取結果;取不到數字的當然就說明沒有搶到紅包,直接出「手慢了」的介面。前期有考慮把red_pa​​cket_log 表的主鍵寫入MQ,可以省去排序拿第幾條log記錄,但這樣會讓「領取消耗時間」這個欄位的更新更加麻煩;採用MQ存數字,則可以直接比對是否是最後一個紅包(取到的數字等與紅包個數),然後更新消耗時間。

微信紅包的領取結果頁(即查看手氣頁)有很多種:單一和群結果不一樣,發紅包的人和領紅包的人看到的也不一樣,單一和群紅包過期之後提示不一樣等等,這裡不一一列舉,基本上都是根據介面查資料庫而已。

四、需求變更,新增第三方支付

說到第三方支付,就要提及同步和非同步回調,還有回呼時間差。 app端在同步回呼成功的時候,就會把紅包發出去了(app端的支付同步回調是直接調用callback的),如果此時異步回調慢了一兩秒,那麼用戶就會搶到這個支付狀態為0的紅包。如果說讓app端呼叫長連接介面去查非同步回呼是否已經成功,再發出紅包,則使用者體驗比較差。

# 引入中间状态
ALTER TABLE `red_packet`
MODIFY COLUMN `pay_status` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '支付状态:0未支付,1已支付,2等待到账' AFTER `for_id`,
ADD COLUMN `pay_type` tinyint(1) NOT NULL DEFAULT 0 COMMENT '支付方式:0未知,1支付宝,2微信,3银联' AFTER `pay_status`,
ADD COLUMN `trade_no` varchar(30) NOT NULL DEFAULT '' COMMENT '第三方支付交易号' AFTER `pay_type`;
ALTER TABLE `red_packet_log`
ADD COLUMN `is_into_account` tinyint(1) UNSIGNED NOT NULL DEFAULT 0 COMMENT '是否到账:0否,1是' AFTER `is_good`;

用戶搶到紅包的時候,根據pay_status 來決定is_into_account 的值;

同步回調到app端時,呼叫介面把支付狀態pay_status 變成2;

非同步回調到服務端時,則將支付狀態pay_status 變成1,並找出is_into_account=1 的red_pa​​cket_log 記錄進行處理。

但是上面這三步驟都要對red_pa​​cket 的查詢進行FOR UPDATE 操作,不然會有執行時間和順序問題,導致部分red_pa​​cket_log 記錄未到賬is_into_account=0;另外鎖機制還會使得用戶搶紅包時變得很慢,因為要等鎖釋放。


改進如下:(全程不FOR UPDATE)

使用者搶到紅包的時候,根據pay_status 來決定is_into_account 的值;

#同步回調到app端時,當呼叫介面把支付狀態pay_status 變成2;

非同步回調到服務端時,則把支付狀態pay_status 變成1,並把紅包id(red_pa​​cket主鍵)放入MQ;

後台自動腳本,從MQ拿到紅包id之後,把該紅包is_into_account=0 的記錄進行處理,然後再延遲5秒把紅包id再次寫入MQ,進行二次處理,確保資料全部到帳。

五、紅包過期退還

這裡就一個自動腳本,根據 red_pa​​cket 表的 pay_time 判斷是否超過24小時且沒領完的錢,退回用戶餘額。

#

以上就是本文的全部內容,希望對大家的學習有所幫助。


相關推薦:

PHP折半查找演算法案例詳解

php類別自動裝載、鍊式操作、魔術方法實作程式碼_php技巧

#PHP有序表查找插值查找演算法步驟詳解

以上是PHP仿微信發紅包領紅包效果的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn