Home Backend Development PHP Tutorial PHP imitates the effect of sending red envelopes and receiving red envelopes on WeChat

PHP imitates the effect of sending red envelopes and receiving red envelopes on WeChat

May 31, 2018 am 09:44 AM
php Effect Red envelope

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='红包领取日志表';
Copy after login

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`;
Copy after login

When the user grabs the red envelope, the value of is_into_account is determined based on pay_status;

When the callback is synchronized to the app side, the interface is called The payment status pay_status changes to 2;

When the asynchronous callback is made to the server, the payment status pay_status changes to 1, and the red_packet_log record of is_into_account=1 is found for processing.

But the above three steps must perform FOR UPDATE operations on the red_packet query, otherwise there will be execution time and sequence problems, resulting in some red_packet_log records not arriving is_into_account=0; in addition, the lock mechanism will also cause users to grab Red envelopes become very slow because they have to wait for the lock to be released.


Improvements are as follows: (No FOR UPDATE in the whole process)

When the user grabs the red envelope, the value of is_into_account is determined based on pay_status;

When calling back to the app synchronously, call the interface to change the payment status pay_status to 2;

When calling back asynchronously to the server, change the payment status pay_status to 1, and put the red envelope id (red_packet primary key) into MQ;

Background automatic script, after getting the red envelope ID from MQ, process the record of the red envelope is_into_account=0, and then delay for 5 seconds to write the red envelope ID to MQ again for secondary processing to ensure All data has arrived.

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!

Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use

Zend Studio 13.0.1

Zend Studio 13.0.1

Powerful PHP integrated development environment

Dreamweaver CS6

Dreamweaver CS6

Visual web development tools

SublimeText3 Mac version

SublimeText3 Mac version

God-level code editing software (SublimeText3)

PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian PHP 8.4 Installation and Upgrade guide for Ubuntu and Debian Dec 24, 2024 pm 04:42 PM

PHP 8.4 brings several new features, security improvements, and performance improvements with healthy amounts of feature deprecations and removals. This guide explains how to install PHP 8.4 or upgrade to PHP 8.4 on Ubuntu, Debian, or their derivati

7 PHP Functions I Regret I Didn't Know Before 7 PHP Functions I Regret I Didn't Know Before Nov 13, 2024 am 09:42 AM

If you are an experienced PHP developer, you might have the feeling that you’ve been there and done that already.You have developed a significant number of applications, debugged millions of lines of code, and tweaked a bunch of scripts to achieve op

How To Set Up Visual Studio Code (VS Code) for PHP Development How To Set Up Visual Studio Code (VS Code) for PHP Development Dec 20, 2024 am 11:31 AM

Visual Studio Code, also known as VS Code, is a free source code editor — or integrated development environment (IDE) — available for all major operating systems. With a large collection of extensions for many programming languages, VS Code can be c

Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Explain JSON Web Tokens (JWT) and their use case in PHP APIs. Apr 05, 2025 am 12:04 AM

JWT is an open standard based on JSON, used to securely transmit information between parties, mainly for identity authentication and information exchange. 1. JWT consists of three parts: Header, Payload and Signature. 2. The working principle of JWT includes three steps: generating JWT, verifying JWT and parsing Payload. 3. When using JWT for authentication in PHP, JWT can be generated and verified, and user role and permission information can be included in advanced usage. 4. Common errors include signature verification failure, token expiration, and payload oversized. Debugging skills include using debugging tools and logging. 5. Performance optimization and best practices include using appropriate signature algorithms, setting validity periods reasonably,

PHP Program to Count Vowels in a String PHP Program to Count Vowels in a String Feb 07, 2025 pm 12:12 PM

A string is a sequence of characters, including letters, numbers, and symbols. This tutorial will learn how to calculate the number of vowels in a given string in PHP using different methods. The vowels in English are a, e, i, o, u, and they can be uppercase or lowercase. What is a vowel? Vowels are alphabetic characters that represent a specific pronunciation. There are five vowels in English, including uppercase and lowercase: a, e, i, o, u Example 1 Input: String = "Tutorialspoint" Output: 6 explain The vowels in the string "Tutorialspoint" are u, o, i, a, o, i. There are 6 yuan in total

How do you parse and process HTML/XML in PHP? How do you parse and process HTML/XML in PHP? Feb 07, 2025 am 11:57 AM

This tutorial demonstrates how to efficiently process XML documents using PHP. XML (eXtensible Markup Language) is a versatile text-based markup language designed for both human readability and machine parsing. It's commonly used for data storage an

Explain late static binding in PHP (static::). Explain late static binding in PHP (static::). Apr 03, 2025 am 12:04 AM

Static binding (static::) implements late static binding (LSB) in PHP, allowing calling classes to be referenced in static contexts rather than defining classes. 1) The parsing process is performed at runtime, 2) Look up the call class in the inheritance relationship, 3) It may bring performance overhead.

What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? What are PHP magic methods (__construct, __destruct, __call, __get, __set, etc.) and provide use cases? Apr 03, 2025 am 12:03 AM

What are the magic methods of PHP? PHP's magic methods include: 1.\_\_construct, used to initialize objects; 2.\_\_destruct, used to clean up resources; 3.\_\_call, handle non-existent method calls; 4.\_\_get, implement dynamic attribute access; 5.\_\_set, implement dynamic attribute settings. These methods are automatically called in certain situations, improving code flexibility and efficiency.

See all articles