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

2022-10-06 08:51:11 字數 4336 閱讀 6563

近期專案需要在聊天的基礎上新增紅包功能,需求:仿微信(不含留言),但只能使用餘額發紅包。於是多次使用微信紅包,了解各種互動介面及業務需求,如展示資訊、分類(個人,群普通,群拼手氣)、個數限制(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=utf程式設計客棧8 comment='紅包領取日誌表';

二、發紅包

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

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

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

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

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

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

# 引入中間狀態

altebezxsvvr table `red_packet`

modify column `pay_status` tinyint(1) unsigned not null default 0 comment '支付狀態:0未支付,1已支付,2等待到賬' after `for_id`,

add column `pay_t程式設計客棧ype` 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_packet_log 記錄進行處理。

但是上面這三步都要對 red_packet 的查詢進行 for update 操作,不然會有執行時間和順序問題,導致部分 red_packet_log 記錄未到賬 is_into_account=0;另外鎖機制還會使得使用者搶紅包時變得很慢,因為要等鎖釋放www.cppcns.com。

改進如下:(全程不 for update)

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

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

非同步**到服務端時,則把支付狀態 pay_status 變為1,並把紅包id(red_packet主鍵)放入mq;

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

五、紅包過期退還

這裡就乙個自動指令碼,根據 red_packet 表的 pay_time 判斷是否超過24小時且沒領完的錢,退回使用者餘額。

本文標題: php仿微信發紅包領紅包效果

本文位址: /wangluo/php/168372.html

php實現微信發紅包功能

微信商家後台 現金紅包開發 生成簽名,引數 生成簽名的引數和是否編碼 function create qianming arr,urlencode buff.k.v.if strlen buff 0 return reqpar 生成隨機字串,預設32位 function create noncest...

微信小程式如何發紅包

原理 附上引數物件 建立引數map public static sortedmapgetwithdrawparam string openid,int value 建立sign 引數為utf 8編碼和上面的引數map public static string createsign string ch...

JS 實現 微信隨機發紅包思路

開年過來東莞,在回家路上在長沙net社群群裡看到有朋友提了乙個發紅包的問題,很多地方都有型別需求。整理了一下。開盒即用 總金額為100 最大金額10 最小金額2 要求隨機生成15個數 這15個數的總和為100看到錢 來了興趣了解了一下,大概需求是 100元 15個人分,金額大小在2 10之間。1 隨...