Heim > Backend-Entwicklung > PHP-Tutorial > PHP imitiert den Effekt des Sendens roter Umschläge und des Empfangens roter Umschläge auf WeChat

PHP imitiert den Effekt des Sendens roter Umschläge und des Empfangens roter Umschläge auf WeChat

墨辰丷
Freigeben: 2023-03-28 15:14:01
Original
3054 Leute haben es durchsucht

Neueste Projektentwicklung erfordert die Implementierung einer Funktion für rote Umschläge, die WeChat imitiert (ausgenommen Nachrichten), aber nur der Restbetrag kann zum Versenden roter Umschläge verwendet werden. Im Folgenden erläutert Ihnen der Editor die Wirkung des Versendens roter Umschläge und des Empfangens roter Umschläge mithilfe von PHP, das WeChat nachahmt. Interessierte Freunde sollten einen Blick darauf werfen

Aktuelle Projekte müssen Funktionen für rote Umschläge basierend auf den Chat-Anforderungen hinzufügen : Nachahmung von WeChat (ausgenommen Nachrichten) ), aber nur das verbleibende Guthaben kann zum Versenden roter Umschläge verwendet werden. Deshalb habe ich die roten Umschläge von WeChat viele Male verwendet, um verschiedene interaktive Schnittstellen und Geschäftsanforderungen zu verstehen, z. B. Anzeigeinformationen, Klassifizierung (Einzelperson, Gruppe gewöhnlich, Gruppenglück), Anzahllimit (100), Mengenlimit (200), Ablaufzeit (24 Stunden). ) ) und so weiter, und dann mit der Entwicklung beginnen. Die unten genannten Schnittstellen werden grundsätzlich alle für die App-Seite bereitgestellt.

1. Die Designdatentabelle lautet wie folgt

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='红包领取日志表';
Nach dem Login kopieren

2. Senden Sie rote Umschläge

Da der rote Umschlag sofort nach erfolgreicher Zahlung an die Chat-Oberfläche gesendet wird, wenn „Geld einzahlen“. in den roten Umschlag“ im Bild links, fügen Sie die Informationen zum roten Umschlag in die Tabelle red_packet ein (der Zahlungsstatus ist nicht bezahlt), weisen Sie den Betrag zu, berechnen Sie das Glück und fügen Sie ihn in die Tabelle red_packet_log ein (Empfänger und Abholung). Nachdem die „Zahlung bestätigen“ im Bild rechts erfolgreich war, aktualisieren Sie den Zahlungsstatus der red_packet-Tabelle und senden Sie dann einen roten Umschlag.

3. Erhalten Sie rote Umschläge (hier werden nur rote Gruppenumschläge analysiert)

Bitte entscheiden Sie sich selbst für die verschiedenen erforderlichen Überprüfungen für den Erhalt roter Umschläge. Hier besteht ein Parallelitätsproblem beim Erfassen roter Umschläge in der Gruppe (Dutzende Personen in der Gruppe greifen nach mehreren roten Umschlägen), das durch gelöst werden kann Einführung von MQ. Wenn Sie rote Umschläge versenden, schreiben Sie zunächst nacheinander die Anzahl der roten Umschläge in MQ. Wenn Sie beispielsweise 3 rote Umschläge versenden, schreiben Sie nacheinander 1, 2 und 3. Wenn Sie einen roten Umschlag abrufen, erhalten Sie den Wert von MQ. Die erhaltene Zahl gibt an, welchen roten Umschlag Sie erhalten haben, was dem roten Umschlag in der Tabelle red_packet_log entspricht. Der nächste Schritt besteht darin, den Empfänger und die Erfassungszeit der Tabelle red_packet_log zu aktualisieren Fügen Sie Geld zum Kontostand hinzu, und das Geschäft wird verarbeitet, und wenn die Nummer nicht abgerufen werden kann, bedeutet dies natürlich, dass der rote Umschlag nicht ergriffen wird und das „Ich bin langsam“ ist. Die Benutzeroberfläche wird direkt angezeigt. In der Anfangsphase haben wir darüber nachgedacht, den Primärschlüssel der Tabelle red_packet_log in MQ zu schreiben, wodurch die Notwendigkeit entfällt, den Protokolldatensatz zu sortieren und abzurufen. Dies würde jedoch die Aktualisierung des Felds „Belegverbrauchszeit“ mit MQ erschweren Wenn Sie Nummern speichern, können Sie direkt vergleichen, ob es sich um den letzten roten Umschlag handelt (die erhaltene Nummer usw. und die Anzahl der roten Umschläge), und dann wird die verstrichene Zeit aktualisiert.

Es gibt viele Arten von WeChat-Ergebnisseiten mit roten Umschlägen (d. h. überprüfen Sie Ihre Glücksseite): Einzel- und Gruppenergebnisse sind unterschiedlich, die Person, die den roten Umschlag sendet, und die Person, die den roten Umschlag erhält, sehen unterschiedlich aus Die Ergebnisse und die einzelnen roten Umschläge verfallen. Danach sind die Eingabeaufforderungen unterschiedlich und ich werde sie hier nicht einzeln auflisten. Sie überprüfen im Grunde nur die Datenbank.

4. Änderungen der Anforderungen, Hinzufügen von Drittanbieterzahlungen

Wenn es um Drittanbieterzahlungen geht, müssen wir synchrone und asynchrone Rückrufe sowie die erwähnen Zeitunterschied beim Rückruf. Wenn der Synchronisierungsrückruf auf der App-Seite erfolgreich ist, wird der rote Umschlag gesendet (der Zahlungssynchronisierungsrückruf auf der App-Seite ruft den Rückruf direkt auf, wenn der asynchrone Rückruf zu diesem Zeitpunkt um ein oder zwei Sekunden verzögert ist). holt sich den Zahlungsstatus 0 roter Umschlag. Wenn die App die Schnittstelle für lange Verbindungen aufruft, um zu prüfen, ob der asynchrone Rückruf erfolgreich war, und dann einen roten Umschlag sendet, ist die Benutzererfahrung schlecht.

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

Wenn der Benutzer den roten Umschlag ergreift, wird der Wert von is_into_account basierend auf pay_status bestimmt;

Wenn der synchrone Rückruf erfolgt Die App ändert den Zahlungsstatus pay_status auf 2; wenn

asynchron zum Server zurückgerufen wird, wird der Zahlungsstatus pay_status auf 1 geändert und der red_packet_log-Datensatz von is_into_account=1 gefunden zur Bearbeitung.

Die oben genannten drei Schritte müssen jedoch FOR UPDATE-Vorgänge für die red_packet-Abfrage ausführen, da sonst Ausführungszeit- und Sequenzprobleme auftreten, die dazu führen, dass einige red_packet_log-Datensätze nicht gutgeschrieben werden is_into_account=0; Außerdem wird es sehr langsam, wenn Benutzer rote Umschläge greifen, da sie warten müssen, bis die Sperre aufgehoben wird.


Die Verbesserungen sind wie folgt: (Kein FOR UPDATE im gesamten Prozess)

Wenn der Benutzer den roten Umschlag greift, wird der Wert von is_into_account ermittelt basierend auf pay_status;

Beim synchronen Rückruf zur App-Seite die Schnittstelle aufrufen, um den Zahlungsstatus pay_status auf 2 zu ändern;

Beim asynchronen Rückruf zum Server den Zahlungsstatus pay_status ändern auf 1 und setzen Sie die rote Umschlag-ID (red_packet-Primärschlüssel) MQ;

Nachdem das automatische Hintergrundskript die rote Umschlag-ID von MQ erhalten hat, verarbeitet es den Datensatz des roten Umschlags is_into_account=0 und verzögert dann 5 Sekunden, um die rote Umschlag-ID zur sekundären Verarbeitung erneut in MQ zu schreiben, um sicherzustellen, dass alle Daten angekommen sind.

5. Rückgabe abgelaufener roter Umschläge

Hier ist ein automatisches Skript, das feststellt, ob mehr als 24 Stunden vergangen sind und das Geld nicht eingezogen wurde pay_time der Tabelle red_packet und gibt den Kontostand des Benutzers zurück.

Das Obige ist der gesamte Inhalt dieses Artikels. Ich hoffe, er wird für das Studium aller hilfreich sein.


Verwandte Empfehlungen:

Detaillierte Erläuterung des Falles des PHP-Halbsuchalgorithmus

phpAutomatisches Laden der Klasse, Kettenoperation, Implementierungscode für magische Methoden_phpTipps

Schritte des PHP-Suchalgorithmus für die geordnete Tabellensuche, Interpolation, detailliert Erklärung

Das obige ist der detaillierte Inhalt vonPHP imitiert den Effekt des Sendens roter Umschläge und des Empfangens roter Umschläge auf WeChat. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage