Recent project development requires the implementation of a red envelope function, imitating WeChat (excluding messages), but only the balance can be used to send red envelopes. The editor below will share with you the effect of sending red envelopes and receiving red envelopes using PHP imitating WeChat. Friends who are interested should take a look.
Recent projects need to add a new red envelope function based on chat. Requirements: imitating WeChat (excluding messages) ), but only the remaining balance can be used to send red envelopes. So I used WeChat red envelopes many times to understand various interactive interfaces and business needs, such as display information, classification (individual, group ordinary, group lucky), number limit (100), amount limit (200), expiration time (24 hours) ) and so on, and then start development. The interfaces mentioned below are basically all provided to the app side. After all, I am a phper.
1. The design data table is as follows
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='红包领取日志表';
2. Send red envelopes
Since the red envelope is sent to the chat interface immediately after the payment is successful, when "Putting money into the red envelope" in the picture on the left, Insert the red envelope information into the red_packet table (the payment status is not paid), allocate the amount, calculate the luck, and insert it into the red_packet_log table (the recipient and collection time are empty). After the "Confirm Payment" is successful in the picture on the right, update the red_packet table Payment status, and then send a red envelope.
3. Receive red envelopes (only group red envelopes are analyzed here)
## Please make up your own mind on the various prerequisite verifications for receiving red envelopes. Here is a concurrency problem of grabbing red envelopes from a group (dozens of people in the group grab several red envelopes), which can be solved by introducing MQ. When sending red envelopes, first write the number of red envelopes into MQ in sequence. For example, if you send 3 red envelopes, write 1, 2, and 3 in sequence. When grabbing a red envelope, get the value from MQ. The number obtained indicates which red envelope you grabbed, which corresponds to the red envelope in the red_packet_log table. The next step is to update the recipient and collection time of the red_packet_log table, and add money to the balance. And the business such as recording turnover is processed, and then returns to collect the results; if the number cannot be obtained, of course it means that the red envelope is not grabbed, and the "I am slow" interface will appear directly. In the early stage, we considered writing the primary key of the red_packet_log table into MQ, which would eliminate the need to sort and retrieve the log records. However, this would make updating the "receipt consumption time" field more troublesome; using MQ to store numbers, you can directly compare whether It is the last red envelope (the number obtained, etc. and the number of red envelopes), and then the elapsed time is updated. There are many types of WeChat red envelope receiving result pages (i.e., viewing luck pages): individual and group results are different, the person who sends the red envelope and the person who receives the red envelope see different results, and the individual and group red envelopes expire. After that, the prompts are different and so on. I won’t list them one by one here. They basically just check the database based on the interface.
4. Changes in requirements, adding third-party payment
When it comes to third-party payment, we need to mention synchronous and asynchronous callbacks, as well as the callback time difference. When the synchronization callback on the app side is successful, the red envelope will be sent out (the payment synchronization callback on the app side calls the callback directly). If the asynchronous callback is delayed by one or two seconds at this time, the user will grab the payment status. 0 red envelope. If the app calls the long connection interface to check whether the asynchronous callback has been successful and then sends a red envelope, the user experience will be poor.# 引入中间状态 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`;
5. Return of expired red envelopes
Here is an automatic script that determines whether it has exceeded 24 hours and the money has not been collected based on the pay_time of the red_packet table, and returns the user's balance.The above is the entire content of this article, I hope it will be helpful to everyone's study.
Related recommendations:
Detailed explanation of PHP half search algorithm case
phpClass automatic loading, chain operation, magic method implementation code_phpTips
PHP ordered table search interpolation search algorithm steps Detailed explanation
The above is the detailed content of PHP imitates the effect of sending red envelopes and receiving red envelopes on WeChat. For more information, please follow other related articles on the PHP Chinese website!