Mega-Wechat は、Swoole ネットワーク フレームワークに基づいて実装された、WeChat テンプレート メッセージを送信するためのサービスです。大量のメッセージの送信をサポートし、送信テンプレート メッセージ インターフェイスを同時に実行します。送信プロセス全体はキューに従って先着順に実行されます。カスタマイズされたテンプレート メッセージをサポートしており、いつでも変更して使用できます。
企業内で業務を行っている場合、指定されたユーザーに WeChat テンプレート メッセージを頻繁に送信する必要があります。そのときは、他のビジネスの実装がより緊急であるため、いくつかのテンプレート メッセージをコントローラーにハードコーディングし、コマンドを実行するだけで済みます。使用する場合の動作要件。したがって、テンプレートの内容を変更する場合は、コードを変更して git で更新する必要があります。また、単一プロセスの問題により、大量のテンプレート メッセージを送信すると非常に時間がかかります。 WeChat インターフェースを呼び出すカールに時間がかかります)。
これに対していくつかの解決策が思い浮かびました。
最初の方法は、マルチプロセス クライアントを直接実装して WeChat を呼び出し、curl を介してテンプレート メッセージ API を送信します。この方法は実装が簡単ですが、テンプレート メッセージを呼び出す他のビジネスのニーズをサポートできません。
2 番目の方法は、1 つのプロセスにタスクを分散させて複数のサブプロセスをフォークさせ、サブプロセスを通じて Redis キューを継続的にポーリングする方法です。この解決策も実装は比較的簡単ですが、制御性が非常に悪いため、基本的に実装は困難です。コントロール。
現在使用されている 3 番目の解決策は、swoole を使用してメッセージ キューに似たサービスを実装することで、複数のタスクが低速なカール操作を実行して WeChat API を調整し、実行結果をクライアントに返すことができます。 swoole は非常に強力なネットワーク フレームワークであり、大量の同時実行を受信できるため、理論上、swoole は大量のテンプレート メッセージ送信リクエストを処理できます。ただし、WeChat のテンプレート メッセージ送信 API は比較的時間がかかるため、大量のリクエストを処理できます。配信要求 タスク内で実行されるため処理速度は受信速度ほど速くないため、バッファ オーバーフローが発生します。そのため、Mega-Wechat はファイル キューを使用して、タスク プロセスがアイドル状態になったときにすべてのリクエストをキューから取り出します。キューに移動し、テンプレート メッセージを送信するリクエストを処理します。このような実装ではバッファ オーバーフローが発生せず、大量の同時実行をサポートできます。ただし、WeChat にはテンプレート メッセージに関する一連のルールと制限があるため、多数の API 呼び出しは理論上のものにすぎません。
Mega-Wechat システム アーキテクチャを次の図に示します。
システム実行プロセスの説明:
上記の説明は同期処理ですが、クライアントにとっては非同期処理または同期処理になる可能性があります。
config/ 服务器配置
libs/
Network/
Server/
Swoole/ Mega核心类库
Wechat/ 微信API
logs/
vendor/ 支持composer,依赖monolog写日志
autoload.php
mega Mega命令入口
最初のステップPHP をインストールするには、バージョン 5.6 以降が必要です。サーバーサイドキューはSPL関数とPHPの新機能の構文を使用しているため、
ステップ2 Mysql をインストールします。どのバージョンでも問題ありません。
yumでmysqlをインストール
インストールが成功したら、Mysql は mega_wechat_template テーブルを作成する必要があります。詳細な構造については次の章で説明します。
ステップ3 swoole 拡張機能をインストールする前に、次のソフトウェアがシステムにインストールされていることを確認する必要があります。
php-5.3.10 以降 gcc-4.4 以降 make autoconf
ダウンロードアドレス
https://github.com/swoole/swoole-src/releases
http://pecl.php.net/package/swoole
http://git.oschina.net/matyhtf/swoole
ソースコードパッケージをダウンロードした後、ターミナルでソースコードディレクトリに入り、次のコマンドを実行してコンパイルしてインストールします。
CDスウール
phpize ./configure
作る
インストールする
WeChat テンプレートは Mega-Wechat サーバーに保存されます。これは、ほとんどの企業ではテンプレートの内容を頻繁に変更する必要があるため、テンプレートをプログラムに書き込むと非常に不便であるため、テンプレートの保存といくつかの追加フィールドの追加に MySql が使用されます。ビジネスで必要とされる。
サーバーの場合、データベース テンプレートは起動時にキャッシュされます。テンプレートを更新する必要がある場合は、サーバーのテンプレート キャッシュをリアルタイムで更新するための対応するコマンドがあるため、取得の必要性について心配する必要はありません。テンプレートが送信されるたびにデータベースからテンプレートが削除されるため、パフォーマンスが低下します。
テーブル構造:
CREATE TABLE ` mega_wechat_template ` (
` tmpl_key ` char ( 32 ) NOT NULL COMMENT '模板key ' ,
` title ` varchar ( 100 ) NOT NULL DEFAULT ' ' COMMENT '模板标题' ,
` template ` text NOT NULL COMMENT '模板内容' ,
` created_at ` int ( 11 ) NOT NULL DEFAULT ' 0 ' ,
` updated_at ` int ( 11 ) NOT NULL DEFAULT ' 0 ' ,
PRIMARY KEY ( ` tmpl_key ` )
)
フィールドの説明:
分野 | 説明する |
---|---|
tmpl_key | テンプレートキー (Mega テンプレートコマンドリクエストを送信するためのパラメータとして) |
タイトル | テンプレートのタイトル |
テンプレート | テンプレートの内容、保存形式は json |
作成日 | 作成時間 |
更新済み | 更新時間 |
template字段格式,例子如下:
{
"touser" : " ${OPENID} " ,
"template_id" : " ngqIpbwh8bUfcSsECmogfXcV14J0tQlEpBO27izEYtY " ,
"url" : " http://weixin.qq.com/download " ,
"data" :{
"first" : {
"value" : "恭喜你购买成功! " ,
"color" : " #173177 "
},
"keynote1" :{
"value" : "巧克力" ,
"color" : " #173177 "
},
"keynote2" : {
"value" : " 39.8元" ,
"color" : " #173177 "
},
"keynote3" : {
"value" : " 2014年9月22日" ,
"color" : " #173177 "
},
"remark" :{
"value" : "欢迎再次购买! " ,
"color" : " #173177 "
}
}
}
注意:JSON中的${OPENID},是自定义的变量,调用微信模板消息接口前会先解析json模板并替换相应的自定义变量。
该变量由发送Mega模板命令请求的参数定义
構成ファイルは config ディレクトリに均一に配置され、各サーバーは独立した構成を持ちます。
[server]
;启动server类
class = " ServerMegaWechatServer "
;协议类
protocol = " NetworkMegaWechatProtocol "
;主机和端口
listen[] = 127.0.0.1:9501
;缓存模板个数
table_size = 100 ;
;缓存模板内容最大size
template_size = 4048
;文件队列存储路径
queue_file_path = " /Mega-Wechat/logs/queue "
[setting]
; ;;;;;;;;;;;swoole配置;;;;;;;;;;;;;;
dispatch_mode = 2
worker_num = 2
task_worker_num = 8
open_eof_check = true
package_length_type = N
package_length_offset = 0
package_body_offset = 4
package_max_length = 2465792
daemonize = 1
; ;swoole_log文件
; log_file = "/qcloud/logs/swoole.log"
[pdo]
dsn = " mysql:host=127.0.0.1;dbname=mega "
username = root
password = i201314
table_prefix = mega_
[wechat]
app_id = wx10c4b54cf0aae125
app_secret = e01207cc547f62d73f5099aae83a9f15
token = e01207cd547f62d73f5099cae83a9f15
[log]
; ;;;;;系统log配置,基于monolog;;;;;;
log_file = /Mega-Wechat/logs/mega.log
;存储日志级别
log_level = warning
;日志前缀
log_prefix = mega
config/wechat.ini 構成ファイルなど、各 .ini ファイルをサービス名および構成として使用して、構成ファイルに従ってサーバーを起動します。
cd Mega-Wechat
//php mega ${配置文件名} ${cmd}
php mega wechat start //开启服务
php mega wechat stop //关闭服务
php mega wechat restart //重启服务
Mega-Wechat は通信に TCP を使用し、プロトコルは固定ヘッダー + パケット本体プロトコル設計を採用しています。一般的なプロトコルの形式は次のとおりです。
{packLength}{headerLength}{command} {params}{opaque}{bodyLength}{body}
注: {command} {params} 間のスペース、各 params パラメータはスペースで区切られます。
テンプレート メッセージ送信コマンド プロトコル。各コマンドは WeChat テンプレート メッセージの送信を表します。クライアントはサーバーに送信コマンドを送信します。サーバーは WeChat テンプレート メッセージ API を 1 回実行し、結果をクライアントに応答して ACK 確認を返します。
対応するクラスは次のとおりです: NetworkSendCommand
/**
* @param $opaque int 发送序号
* @param $openid string 微信openid
* @param $key string 模板key
* @param $data array 自定义变量,可选,默认为null,例子如下:
* 传入数组为:['mega' => 'wechat']
* 模板内容中包含一个${mega}自定义变量,则数组中的mega值会替换到相应变量中。
* @param $fd int 客户端标志,可选,默认为null
*/
new SendCommand ( $ opaque , $ openid , $ key , $ data , $ fd )
テンプレート メッセージ エンキュー コマンド プロトコル。コマンドを受信すると、サーバーはすぐにキューに参加し、ACK 確認で応答します。その後、キューに従って WeChat テンプレート メッセージ処理を実行します。
対応するクラスは次のとおりです: NetworkPushCommand
/**
* @param $opaque int 发送序号
* @param $openid string 微信openid
* @param $key string 模板key
* @param $data array 自定义变量,可选
*/
new PushCommand ( $ opaque , $ openid , $ key , $ data )
テンプレート キャッシュ コマンド プロトコルを設定します。このコマンドを受信した後、サーバーはキーに従ってデータベースからテンプレートのコンテンツを取得し、それをメモリにキャッシュします。キーが存在しないか、キャッシュ サイズを超えている場合は、関連するエラー メッセージで応答します。
対応するクラスは次のとおりです: NetworkSetTableCommand
/**
* @param $opaque int 发送序号
* @param $key string 模板key
* @param $fd int 客户端标志,客户端发送命令时可为null
*/
new SetTableCommand ( $ opaque , $ key , $ fd )
一般的な応答コマンド プロトコル。要求結果を返します。このプロトコルは、ACK 確認として、および返された不透明な値に基づく最後の要求への応答として使用できます。返されたコードは、HTTP プロトコルの応答ステータス コードと同じセマンティクスを使用して、応答コードとして使用されます。応答がエラーの場合、通常はメッセージ フィールドが含まれます。たとえば、Send コマンドの送信に失敗した場合、応答コードは 400 になり、メッセージは WeChat テンプレート メッセージ インターフェイスによって応答として返される json になります。
対応するクラスは次のとおりです: NetworkBooleanCommand
/**
* @param $code int 应答状态码
* @param $message string 消息内容
* @param $opaque int 应答序号
*/
new BooleanCommand ( $ code , $ message , $ opaque )
1 つ目は送信プロトコルを使用する方法で、もう 1 つはプッシュ プロトコルを使用するもので、どちらもさまざまなシナリオに対応できます。
プッシュ プロトコルは主に、WeChat が API を呼び出すのを待ちたくない実装に使用されます。具体的には、プッシュは各テンプレート メッセージをキューに入れ、サーバーはすぐに応答します。このとき、クライアントはテンプレート メッセージが成功したかどうかを気にせずにビジネス ロジックの実行を続行できます。 (サーバー側はこのメッセージを確実に消費することができます)
送信プロトコルは、プッシュとは異なり、テンプレート メッセージも送信します。サーバーは WeChat テンプレート メッセージ API を呼び出した後に結果を返します。応答を受信した後、クライアントは送信された結果を取得できます (応答は Result プロトコルで、成功した場合はコード 200 が返され、失敗した場合はコード 400 が返されます。メッセージは WeChat によって返された結果の json です)。その結果に基づいて、クライアントは対応する処理を行うことができます。
送信プロトコルにはいくつかの問題があります。
上記の問題と比較して、このプロトコルの利点は、送信結果を知ることができ、次のメッセージの送信を継続するかどうかのビジネス ロジックを制御できることです。
実際のシナリオ:指定したユーザーのグループまたはすべてのユーザーにテンプレート メッセージをバッチで送信する必要がある場合は、このプロトコルを使用してこれを実現できます。テンプレート メッセージのバッチをユーザーに送信することは、タスクとみなすことができます。タスクには、送信されたメッセージの数、成功の数、失敗の数、テンプレート キーなどのデータが含まれます。送信、受信、送信プロセスの記録のビジネス ロジックは、クライアントを通じて実装されます。各サーバーの応答は、更新の成功または失敗の基礎として使用されます。具体的な業務プロセスは以下の通りです。
上記のビジネス ロジックを実装するには、Swoole 非同期クライアントを使用することをお勧めします。実行後、クライアントはデーモン プロセスとしてバックグラウンドで実行でき、必要に応じて kill で閉じることができます。
クライアント実装のレンダリングを添付します。
最後に、オープンソースのクライアント デモ github が添付されています: https://github.com/imRainChen/Mega-WeChat-Client
ご提案がございましたら、お気軽にお問い合わせください。また、質問やフィードバックを投稿することもできます。
電子メール: [email protected]
Apache ライセンス バージョン 2.0 については、http://www.apache.org/licenses/LICENSE-2.0.html を参照してください。