Mega-Wechat — сервис для отправки шаблонных сообщений WeChat, реализованный на основе сетевого фреймворка Swoole. Он поддерживает отправку большого количества сообщений и одновременно выполняет интерфейс сообщения шаблона отправки. Весь процесс отправки выполняется в соответствии с очередью в порядке очереди. Поддерживает настраиваемые шаблоны сообщений, которые можно изменить и использовать в любое время.
Работая в компании, нам необходимо часто отправлять шаблонные сообщения WeChat назначенным пользователям. В то время реализация других предприятий более актуальна, поэтому мы просто жестко закодируем некоторые шаблонные сообщения в контроллере и выполняем команды для завершения. требования к эксплуатации при их использовании. Поэтому при изменении содержимого шаблона вам необходимо изменить код и обновить его с помощью git. Более того, из-за проблемы единого процесса отправка большого количества сообщений шаблона будет очень трудоемкой (в основном из-за временных затрат). отнимает время на вызов интерфейса WeChat).
Для этого на ум пришло несколько решений:
Первый метод напрямую реализует многопроцессный клиент для вызова WeChat для отправки API шаблонных сообщений через Curl. Этот метод прост и быстр в реализации, но он не может удовлетворить потребности других предприятий в вызове шаблонных сообщений.
Второй метод заключается в том, чтобы один процесс распределял задачи и разветвлял несколько подпроцессов, а также непрерывно опрашивал очередь Redis через подпроцессы. Это решение также относительно просто реализовать, но управляемость настолько плоха, что его практически трудно реализовать. контроль.
Третье решение, которое используется в настоящее время, заключается в использовании swoole для реализации службы, похожей на очередь сообщений. Несколько задач выполняют медленные операции скручивания для настройки API WeChat, а результаты выполнения могут быть возвращены клиенту. Поскольку swoole является очень мощной сетевой платформой и может получать много параллелизма, теоретически swoole может обрабатывать большое количество запросов на отправку шаблонных сообщений. Однако, поскольку API отправки шаблонных сообщений WeChat требует относительно много времени, большое количество запросов. запросить доставку Выполнить в задаче, потому что Скорость обработки не такая высокая, как скорость приема, что приведет к переполнению буфера. Поэтому Mega-Wechat использует очередь файлов, чтобы сначала помещать все запросы в очередь. Когда процесс задачи простаивает, запросы удаляются. очередь и доставлено. Перейдите к задаче для обработки запроса на отправку шаблонного сообщения. Такая реализация не приведет к переполнению буфера и может поддерживать большой объем параллелизма. Однако, поскольку в WeChat существует набор правил и ограничений на шаблонные сообщения, большое количество вызовов API является лишь теоретическим.
Архитектура системы Мега-Вичат представлена на рисунке ниже:
Описание процесса выполнения системы:
Приведенное выше описание представляет собой синхронный процесс, который может быть асинхронной или синхронной обработкой для клиента.
config/ 服务器配置
libs/
Network/
Server/
Swoole/ Mega核心类库
Wechat/ 微信API
logs/
vendor/ 支持composer,依赖monolog写日志
autoload.php
mega Mega命令入口
первый шаг Для установки PHP требуется версия 5.6 или выше. Поскольку очередь на стороне сервера использует функцию SPL и синтаксис новых функций PHP.
Шаг 2 Установите Mysql, подойдет любая версия.
ням, установи MySQL
После успешной установки Mysql необходимо создать таблицу mega_wechat_template. Подробная структура представлена в следующей главе.
Шаг 3 Перед установкой расширения Swoole вы должны убедиться, что в системе установлено следующее программное обеспечение.
php-5.3.10 или выше gcc-4.4 или выше сделать autoconf
Скачать адрес
https://github.com/swoole/swoole-src/releases
http://pecl.php.net/package/swoole
http://git.oschina.net/matyhtf/swoole
После загрузки пакета исходного кода войдите в каталог исходного кода в терминале и выполните следующие команды для компиляции и установки.
компакт-диск
phpize ./настроить
делать
сделать установку
Шаблоны 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. |
создано_at | время создания |
обновлено_at | Время обновления |
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模板命令请求的参数定义
Файлы конфигурации равномерно размещаются в каталоге конфигурации, и каждый сервер имеет независимую конфигурацию.
[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
Запустите сервер в соответствии с файлом конфигурации, используя каждый файл .ini в качестве имени и конфигурации службы, например файл конфигурации config/wechat.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. Клиент отправляет команду «Отправить» на сервер, который один раз выполнит API сообщений шаблона WeChat, а затем ответит клиенту с результатом и вернет подтверждение 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. Если ответ представляет собой ошибку, обычно включается поле сообщения. Например, если команду «Отправить» не удалось отправить, код ответа будет 400, а сообщением будет json, возвращенный интерфейсом сообщений шаблона WeChat в качестве ответа.
Соответствующий класс: NetworkBooleanCommand.
/**
* @param $code int 应答状态码
* @param $message string 消息内容
* @param $opaque int 应答序号
*/
new BooleanCommand ( $ code , $ message , $ opaque )
Первый — использовать протокол отправки, а второй — протокол Push, оба из которых могут работать в разных сценариях.
Протокол Push в основном используется для реализаций, которые не хотят ждать, пока WeChat вызовет API. В частности, Push помещает каждое сообщение шаблона в очередь, и сервер немедленно отвечает. В это время клиент может продолжать выполнять бизнес-логику, не заботясь о том, является ли сообщение шаблона успешным. (Серверная сторона может гарантировать использование этого сообщения)
Протокол отправки также отправляет шаблонные сообщения. В отличие от Push, сервер ответит результатом после вызова API шаблонных сообщений WeChat. После получения ответа клиент может получить отправленный результат (ответом является протокол Result, в случае успеха возвращается код 200, в случае неудачи возвращается код 400, а сообщение представляет собой json результата, возвращаемого WeChat). . На основании результата клиент может выполнить соответствующую логическую обработку.
С протоколом отправки есть несколько проблем:
По сравнению с вышеупомянутыми проблемами преимущество этого протокола заключается в том, что он может знать результат отправки и контролировать бизнес-логику, определяющую, следует ли продолжать отправку следующего сообщения.
Фактический сценарий: если вам нужно отправлять шаблонные сообщения в пакетном режиме определенной группе пользователей или всем пользователям, вы можете использовать этот протокол для достижения этой цели. Отправку пакета шаблонных сообщений пользователям можно рассматривать как задачу. Задача содержит такие данные, как количество отправленных сообщений, количество успешных попыток, количество неудач, ключ шаблона и т. д. Бизнес-логика отправки, получения и записи процесса отправки реализована через клиент. Каждый ответ сервера используется как основа успеха или неудачи обновления. Конкретный бизнес-процесс выглядит следующим образом:
Для реализации описанной выше бизнес-логики рекомендуется использовать асинхронный клиент Swoole, и после запуска клиент может быть запущен в фоновом режиме как процесс демона и при необходимости закрыт с помощью команды kill.
Прилагается рендеринг реализации клиента:
Наконец, прилагается демонстрационная версия клиента с открытым исходным кодом на github: https://github.com/imRainChen/Mega-WeChat-Client.
Если у вас есть какие-либо предложения, пожалуйста, свяжитесь с нами, а также вы можете оставлять вопросы и отзывы.
Электронная почта: [email protected]
Лицензию Apache версии 2.0 см. http://www.apache.org/licenses/LICENSE-2.0.html.