Mega-Wechat ist ein Dienst zum Versenden von WeChat-Vorlagennachrichten, der auf Basis des Swoole-Netzwerk-Frameworks implementiert ist. Es unterstützt das Senden einer großen Anzahl von Nachrichten und führt die Sendevorlagen-Nachrichtenschnittstelle gleichzeitig aus. Der gesamte Sendevorgang wird entsprechend der Warteschlange nach dem Prinzip „Wer zuerst kommt, mahlt zuerst“ ausgeführt. Unterstützt benutzerdefinierte Vorlagennachrichten, die jederzeit geändert und verwendet werden können.
Wenn wir in einem Unternehmen tätig sind, müssen wir häufig WeChat-Vorlagennachrichten an bestimmte Benutzer senden. Zu diesem Zeitpunkt ist die Implementierung anderer Unternehmen dringender, daher codieren wir einfach einige Vorlagennachrichten fest in den Controller und führen die Befehle aus, um sie abzuschließen Betriebsanforderungen bei der Verwendung. Wenn Sie den Inhalt der Vorlage ändern, müssen Sie daher den Code ändern und ihn mit Git aktualisieren. Aufgrund des Problems eines einzelnen Prozesses ist das Senden einer großen Anzahl von Vorlagennachrichten außerdem sehr zeitaufwändig (hauptsächlich aufgrund der Zeit). zeitraubender Curl-Aufruf der WeChat-Schnittstelle).
Dafür kamen mir mehrere Lösungen in den Sinn:
Die erste Methode implementiert direkt einen Multiprozess-Client zum Aufrufen der WeChat-API zum Senden von Vorlagennachrichten über Curl. Diese Methode ist einfach und schnell zu implementieren, kann jedoch die Anforderungen anderer Unternehmen zum Aufrufen von Vorlagennachrichten nicht unterstützen.
Die zweite Methode besteht darin, dass ein Prozess Aufgaben verteilt und mehrere Unterprozesse aufteilt und die Redis-Warteschlange kontinuierlich durch die Unterprozesse abfragt. Diese Lösung ist ebenfalls relativ einfach zu implementieren, aber die Steuerbarkeit ist so schlecht, dass sie grundsätzlich schwierig ist Kontrolle.
Die dritte Lösung, die derzeit verwendet wird, besteht darin, mit swoole einen Dienst zu implementieren, der einer Nachrichtenwarteschlange ähnelt. Mehrere Aufgaben führen langsame Curl-Vorgänge aus, um die WeChat-API anzupassen, und die Ausführungsergebnisse können an den Client zurückgegeben werden. Da Swoole ein sehr leistungsfähiges Netzwerk-Framework ist und viel Parallelität empfangen kann, kann Swoole theoretisch eine große Anzahl von Anfragen zum Senden von Vorlagennachrichten verarbeiten. Da die API zum Senden von Vorlagennachrichten jedoch relativ zeitaufwändig ist, ist eine große Anzahl erforderlich Lieferung anfordern In Aufgabe ausführen, weil Die Verarbeitungsgeschwindigkeit ist nicht so hoch wie die Empfangsgeschwindigkeit, was zu einem Pufferüberlauf führt. Daher verwendet Mega-Wechat eine Dateiwarteschlange, um alle Anforderungen zuerst in die Warteschlange zu stellen in die Warteschlange gestellt und zugestellt. Gehen Sie zur Aufgabe, um die Anfrage zum Senden der Vorlagennachricht zu verarbeiten. Eine solche Implementierung verursacht keine Pufferüberläufe und kann ein hohes Maß an Parallelität unterstützen. Da WeChat jedoch eine Reihe von Regeln und Einschränkungen für Vorlagennachrichten hat, sind viele API-Aufrufe nur theoretisch.
Die Mega-Wechat-Systemarchitektur ist in der folgenden Abbildung dargestellt:
Beschreibung des Systemausführungsprozesses:
Bei der obigen Beschreibung handelt es sich um einen synchronen Prozess, der für den Client eine asynchrone oder synchrone Verarbeitung sein kann.
config/ 服务器配置
libs/
Network/
Server/
Swoole/ Mega核心类库
Wechat/ 微信API
logs/
vendor/ 支持composer,依赖monolog写日志
autoload.php
mega Mega命令入口
erster Schritt Zur Installation von PHP ist Version 5.6 oder höher erforderlich. Weil die serverseitige Warteschlange die SPL-Funktion und die Syntax der neuen Funktionen von PHP verwendet
Schritt 2 Installieren Sie MySQL, jede Version ist in Ordnung.
Lecker, installiere MySQL
Nach erfolgreicher Installation muss MySQL eine mega_wechat_template-Tabelle erstellen. Die detaillierte Struktur wird im nächsten Kapitel vorgestellt.
Schritt 3 Bevor Sie die Swoole-Erweiterung installieren, müssen Sie sicherstellen, dass die folgende Software auf dem System installiert wurde
php-5.3.10 oder höher gcc-4.4 oder höher Autoconf erstellen
Adresse herunterladen
https://github.com/swoole/swoole-src/releases
http://pecl.php.net/package/swoole
http://git.oschina.net/matyhtf/swoole
Geben Sie nach dem Herunterladen des Quellcodepakets das Quellcodeverzeichnis im Terminal ein und führen Sie die folgenden Befehle zum Kompilieren und Installieren aus
CD swoole
phpize ./configure
machen
make installieren
WeChat-Vorlagen werden auf dem Mega-Wechat-Server gespeichert. Dies liegt daran, dass die meisten Unternehmen den Inhalt von Vorlagen häufig ändern müssen, was sehr unpraktisch ist, wenn sie in das Programm geschrieben werden. Daher wird MySql zum Speichern der Vorlagen und zum Hinzufügen einiger zusätzlicher Felder verwendet vom Unternehmen benötigt.
Für den Server wird die Datenbankvorlage beim Start zwischengespeichert. Wenn die Vorlage aktualisiert werden muss, gibt es entsprechende Befehle, um den Vorlagencache des Servers in Echtzeit zu aktualisieren Die Vorlage wird jedes Mal aus der Datenbank entfernt, wenn die Vorlage gesendet wird, was zu Leistungseinbußen führt.
Tabellenstruktur:
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 ` )
)
Feldbeschreibung:
Feld | veranschaulichen |
---|---|
tmpl_key | Vorlagenschlüssel (als Parameter zum Senden einer Mega-Vorlagenbefehlsanforderung) |
Titel | Vorlagentitel |
Vorlage | Vorlageninhalt, Speicherformat ist JSON |
erstellt_at | Schöpfungszeit |
aktualisiert_at | Aktualisierungszeit |
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模板命令请求的参数定义
Die Konfigurationsdateien werden einheitlich im Konfigurationsverzeichnis abgelegt und jeder Server verfügt über eine unabhängige Konfiguration.
[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
Starten Sie den Server gemäß der Konfigurationsdatei und verwenden Sie jede INI-Datei als Dienstnamen und Konfiguration, z. B. die Konfigurationsdatei config/wechat.ini:
cd Mega-Wechat
//php mega ${配置文件名} ${cmd}
php mega wechat start //开启服务
php mega wechat stop //关闭服务
php mega wechat restart //重启服务
Mega-Wechat verwendet TCP für die Kommunikation und das Protokoll verwendet ein Protokolldesign mit festem Header und Paketkörper. Das allgemeine Protokollformat ist wie folgt:
{packLength}{headerLength}{command} {params}{opaque}{bodyLength}{body}
Hinweis: Die Leerzeichen zwischen {command} {params}, jeder params-Parameter ist durch Leerzeichen getrennt.
Befehlsprotokoll zum Senden einer Vorlagennachricht. Jeder Befehl repräsentiert das Senden einer WeChat-Vorlagennachricht. Der Client sendet einen Sendebefehl an den Server, der die WeChat-Vorlagennachrichten-API einmal ausführt und dann dem Client mit dem Ergebnis antwortet und eine ACK-Bestätigung zurücksendet.
Die entsprechende Klasse ist: 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 )
Befehlsprotokoll zum Einreihen von Vorlagennachrichten. Nach Erhalt des Befehls tritt der Server sofort in die Warteschlange ein und antwortet mit einer ACK-Bestätigung. Anschließend führt er die Verarbeitung der WeChat-Vorlagennachricht entsprechend der Warteschlange aus.
Die entsprechende Klasse ist: NetworkPushCommand
/**
* @param $opaque int 发送序号
* @param $openid string 微信openid
* @param $key string 模板key
* @param $data array 自定义变量,可选
*/
new PushCommand ( $ opaque , $ openid , $ key , $ data )
Legen Sie das Befehlsprotokoll für das Vorlagen-Caching fest. Nach Erhalt dieses Befehls ruft der Server den Vorlageninhalt entsprechend dem Schlüssel aus der Datenbank ab und speichert ihn im Speicher. Wenn der Schlüssel nicht vorhanden ist oder die Cachegröße überschreitet, antwortet er mit entsprechenden Fehlermeldungen.
Die entsprechende Klasse ist: NetworkSetTableCommand
/**
* @param $opaque int 发送序号
* @param $key string 模板key
* @param $fd int 客户端标志,客户端发送命令时可为null
*/
new SetTableCommand ( $ opaque , $ key , $ fd )
Allgemeines Antwortbefehlsprotokoll, gibt das Anforderungsergebnis zurück. Dieses Protokoll kann als ACK-Bestätigung und als Antwort auf die letzte Anfrage basierend auf dem zurückgegebenen undurchsichtigen Wert verwendet werden. Der zurückgegebene Code wird als Antwortcode verwendet und verwendet dieselbe Semantik wie der Antwortstatuscode des HTTP-Protokolls. Wenn es sich bei der Antwort um einen Fehler handelt, wird normalerweise das Nachrichtenfeld eingefügt. Wenn beispielsweise der Sendebefehl fehlschlägt, lautet der Antwortcode 400 und die Nachricht ist der JSON, der von der WeChat-Vorlagennachrichtenschnittstelle als Antwort zurückgegeben wird.
Die entsprechende Klasse ist: NetworkBooleanCommand
/**
* @param $code int 应答状态码
* @param $message string 消息内容
* @param $opaque int 应答序号
*/
new BooleanCommand ( $ code , $ message , $ opaque )
Das erste ist die Verwendung des Sendeprotokolls und das andere das Push-Protokoll, die beide unterschiedliche Szenarien bewältigen können.
Das Push-Protokoll wird hauptsächlich für Implementierungen verwendet, die nicht darauf warten möchten, dass WeChat die API aufruft. Insbesondere stellt Push jede Vorlagennachricht in die Warteschlange und der Server antwortet sofort. Zu diesem Zeitpunkt kann der Client die Geschäftslogik weiter ausführen, ohne sich darum zu kümmern, ob die Vorlagennachricht erfolgreich ist. (Die Serverseite kann garantieren, dass diese Nachricht verarbeitet wird.)
Das Send-Protokoll sendet im Gegensatz zu Push auch Vorlagennachrichten. Der Server antwortet mit dem Ergebnis, nachdem er die WeChat-Vorlagennachrichten-API aufgerufen hat. Nach Erhalt der Antwort kann der Client das gesendete Ergebnis erhalten (die Antwort ist das Ergebnisprotokoll, der zurückgegebene Code ist 200, wenn erfolgreich, und der Code 400 wird zurückgegeben, wenn fehlgeschlagen ist, und die Nachricht ist der JSON des von WeChat zurückgegebenen Ergebnisses). Basierend auf dem Ergebnis kann der Kunde die entsprechende logische Verarbeitung durchführen.
Es gibt mehrere Probleme mit dem Sendeprotokoll:
Im Vergleich zu den oben genannten Problemen besteht der Vorteil dieses Protokolls darin, dass es das Ergebnis des Sendens kennen und die Geschäftslogik steuern kann, ob mit dem Senden der nächsten Nachricht fortgefahren werden soll.
Tatsächliches Szenario: Wenn Sie Vorlagennachrichten stapelweise an eine bestimmte Benutzergruppe oder alle Benutzer senden müssen, können Sie dies mit diesem Protokoll erreichen. Das Senden eines Stapels von Vorlagennachrichten an Benutzer kann als Aufgabe betrachtet werden. Die Aufgabe enthält Daten wie die Anzahl der gesendeten Nachrichten, die Anzahl der Erfolge, die Anzahl der Fehler, den Vorlagenschlüssel usw. Die Geschäftslogik des Sendens, Empfangens und Aufzeichnens des Sendevorgangs wird über den Client implementiert. Jede Serverantwort wird als Grundlage für den Erfolg oder Misserfolg des Updates verwendet. Der spezifische Geschäftsprozess ist wie folgt:
Es wird empfohlen, den asynchronen Swoole-Client zum Implementieren der oben genannten Geschäftslogik zu verwenden. Nach der Ausführung kann der Client im Hintergrund als Daemon-Prozess ausgeführt und bei Bedarf mit Kill geschlossen werden.
Im Anhang finden Sie ein Client-Implementierungs-Rendering:
Schließlich ist der Open-Source-Client DEMO Github beigefügt: https://github.com/imRainChen/Mega-WeChat-Client
Wenn Sie Vorschläge haben, können Sie sich gerne an uns wenden. Sie können auch Fragen und Feedback posten.
E-Mail: [email protected]
Apache-Lizenz Version 2.0 siehe http://www.apache.org/licenses/LICENSE-2.0.html