ホームページ > バックエンド開発 > PHPチュートリアル > PHP は、WeChat での赤い封筒の送信と受信の効果を模倣します。

PHP は、WeChat での赤い封筒の送信と受信の効果を模倣します。

墨辰丷
リリース: 2023-03-28 15:14:01
オリジナル
3054 人が閲覧しました

最近のプロジェクト開発では、WeChat(メッセージを除く)を模倣した赤い封筒機能の実装が必要ですが、赤い封筒の送信に使用できるのは残高のみです。以下のエディターが、WeChat を模倣した PHP を使用した赤い封筒の送信と受信の効果を共有します。興味のある友達は一緒に見てください。

最近のプロジェクトでは、チャットに基づいた赤い封筒機能を追加する必要があります。 WeChat (メッセージを除く) を模倣していますが、残高を使用して赤い封筒を送信できるのはあなただけです。そこで、WeChatの赤い封筒を何度も使用して、表示情報、分類(個人、グループ普通、グループ幸運)、数制限(100)、数量制限(200)、有効期限(24時間)など、さまざまなインタラクティブインターフェイスとビジネスニーズを理解しました。 ) などを作成して開発を開始します。結局のところ、私は phper です。

1. デザインデータ表は以下の通りです

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. 赤い封筒を送る

チャットインターフェイスがすぐに表示されるので、左の図のように「赤い封筒にお金を詰める」場合、red_pa​​cketテーブルに赤い封筒の情報を挿入し(支払いステータスは未払い)、金額を割り当て、運を計算し、挿入しますそれを red_pa​​cket_log テーブルに追加します (受信者と収集時刻は空です)。右側の図は「支払いの確認」を示しています。成功したら、red_pa​​cket テーブルの支払いステータスを更新し、赤い封筒を送信します。

3. 赤い封筒を受信します (これはグループの赤い封筒についてのみ分析されます)

赤い封筒を受信するためのさまざまな前提条件の検証については、独自に決定してください。これは同時実行の問題です。グループの赤い封筒をつかみ (グループの数十人が赤い封筒をいくつかつかみます)、それを解決するために MQ を導入します。赤い封筒を送るときは、まず赤い封筒の番号を順番に MQ に書き込みます。たとえば、赤い封筒を 3 枚送る場合は、1、2、3 と順番に書き込みます。赤いエンベロープを取得するときに、MQ から値を取得します。取得された番号は、red_pa​​cket_log テーブルの赤いエンベロープに対応する、どの赤いエンベロープを取得したかを示します。次のステップは、red_pa​​cket_log テーブルの受信者と収集時間を更新することです。残高にお金を追加し、売上高の記録などの処理が行われ、数字が取得できない場合は、当然、赤い封筒がつかまれていないことを意味し、「遅い」となります。インターフェイスが直接表示されます。初期段階では、red_pa​​cket_log テーブルの主キーを MQ に書き込むことを検討しました。これにより、ログ レコードのソートと取得が不要になります。ただし、これにより、MQ を使用して「受信消費時間」フィールドを更新するのがより面倒になります。番号を保存すると、最後の赤封筒かどうか(取得した番号などと赤封筒の数)を直接比較し、経過時間が更新されます。

WeChat の赤い封筒の受信結果ページ (幸運のページの表示など) にはさまざまな種類があります。個人とグループの結果は異なり、赤い封筒を送る人と受け取る人では異なる結果が表示され、その後のプロンプトも異なります。個人とグループの赤い封筒の有効期限は異なります。ここでは 1 つずつ列挙しませんが、基本的にはインターフェイスに基づいてデータベースをチェックするだけです。

4. 要件の変更、サードパーティ支払いの追加

サードパーティ支払いに関しては、同期コールバックと非同期コールバック、およびコールバック時間の違いについて言及する必要があります。アプリ側の同期コールバックが成功すると、赤い封筒が送信されます(アプリ側の支払い同期コールバックがコールバックを直接呼び出します)このとき、非同期コールバックが 1 ~ 2 秒遅れる場合、ユーザーは、 0 の赤い封筒を取得します。アプリが長時間接続インターフェイスを呼び出して非同期コールバックが成功したかどうかを確認し、その後赤いエンベロープを送信すると、ユーザー エクスペリエンスは低下します。

# 引入中间状态
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`;
ログイン後にコピー

ユーザーが赤い封筒を掴むと、is_into_account の値が pay_status に基づいて決定されます。

アプリに同期的にコールバックすると、呼び出し側インターフェイスは支払いステータス pay_status を 2 に変更します。非同期でサーバーに戻り、支払いステータス pay_status を 1 に変更し、処理のために is_into_account=1 の red_pa​​cket_log レコードを見つけます。

ただし、上記の 3 つの手順では red_pa​​cket クエリに対して FOR UPDATE 操作を実行する必要があります。そうしないと、実行時間とシーケンスの問題が発生し、一部の red_pa​​cket_log レコードが到着しなくなり、さらに、ロック メカニズムによってユーザーが次のようになります。赤い封筒をつかむときに混乱します。ロックが解除されるまで待たなければならないため、非常に遅くなります。


改善点は次のとおりです: (プロセス全体で FOR UPDATE はありません)

ユーザーが赤い封筒を取得すると、is_into_account の値は pay_status に基づいて決定されます。アプリでは、インターフェースが呼び出されて支払いステータス pay_status が 2 に変更されます。

サーバーに対して非同期コールバックが行われると、支払いステータス pay_status が 1 に変更され、赤いエンベロープ ID (red_pa​​cket 主キー) が MQ に追加されます。 ;

バックグラウンドの自動スクリプトは、MQ から赤いエンベロープ ID を取得した後、赤いエンベロープ is_into_account=0 を配置します。レコードが処理され、5 秒の遅延で赤いエンベロープ ID が再度 MQ に書き込まれ、二次処理が行われます。すべてのデータが確実に受信されるようにするために実行されます。

5.期限切れの赤い封筒の返却

これは red_pa​​cket テーブルの pay_time に基づいて、24 時間を超えてお金が回収されていないかどうかを判断し、ユーザーの残高を返します。

以上がこの記事の全内容です、皆様の学習のお役に立てれば幸いです。


関連する推奨事項:

PHPハーフ検索アルゴリズムのケースの詳細な説明

phpクラスの自動ロード、チェーン操作、マジックメソッドの実装コード_phpヒント

PHPの順序詳細テーブルルックアップ補間ルックアップアルゴリズムの手順の説明

以上がPHP は、WeChat での赤い封筒の送信と受信の効果を模倣します。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート