91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP如何仿微信發紅包實現領紅包效果

發布時間:2021-08-26 15:15:35 來源:億速云 閱讀:101 作者:小新 欄目:開發技術

這篇文章主要為大家展示了“PHP如何仿微信發紅包實現領紅包效果”,內容簡而易懂,條理清晰,希望能夠幫助大家解決疑惑,下面讓小編帶領大家一起研究并學習一下“PHP如何仿微信發紅包實現領紅包效果”這篇文章吧。

一、設計數據表如下

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='紅包領取日志表';

二、發紅包

PHP如何仿微信發紅包實現領紅包效果PHP如何仿微信發紅包實現領紅包效果

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

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

PHP如何仿微信發紅包實現領紅包效果

PHP如何仿微信發紅包實現領紅包效果

領紅包的各種前提校驗請自己腦補,這里說一個搶群紅包的并發問題(群里的幾十個人搶幾個紅包),引入MQ來解決。在發紅包的時候,先把紅包個數依次寫入MQ,比如發3個紅包,就依次寫入1、2、3。搶紅包的時候從MQ取值,取得到數字說明你是第幾個搶到紅包,對應 red_packet_log 表里的第幾個紅包,接下來的就是更新 red_packet_log 表的領取人和領取時間,以及余額加錢以及記流水等業務處理了,然后返回領取結果;取不到數字的當然就說明沒有搶到紅包,直接出“手慢了”的界面。前期有考慮把 red_packet_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_packet_log 記錄進行處理。

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

改進如下:(全程不 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如何仿微信發紅包實現領紅包效果”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

苗栗县| 庐江县| 连山| 永川市| 子长县| 怀仁县| 太仓市| 道真| 施甸县| 平顶山市| 榆树市| 新丰县| 金寨县| 禹城市| 丹寨县| 杨浦区| 洞口县| 礼泉县| 敖汉旗| 昆山市| 屏南县| 黄石市| 株洲县| 临高县| 大兴区| 延安市| 余庆县| 谷城县| 东山县| 图片| 仁布县| 贵阳市| 金寨县| 娱乐| 梓潼县| 泗水县| 木里| 临沂市| 和龙市| 拉萨市| 大宁县|