分享者:keyunq,來自原文地址
本節(jié)思路
由于微信小程序的網(wǎng)絡(luò)請(qǐng)求都必須走HTTPS協(xié)議,于是打算用nginx反向代理go的websocket服務(wù),這樣在go的服務(wù)端,不用處理https,提高了性能。
根據(jù)之前的文章:給swoole的websocket server加上ssl
我們已經(jīng)得到了一個(gè)pem文件和一個(gè)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
本節(jié)思路
進(jìn)入小程序的前端開發(fā),驗(yàn)證前面構(gòu)建的websocket服務(wù)能否和小程序聯(lián)通。確認(rèn)聯(lián)通后再同步進(jìn)行前后端的開發(fā)。
小程序的申請(qǐng),開發(fā)者工具下載等準(zhǔn)備工作就不具體闡述了。
打開開發(fā)者工具-選擇小程序開發(fā), 首先面臨的問題就是用戶登錄狀態(tài)的維護(hù)
小程序登錄態(tài)維護(hù)實(shí)現(xiàn)流程
1.通過wx.login獲取登錄態(tài)。 2.通過登錄返回的code發(fā)送給服務(wù)器,服務(wù)器用code換取session_key和openid后。 3.獲取session_key后一般使用緩存框架保存登錄態(tài),服務(wù)端隨機(jī)生成一串唯一字符串3rdSessionId為key,session_key為value組成鍵值對(duì)并存到緩存當(dāng)中,緩存時(shí)間視情況自行決定。 4.將3rdSessionId返回給客戶端 5.客戶端將3rdSessionId緩存到localStorage中,后續(xù)接口從緩存中讀取3rdSessionId,傳遞給服務(wù)器;服務(wù)器根據(jù)3rdSessionId來判斷用戶身份。 6.如果服務(wù)器根據(jù)3rdSessionId在緩存中查找是否存在session_key,如果存在正常執(zhí)行;如果不存在小程序未登錄,重新從第一步流程走。
以上流程是官方推薦使用的流程,并不是維護(hù)登錄態(tài)的唯一途徑。
另外,你也可以在小程序中使用wx.checkSession()檢查登錄態(tài)是否過期。如果過期重新調(diào)用wx.login接口。 session_key在微信服務(wù)器有效期是30天,建議服務(wù)端緩存session_key不超過30天。
而根據(jù)以上流程,將陷入多層嵌套回調(diào),于是用promise優(yōu)化流程
官方在 2017.03.28 更新日志 中 支持絕大部分的 ES6 API 其中包括了Promise
于是可以在微信小程序中使用Promise來處理登錄流程
代碼如下: app.js
-
//app.js
-
App({
-
onLaunch: function () {
-
console.log("App生命周期函數(shù)——onLaunch函數(shù)");
-
},
-
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)
|