Maison  >  Article  >  développement back-end  >  PHP imite l'effet de l'envoi et de la réception d'enveloppes rouges sur WeChat

PHP imite l'effet de l'envoi et de la réception d'enveloppes rouges sur WeChat

墨辰丷
墨辰丷original
2018-05-31 09:44:202938parcourir

Le développement récent du projet nécessite la mise en place d'une fonction d'enveloppe rouge, imitant WeChat (hors messages), mais seul le solde peut être utilisé pour envoyer des enveloppes rouges. Ci-dessous, l'éditeur partagera avec vous l'effet de l'envoi et de la réception d'enveloppes rouges en utilisant PHP imitant WeChat. Les amis intéressés devraient y jeter un œil

Les projets récents doivent ajouter des fonctions d'enveloppe rouge basées sur les exigences du chat. : imitant WeChat (hors messages) ), mais seul le solde restant peut être utilisé pour envoyer des enveloppes rouges. J'ai donc utilisé les enveloppes rouges WeChat à plusieurs reprises pour comprendre diverses interfaces interactives et besoins commerciaux, tels que l'affichage des informations, la classification (individuelle, groupe ordinaire, groupe chanceux), la limite de nombre (100), la limite de montant (200), le délai d'expiration (24 heures). ) ) et ainsi de suite, puis démarrez le développement. Fondamentalement, toutes les interfaces mentionnées ci-dessous sont fournies côté application. Après tout, je suis un PHPer.

1. Le tableau des données de conception est le suivant

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.

Puisque l'enveloppe rouge sera envoyée à l'interface de chat immédiatement après le paiement réussi, donc dans l'image de gauche, "Mettez de l'argent dans l'enveloppe rouge", insérez les informations de l'enveloppe rouge dans la table red_packet (le statut de paiement n'est pas payé), allouez le montant, calculez la chance et insérez-la dans la table red_packet_log (la le destinataire et l'heure de collecte sont vides). Une fois la « Confirmation du paiement » réussie dans l'image de droite, red_packet est mis à jour, puis envoie des enveloppes rouges.

3. Recevez des enveloppes rouges (seules les enveloppes rouges de groupe sont analysées ici)

Veuillez vous faire votre propre opinion sur les différentes vérifications préalables à la réception des enveloppes rouges. Voici un problème de concurrence lors de la saisie des enveloppes rouges de groupe (des dizaines de personnes dans le groupe saisissent plusieurs enveloppes rouges), qui peut être résolu en. présentation de MQ. Lors de l'envoi d'enveloppes rouges, écrivez d'abord le nombre d'enveloppes rouges dans MQ dans l'ordre. Par exemple, si vous envoyez 3 enveloppes rouges, écrivez 1, 2 et 3 dans l'ordre. Lorsque vous récupérez une enveloppe rouge, obtenez la valeur de MQ. Le numéro obtenu indique quelle enveloppe rouge vous avez récupérée, ce qui correspond à l'enveloppe rouge dans la table red_packet_log. L'étape suivante consiste à mettre à jour le destinataire et l'heure de collecte de la table red_packet_log, et ajoutez de l'argent au solde. Et les affaires telles que l'enregistrement du chiffre d'affaires sont traitées, puis reviennent pour récupérer les résultats si le numéro ne peut pas être obtenu, cela signifie bien sûr que l'enveloppe rouge n'est pas saisie, et le « Je suis lent » ; l’interface apparaîtra directement. Au début, nous avons envisagé d'écrire la clé primaire de la table red_packet_log dans MQ, ce qui éliminerait le besoin de trier et de récupérer l'enregistrement du journal. Cependant, cela rendrait la mise à jour du champ « temps de consommation du reçu » plus difficile à utiliser avec MQ ; stocker les numéros, vous pouvez comparer directement s'il s'agit de la dernière enveloppe rouge (le numéro obtenu, etc. et le nombre d'enveloppes rouges), puis le temps écoulé est mis à jour.

Il existe de nombreux types de pages de résultats de réception d'enveloppes rouges WeChat (c'est-à-dire, vérifiez votre page de chance) : les résultats individuels et de groupe sont différents, la personne qui envoie l'enveloppe rouge et la personne qui reçoit l'enveloppe rouge voient différentes résultats, et les enveloppes rouges individuelles et de groupe expirent. Après cela, les invites sont différentes et ainsi de suite, je ne les listerai pas une par une ici, elles vérifient simplement la base de données en fonction de l'interface.

4. Modifications des exigences, ajout du tiers-paiement

En matière de tiers-paiement, il faut mentionner les rappels synchrones et asynchrones, ainsi que la différence de temps de rappel. Lorsque le rappel de synchronisation côté application réussit, l'enveloppe rouge sera envoyée (le rappel de synchronisation de paiement côté application appelle directement le rappel si le rappel asynchrone est retardé d'une ou deux secondes à ce moment-là, l'utilisateur). récupérera le statut de paiement. 0 enveloppe rouge. Si l'application appelle l'interface de connexion longue pour vérifier si le rappel asynchrone a réussi et envoie ensuite une enveloppe rouge, l'expérience utilisateur sera mauvaise.

# 引入中间状态
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`;

Lorsque l'utilisateur récupère l'enveloppe rouge, la valeur de is_into_account est déterminée en fonction de pay_status

Lorsque le rappel est synchronisé ; vers l'application, appelez L'interface change le statut de paiement pay_status à 2 ; lorsque

rappelle de manière asynchrone au serveur, il modifie le statut de paiement pay_status à 1 et découvre l'enregistrement red_packet_log de is_into_account=1 pour le traitement. .

Cependant, les trois étapes ci-dessus doivent effectuer des opérations FOR UPDATE sur la requête red_packet, sinon il y aura des problèmes de temps d'exécution et de séquence, ce qui empêchera certains enregistrements red_packet_log d'arriver. is_into_account=0 de plus, le mécanisme de verrouillage le fera. Cela amène également les utilisateurs à saisir les enveloppes rouges qui deviennent très lentes car ils doivent attendre que le verrou soit libéré.


Les améliorations sont les suivantes : (Pas de FOR UPDATE dans tout le processus)

Lorsque l'utilisateur récupère l'enveloppe rouge, la valeur de is_into_account est déterminée basé sur pay_status ;

Lors d'un rappel côté application de manière synchrone, appelez l'interface pour modifier le statut de paiement pay_status à 2

Lors d'un rappel asynchrone vers le serveur, modifiez le statut de paiement pay_status ; à 1 et mettez l'identifiant de l'enveloppe rouge (clé primaire red_packet) MQ ; ​​

Le script automatique en arrière-plan, après avoir obtenu l'identifiant de l'enveloppe rouge de MQ, traite l'enregistrement de l'enveloppe rouge is_into_account=0, puis retarde 5. secondes pour écrire à nouveau l'identifiant de l'enveloppe rouge dans MQ pour un traitement secondaire afin de garantir que toutes les données sont arrivées.

5. Retour des enveloppes rouges expirées

Voici un script automatique qui détermine si cela fait plus de 24 heures et si l'argent n'a pas été encaissé selon le pay_time de la table red_packet et renvoie le solde de l'utilisateur.

Ce qui précède représente l’intégralité du contenu de cet article, j’espère qu’il sera utile à l’étude de chacun.


Recommandations associées :

Explication détaillée du cas de l'algorithme de demi-recherche PHP

phpChargement automatique de classe, fonctionnement en chaîne, code d'implémentation de la méthode magique_phpConseils

Étapes de l'algorithme de recherche d'interpolation de recherche de table ordonnée PHP détaillées explication

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn