Gunakan agen platform publik WeChat server nginx yang ditulis dalam Lua.
Target:
Gunakan nginx front-end sebagai proksi WeChat untuk mengurangi sambungan antara lapisan aplikasi internal dan layanan WeChat.
Konfigurasikan balasan otomatis untuk akun publik WeChat dan proses beberapa pesan pengguna di nginx untuk mengurangi tekanan pada lapisan aplikasi.
Manajemen terpadu dari access_token
yang digunakan dalam API akun publik WeChat, sebagai server kontrol pusat untuk mengisolasi lapisan bisnis dan implementasi API, mengurangi tingkat konflik access_token
dan meningkatkan stabilitas layanan.
Terapkan halaman panggilan balik otorisasi WeChat JS-SDK untuk mengurangi tekanan pada lapisan aplikasi.
konfigurasi
Data konfigurasi global akun publik, termasuk token antarmuka dan pengaturan balasan otomatis.
server
Terima permintaan pesan biasa dan permintaan push acara dari WeChat, dan tanggapi sesuai dengan konfigurasi. Jika tidak ada konfigurasi terkait yang dilakukan, success
akan dikembalikan sesuai dengan persyaratan WeChat.
Bagian kode inti ini difaktorkan ulang dan dimodifikasi dari aCayF/lua-resty-wechat.
Gunakan config.autoreplyurl
untuk mengonfigurasi alamat layanan pemrosesan latar belakang, meneruskan, memproses, dan merespons pesan WeChat yang kompleks (Tergantung pada pintsized/lua-resty-http)
proxy_access_token
Gunakan Redis untuk menyimpan cache access_token
dan jsapi_ticket
, secara otomatis memanggil pembaruan layanan WeChat secara rutin, dan mendukung pembaruan terdistribusi.
proksi
Agen memanggil antarmuka API platform publik WeChat dan secara otomatis menambahkan parameter access_token
.
proxy_access_filter
Filter IP klien dan batasi sumber permintaan.
sumpah
jssdk_config
konfigurasi nginx:
http { lua_package_path 'jalur ke berkas lua'; penyelesai 114.114.114.114; lua_shared_dict wechat 1M; # Gunakan memori bersama untuk mempertahankan satu pengatur waktu init_by_lua ' ngx.shared.wechat:delete("updater") -- Hapus pengidentifikasi pengatur waktu yang diperlukan( "resty.wechat.config") '; init_worker_by_lua ' local ok, err = ngx.shared.wechat:add("updater", "1") -- Timer startup proses tunggal jika tidak oke atau err maka return end require("resty.wechat.proxy_access_token")() ' ; server {lokasi /wechat-server { content_by_lua ' memerlukan("resty.wechat.server")() '; }lokasi /wechat-proxy/ { rewrite_by_lua ' require("resty.wechat.proxy")("wechat-proxy") -- parameternya adalah jalur lokasi'; access_by_lua ' require("resty.wechat.proxy_access_filter")( ) ' ; proxy_pass https://api.weixin.qq.com/; }lokasi /wechat-baseoauth { # param: goto rewrite_by_lua ' require("resty.wechat.oauth").base_oauth("jalur ke /wechat-redirect") '; }lokasi /wechat-useroauth { # param: goto rewrite_by_lua ' require("resty.wechat.oauth").userinfo_oauth("jalur ke /wechat-redirect") '; }lokasi /wechat-redirect { rewrite_by_lua ' require("resty.wechat.oauth").redirect() '; }lokasi /wechat-jssdk-config { # GET/POST, param: url, [api] add_header Access-Control-Allow-Origin "jika memerlukan panggilan lintas domain"; content_by_lua ' require("resty.wechat.jssdk_config") () '; } } }
Izin JS-SDK injeksi halaman web:
$.ajax({ url: "jalur url ke /wechat-jssdk-config", data: {url: window.location.href,api: "onMenuShareTimeline|onMenuShareAppMessage|onMenuShareQQ|onMenuShareWeibo|onMenuShareQZone" }, sukses: fungsi(respon) {wx.config(respon); }});$.ajax({ url: "jalur url ke /wechat-jssdk-config", data: {url: window.location.href }, sukses: function(response) {wx.config({ appId: respon.appId, cap waktu: respon.timestamp, nonceStr: respon.nonceStr, tanda tangan: respon.tanda tangan, jsApiList: [ 'onMenuShareTimeline', 'onMenuShareAppMessage', 'onMenuShareQQ' , 'onMenuShareWeibo', 'onMenuShareQZone' ]}); }});
Gunakan Java untuk mengurai cookie yang diperoleh melalui otorisasi halaman web proxy
Peta authInfo = JSON.parseObject(decryptAES(unBase64("nilai cookie"), getKey("kunci AES")));//Kunci AES default: "vFrItmxI9ct8JbAg"//Dikonfigurasi di config.lua -> cookie_aes_key//Metode ketergantungan impor com.alibaba.fastjson.JSON;import com.google.common.base.Charsets;import javax.crypto.Cipher;import javax.crypto.spec.SecretKeySpec;import java.security.Key;padding StringBuilder publik(String s, huruf char, int berulang) {StringBuilder sb = new StringBuilder(s); while (berulang-- > 0) {sb.append(letter); }kembalikan; }padding String publik(String s) {return padding(s, '=', s.length() % 4).toString(); }byte publik[] unBase64(Nilai string) {return org.apache.commons.codec.binary.Base64.decodeBase64(padding(nilai)); }string String publik(byte[] byte) {kembalikan String baru(byte, Charsets.UTF_8); }public String decryptAES(byte[] value, Key key) {coba {Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding");cipher.init(Cipher.DECRYPT_MODE, key);byte[] decrypted = cipher. doFinal(nilai);mengembalikan string(didekripsi); } catch (Pengecualian e) {throw new RuntimeException(e); } }byte publik[] byte(String str) {kembalikan str == null ? }Kunci publik keyFromString(String keyString) {kembalikan SecretKeySpec baru(bytes(keyString), "AES"); }Kunci publik getKey(Kunci string) {if (key.length() >= 16) {return keyFromString(key.substring(0, 16)); }StringBuilder sb = new StringBuilder(key);sementara (sb.length() < 16) {sb.append(key); }return keyFromString(sb.toString().substring(0, 16)); }