分享者:keyunq,來自原文地址
本節思路
由于微信小程序的網絡請求都必須走HTTPS協議,于是打算用nginx反向代理go的websocket服務,這樣在go的服務端,不用處理https,提高了性能。
根據之前的文章:給swoole的websocket server加上ssl
我們已經得到了一個pem文件和一個key文件
配置nginx
-
vi /etc/nginx/conf.d/yourdomain.conf
-
-
map $http_upgrade $connection_upgrade {
-
default upgrade;
-
'' close;
-
}
-
upstream gowebsocket {
-
server 127.0.0.1:8929;
-
}
-
server {
-
listen 443;
-
server_name yourdomain;
-
-
ssl on;
-
ssl_certificate /usr/local/ca/xxxxxxxxxxxxx.pem;
-
ssl_certificate_key /usr/local/ca/xxxxxxxxxxxxxx.key;
-
-
#charset koi8-r;
-
access_log /var/log/nginx/log/yourdomain.access.log main;
-
-
location / {
-
proxy_pass http://gowebsocket;
-
proxy_http_version 1.1;
-
proxy_set_header Upgrade $http_upgrade;
-
proxy_set_header Connection "upgrade";
-
}
-
}
重啟nginx
本節思路
進入小程序的前端開發,驗證前面構建的websocket服務能否和小程序聯通。確認聯通后再同步進行前后端的開發。
小程序的申請,開發者工具下載等準備工作就不具體闡述了。
打開開發者工具-選擇小程序開發, 首先面臨的問題就是用戶登錄狀態的維護
小程序登錄態維護實現流程
1.通過wx.login獲取登錄態。 2.通過登錄返回的code發送給服務器,服務器用code換取session_key和openid后。 3.獲取session_key后一般使用緩存框架保存登錄態,服務端隨機生成一串唯一字符串3rdSessionId為key,session_key為value組成鍵值對并存到緩存當中,緩存時間視情況自行決定。 4.將3rdSessionId返回給客戶端 5.客戶端將3rdSessionId緩存到localStorage中,后續接口從緩存中讀取3rdSessionId,傳遞給服務器;服務器根據3rdSessionId來判斷用戶身份。 6.如果服務器根據3rdSessionId在緩存中查找是否存在session_key,如果存在正常執行;如果不存在小程序未登錄,重新從第一步流程走。
以上流程是官方推薦使用的流程,并不是維護登錄態的唯一途徑。
另外,你也可以在小程序中使用wx.checkSession()檢查登錄態是否過期。如果過期重新調用wx.login接口。 session_key在微信服務器有效期是30天,建議服務端緩存session_key不超過30天。

而根據以上流程,將陷入多層嵌套回調,于是用promise優化流程
官方在 2017.03.28 更新日志 中 支持絕大部分的 ES6 API 其中包括了Promise
于是可以在微信小程序中使用Promise來處理登錄流程
代碼如下: app.js
-
//app.js
-
App({
-
onLaunch: function () {
-
console.log("App生命周期函數——onLaunch函數");
-
},
-
checkSession:function(mysessionid) {
-
return new Promise(function(resolve, reject) {
-
wx.request({
-
url: 'https://xxx.xxxxx.com/check.php',
-
header: {
-
sessionid:mysessionid
-
},
-
success: function(res) {
-
console.log("檢查sessionid是否有效")
-
resolve(res.data)
|