Mega-Wechat هي خدمة لإرسال رسائل قالب WeChat، ويتم تنفيذها بناءً على إطار عمل شبكة Swoole. وهو يدعم إرسال عدد كبير من الرسائل وينفذ واجهة رسالة قالب الإرسال بشكل متزامن. يتم تنفيذ عملية الإرسال بأكملها وفقًا لقائمة الانتظار على أساس أسبقية الحضور. يدعم رسائل القالب المخصصة، والتي يمكن تغييرها واستخدامها في أي وقت.
عند العمل في شركة، نحتاج إلى إرسال رسائل قالب WeChat بشكل متكرر إلى مستخدمين محددين. في ذلك الوقت، يكون تنفيذ الشركات الأخرى أكثر إلحاحًا، لذلك نقوم ببساطة بترميز بعض رسائل القالب في وحدة التحكم، وتنفيذ الأوامر لإكمال الأمر. متطلبات التشغيل عند استخدامها. لذلك، عند تغيير محتوى القالب، تحتاج إلى تغيير الكود وتحديثه باستخدام git. علاوة على ذلك، نظرًا لمشكلة العملية الفردية، فإن إرسال عدد كبير من رسائل القالب سيستغرق وقتًا طويلاً (يرجع ذلك بشكل أساسي إلى الوقت). استهلاك وقت الضفيرة في الاتصال بواجهة WeChat).
تتبادر إلى ذهني عدة حلول لهذا:
الطريقة الأولى تنفذ مباشرة عميل متعدد العمليات لاستدعاء WeChat لإرسال رسائل قالب API من خلال حليقة. هذه الطريقة بسيطة وسريعة التنفيذ، لكنها لا تستطيع دعم احتياجات الشركات الأخرى لاستدعاء رسائل القالب.
الطريقة الثانية هي جعل عملية واحدة تقوم بتوزيع المهام وتفرع عمليات فرعية متعددة، واستقصاء قائمة انتظار redis بشكل مستمر من خلال العمليات الفرعية. كما أن هذا الحل سهل التنفيذ نسبيًا، ولكن إمكانية التحكم سيئة للغاية بحيث يصعب تنفيذها بشكل أساسي يتحكم.
الحل الثالث، قيد الاستخدام حاليًا، هو استخدام swoole لتنفيذ خدمة مشابهة لقائمة انتظار الرسائل. تقوم المهام المتعددة بإجراء عمليات تجعيد بطيئة لضبط واجهة برمجة تطبيقات WeChat، ويمكن إرجاع نتائج التنفيذ إلى العميل. نظرًا لأن swoole هو إطار عمل شبكي قوي جدًا ويمكنه تلقي الكثير من التزامن، فمن الناحية النظرية، يمكن لـ swoole التعامل مع عدد كبير من طلبات إرسال رسائل القالب، نظرًا لأن واجهة برمجة تطبيقات رسائل قالب الإرسال في WeChat تستغرق وقتًا طويلاً نسبيًا، فإن عددًا كبيرًا منها طلب التسليم تنفيذ في المهمة لأن سرعة المعالجة ليست بنفس سرعة سرعة الاستلام، مما سيؤدي إلى تجاوز سعة المخزن المؤقت، لذلك يستخدم 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، أي إصدار مناسب.
يم تثبيت الخلية
بعد التثبيت الناجح، يحتاج Mysql إلى إنشاء جدول mega_wechat_template، وسيتم تقديم البنية التفصيلية في الفصل التالي.
الخطوة 3 قبل تثبيت ملحق swoole، يجب عليك التأكد من تثبيت البرنامج التالي على النظام
php-5.3.10 أو إصدار أعلى من gcc-4.4 أو إصدار أعلى يقوم بإجراء ضبط تلقائي
عنوان التحميل
https://github.com/swoole/swoole-src/releases
http://pecl.php.net/package/swoole
http://git.oschina.net/matyhtf/swoole
بعد تنزيل حزمة التعليمات البرمجية المصدر، أدخل دليل التعليمات البرمجية المصدر في الجهاز وقم بتنفيذ الأوامر التالية للتجميع والتثبيت
قرص مضغوط سوول
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 | مفتاح القالب (كمعلمة لإرسال طلب أمر القالب الضخم) |
عنوان | عنوان القالب |
نموذج | محتوى القالب وتنسيق التخزين هو json |
create_at | وقت الخلق |
update_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}، يتم فصل كل معلمة بمسافات.
إرسال بروتوكول أمر رسالة القالب، يمثل كل أمر إرسال رسالة قالب WeChat. يرسل العميل أمر إرسال إلى الخادم، والذي سيقوم بتنفيذ واجهة برمجة تطبيقات رسالة قالب 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 بشكل أساسي للتطبيقات التي لا تريد انتظار WeChat للاتصال بواجهة برمجة التطبيقات (API). على وجه التحديد، سيضع Push كل رسالة قالب في قائمة الانتظار، وسيستجيب الخادم على الفور. في هذا الوقت، يمكن للعميل الاستمرار في تشغيل منطق الأعمال دون الاهتمام بما إذا كانت رسالة القالب ناجحة. (يمكن أن يضمن جانب الخادم استهلاك هذه الرسالة)
يرسل بروتوكول الإرسال أيضًا رسائل قالب، على عكس Push، سيستجيب الخادم بالنتيجة بعد استدعاء واجهة برمجة تطبيقات رسالة قالب WeChat. بعد تلقي الرد، يمكن للعميل الحصول على النتيجة المرسلة (الرد هو بروتوكول النتيجة، والرمز الذي يتم إرجاعه هو 200 في حالة النجاح، ويتم إرجاع الرمز 400 في حالة الفشل، والرسالة هي json للنتيجة التي يتم إرجاعها بواسطة WeChat) وبناء على النتيجة، يمكن للعميل القيام بالأعمال المنطقية.
هناك العديد من المشاكل في بروتوكول الإرسال:
بالمقارنة مع المشكلات المذكورة أعلاه، فإن ميزة هذا البروتوكول هي أنه يمكنه معرفة نتيجة الإرسال، ويمكنه التحكم في منطق الأعمال فيما يتعلق بمواصلة إرسال الرسالة التالية.
السيناريو الفعلي: إذا كنت بحاجة إلى إرسال رسائل القالب على دفعات إلى مجموعة محددة من المستخدمين أو جميع المستخدمين، فيمكنك استخدام هذا البروتوكول لتحقيق ذلك. يمكن اعتبار إرسال مجموعة من رسائل القالب إلى المستخدمين مهمة. تحتوي المهمة على بيانات مثل عدد الرسائل المرسلة وعدد النجاحات وعدد حالات الفشل ومفتاح القالب وما إلى ذلك. يتم تنفيذ منطق الأعمال الخاص بإرسال واستقبال وتسجيل عملية الإرسال من خلال العميل. يتم استخدام كل استجابة للخادم كأساس لنجاح التحديث أو فشله. عملية الأعمال المحددة هي كما يلي:
يوصى باستخدام عميل Swoole غير المتزامن لتنفيذ منطق العمل أعلاه، وبعد التشغيل، يمكن تشغيل العميل في الخلفية كعملية خفية، ويمكن إغلاقه بالقتل عند الحاجة.
مرفق عرض تنفيذ العميل:
أخيرًا، تم إرفاق جيثب Client DEMO مفتوح المصدر: https://github.com/imRainChen/Mega-WeChat-Client
إذا كان لديك أي اقتراحات، فلا تتردد في الاتصال بنا، ويمكنك أيضًا نشر الأسئلة والتعليقات.
البريد الإلكتروني: [email protected]
ترخيص Apache الإصدار 2.0، راجع http://www.apache.org/licenses/LICENSE-2.0.html