Mega-Wechat adalah layanan untuk mengirim pesan templat WeChat, yang diimplementasikan berdasarkan kerangka jaringan Swoole. Ini mendukung pengiriman pesan dalam jumlah besar dan menjalankan antarmuka pesan template pengiriman secara bersamaan. Seluruh proses pengiriman dijalankan sesuai dengan antrian dengan basis siapa cepat dia dapat. Mendukung pesan templat yang disesuaikan, yang dapat diubah dan digunakan kapan saja.
Saat beroperasi di sebuah perusahaan, pesan templat WeChat harus sering dikirim ke pengguna yang ditunjuk. Pada saat itu, penerapan bisnis lain lebih mendesak, jadi yang perlu dilakukan hanyalah melakukan hardcoding beberapa pesan templat ke dalam pengontrol, dan mengeksekusinya. perintah untuk menyelesaikan persyaratan operasi saat digunakan. Oleh karena itu, ketika mengubah konten template, Anda perlu mengubah kode dan memperbaruinya dengan git. Selain itu, karena masalah proses tunggal, pengiriman pesan template dalam jumlah besar akan sangat memakan waktu (terutama karena waktu-waktu). memakan waktu curl memanggil antarmuka WeChat).
Beberapa solusi muncul dalam pikiran untuk ini:
Metode pertama secara langsung mengimplementasikan klien multi-proses untuk memanggil WeChat untuk mengirim pesan templat API melalui curl. Metode ini sederhana dan cepat untuk diterapkan, namun tidak dapat mendukung kebutuhan bisnis lain untuk memanggil pesan templat.
Metode kedua adalah dengan membuat satu proses mendistribusikan tugas dan membagi beberapa proses anak, dan terus melakukan polling antrian redis melalui proses anak. Solusi ini juga relatif mudah untuk diterapkan, tetapi pengendaliannya sangat buruk sehingga pada dasarnya sulit untuk dikendalikan.
Solusi ketiga dan yang saat ini digunakan adalah mengimplementasikan layanan yang mirip dengan antrian pesan melalui swoole. Beberapa tugas melakukan operasi curl lambat untuk menyesuaikan API WeChat, dan hasil eksekusi dapat dikembalikan ke klien. Karena swoole adalah kerangka jaringan yang sangat kuat dan dapat menerima banyak konkurensi, secara teori, swoole dapat menangani sejumlah besar permintaan untuk mengirim pesan templat. Namun, karena API pengiriman pesan templat WeChat relatif memakan waktu, sejumlah besar pengiriman permintaan Jalankan dalam tugas karena Kecepatan pemrosesan tidak secepat kecepatan penerimaan, yang akan menyebabkan buffer overflow. Oleh karena itu, Mega-Wechat menggunakan antrian file untuk memasukkan semua permintaan ke dalam antrian terlebih dahulu. Saat proses tugas menganggur, permintaan akan dikeluarkan antrian dan dikirim. Buka tugas untuk memproses permintaan mengirim pesan templat. Implementasi seperti itu tidak akan menyebabkan buffer overflows dan dapat mendukung konkurensi dalam jumlah besar. Namun, karena WeChat memiliki seperangkat aturan dan batasan pada pesan templat, sejumlah besar panggilan API hanya bersifat teoritis.
Arsitektur sistem Mega-Wechat ditunjukkan pada gambar di bawah ini:
Deskripsi proses eksekusi sistem:
Uraian di atas adalah proses sinkron, yang dapat berupa pemrosesan asinkron atau sinkron untuk klien.
config/ 服务器配置
libs/
Network/
Server/
Swoole/ Mega核心类库
Wechat/ 微信API
logs/
vendor/ 支持composer,依赖monolog写日志
autoload.php
mega Mega命令入口
langkah pertama Untuk menginstal PHP, diperlukan versi 5.6 atau lebih tinggi. Karena antrian sisi server menggunakan fungsi SPL dan sintaks fitur baru PHP
Langkah 2 Instal Mysql, versi apa pun boleh.
enaknya instal mysql
Setelah instalasi berhasil, Mysql perlu membuat tabel mega_wechat_template. Struktur detailnya diperkenalkan di bab berikutnya.
Langkah 3 Sebelum menginstal ekstensi swoole, Anda harus memastikan bahwa perangkat lunak berikut telah diinstal pada sistem
php-5.3.10 atau lebih tinggi gcc-4.4 atau lebih tinggi membuat autoconf
Alamat unduhan
https://github.com/swoole/swoole-src/releases
http://pecl.php.net/package/swoole
http://git.oschina.net/matyhtf/swoole
Setelah mengunduh paket kode sumber, masuk ke direktori kode sumber di terminal dan jalankan perintah berikut untuk mengkompilasi dan menginstal
CD berputar-putar
phpize ./configure
membuat
buat instal
Templat WeChat disimpan di server Mega-Wechat. Hal ini karena sebagian besar bisnis perlu sering memodifikasi konten template. Untuk template ini yang sering perlu diubah, sangat merepotkan jika ditulis ke dalam program. Oleh karena itu, MySql digunakan untuk menyimpan template dan menambahkan beberapa kolom tambahan dibutuhkan oleh bisnis.
Untuk server, templat database akan di-cache ketika dimulai. Jika templat perlu diperbarui, ada perintah yang sesuai untuk memperbarui cache templat server secara real-time, jadi tidak perlu khawatir tentang kebutuhan untuk mendapatkan templat tersebut. template dari database setiap kali template dikirim, menyebabkan pertanyaan penurunan kinerja.
Struktur tabel:
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 ` )
)
Deskripsi lapangan:
Bidang | menjelaskan |
---|---|
tmpl_key | Kunci templat (sebagai parameter untuk mengirimkan permintaan perintah templat Mega) |
judul | Judul templat |
templat | Konten templat, format penyimpanannya adalah json |
dibuat_di | waktu penciptaan |
diperbarui_di | Perbarui waktu |
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模板命令请求的参数定义
File konfigurasi ditempatkan secara seragam di direktori config, dan setiap server memiliki konfigurasi independen.
[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
Mulai server sesuai dengan file konfigurasi, menggunakan setiap file .ini sebagai nama layanan dan konfigurasi, seperti file konfigurasi config/wechat.ini:
cd Mega-Wechat
//php mega ${配置文件名} ${cmd}
php mega wechat start //开启服务
php mega wechat stop //关闭服务
php mega wechat restart //重启服务
Mega-Wechat menggunakan TCP untuk komunikasi, dan protokolnya mengadopsi desain protokol header + badan paket tetap. Format protokol umum adalah sebagai berikut:
{packLength}{headerLength}{command} {params}{opaque}{bodyLength}{body}
Catatan: spasi di antara {command} {params}, setiap parameter params dipisahkan dengan spasi.
Kirim protokol perintah pesan template, setiap perintah mewakili pengiriman pesan template WeChat. Klien mengirimkan perintah Kirim ke server, yang akan mengeksekusi API pesan template WeChat satu kali dan kemudian merespons klien dengan hasilnya dan mengembalikan konfirmasi ACK.
Kelas yang sesuai adalah: 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 )
Pesan templat mengantri protokol perintah. Setelah menerima perintah, server akan segera bergabung dengan antrian dan merespons dengan konfirmasi ACK. Selanjutnya akan menjalankan pemrosesan pesan template WeChat setelah mengantri sesuai antrian.
Kelas yang sesuai adalah: NetworkPushCommand
/**
* @param $opaque int 发送序号
* @param $openid string 微信openid
* @param $key string 模板key
* @param $data array 自定义变量,可选
*/
new PushCommand ( $ opaque , $ openid , $ key , $ data )
Tetapkan protokol perintah cache templat. Setelah menerima perintah ini, server akan mengambil konten template dari database sesuai dengan kuncinya dan menyimpannya dalam cache di memori. Jika kunci tidak ada atau melebihi ukuran cache, server akan merespons dengan pesan kesalahan yang relevan.
Kelas yang sesuai adalah: NetworkSetTableCommand
/**
* @param $opaque int 发送序号
* @param $key string 模板key
* @param $fd int 客户端标志,客户端发送命令时可为null
*/
new SetTableCommand ( $ opaque , $ key , $ fd )
Protokol perintah respons umum, mengembalikan hasil permintaan. Protokol ini dapat digunakan sebagai konfirmasi ACK dan sebagai respons terhadap permintaan terakhir berdasarkan nilai buram yang dikembalikan. Kode yang dikembalikan digunakan sebagai kode respons, menggunakan semantik yang sama dengan kode status respons protokol HTTP. Jika responsnya berupa kesalahan, kolom pesan biasanya akan disertakan. Misalnya, jika perintah Kirim gagal terkirim, kode responsnya adalah 400, dan pesannya akan berupa json yang dikembalikan oleh antarmuka pesan templat WeChat sebagai respons.
Kelas yang sesuai adalah: NetworkBooleanCommand
/**
* @param $code int 应答状态码
* @param $message string 消息内容
* @param $opaque int 应答序号
*/
new BooleanCommand ( $ code , $ message , $ opaque )
Yang pertama adalah menggunakan protokol Kirim, dan yang lainnya adalah protokol Push, yang keduanya dapat mengatasi skenario yang berbeda.
Protokol Push terutama digunakan untuk implementasi yang tidak ingin menunggu WeChat memanggil API. Secara khusus, Push akan memasukkan setiap pesan template ke dalam antrian, dan server akan segera merespons. Saat ini, klien dapat terus menjalankan logika bisnis tanpa mempedulikan apakah pesan template berhasil. (Sisi server dapat menjamin untuk menggunakan pesan ini)
Protokol Kirim juga mengirimkan pesan templat. Berbeda dengan Push, server akan merespons dengan hasilnya setelah memanggil API pesan templat WeChat. Setelah menerima respon, klien dapat memperoleh hasil yang dikirim (responnya adalah protokol Hasil, kode yang dikembalikan adalah 200 jika berhasil, dan kode 400 dikembalikan jika gagal, dan pesannya adalah json dari hasil yang dikembalikan oleh WeChat) Berdasarkan hasilnya, klien dapat melakukan bisnis yang sesuai.
Ada beberapa masalah dengan protokol Kirim:
Dibandingkan dengan permasalahan di atas, kelebihan protokol ini adalah dapat mengetahui hasil pengiriman, dan dapat mengontrol logika bisnis apakah akan melanjutkan pengiriman pesan berikutnya.
Skenario sebenarnya: Jika Anda perlu mengirim pesan templat secara berkelompok ke sekelompok pengguna tertentu atau semua pengguna, Anda dapat menggunakan protokol ini untuk mencapai hal ini. Mengirim sekumpulan pesan templat ke pengguna dapat dianggap sebagai tugas, tugas tersebut berisi data seperti jumlah pesan yang dikirim, jumlah keberhasilan, jumlah kegagalan, kunci templat, dll. Logika bisnis pengiriman, penerimaan dan pencatatan proses pengiriman diimplementasikan melalui klien. Setiap respons server digunakan sebagai dasar keberhasilan atau kegagalan pembaruan. Proses bisnis spesifiknya adalah sebagai berikut:
Disarankan untuk menggunakan klien asinkron Swoole untuk mengimplementasikan logika bisnis di atas. Setelah dijalankan, klien dapat dijalankan di latar belakang sebagai proses daemon. Dapat ditutup dengan kill jika perlu diselesaikan.
Terlampir adalah rendering implementasi klien:
Terakhir, github DEMO Klien open source terpasang: https://github.com/imRainChen/Mega-WeChat-Client
Jika Anda memiliki saran, jangan ragu untuk menghubungi kami, dan Anda juga dapat mengirimkan pertanyaan dan masukan.
Surel: [email protected]
Lisensi Apache Versi 2.0 lihat http://www.apache.org/licenses/LICENSE-2.0.html