部署和運行整體架構(gòu)1. 準備域名和證書2. 云主機和鏡像部署3. 配置 HTTPS4. 域名解析5. 配置云存儲 Redis6. 配置云數(shù)據(jù)庫 MongoDB7. 啟動一筆到底示例 Node 服務(wù)實現(xiàn)會話層實現(xiàn)源代碼微信小程序示例 - 一筆到底微信小 ...
微信小程序提供了一套在微信上運行小程序的解決方案,有比較完整的框架、組件以及 API,在這個平臺上面的想象空間很大。
微信的定位并不是 HTML5,這里很多人都有誤解。在一些實現(xiàn)上,并不能想當然地用 HTML5 的思路來思考。比如,微信的請求接口 wx.request并不支持 cookie 傳遞,所以會話層不能使用傳統(tǒng)的 Session 方式。
這篇文章分享一個簡單的畫圖應(yīng)用,使用自己新鮮出爐的小程序會話管理能力來判斷并當前用戶的身份。

小程序非常簡單,使用 Canvas 繪圖后,把序列化的 actions 提交給服務(wù)器保存。下次加載的時候,再列出用戶曾經(jīng)繪制過的圖。
拿到了本小程序源碼的朋友可以嘗試自己運行起來。

在微信小程序中,所有的網(wǎng)路請求受到嚴格限制,不滿足條件的域名和協(xié)議無法請求,具體包括:
域名注冊好之后,可以登錄微信公眾平臺配置通信域名了。

一筆到底的服務(wù)器運行代碼和配置已經(jīng)打包成騰訊云 CVM 鏡像,大家可以直接使用。
騰訊云用戶可以免費領(lǐng)取禮包,體驗騰訊云小程序解決方案。

鏡像已包含所有小程序的服務(wù)器環(huán)境與代碼,需要體驗其它小程序的朋友無需重復部署
鏡像中已經(jīng)部署了 nginx,需要在 /etc/nginx/conf.d 下修改配置中的域名、證書、私鑰。

配置完成后,即可啟動 nginx。
nginx
我們還需要添加域名記錄解析到我們的云服務(wù)器上,這樣才可以使用域名進行 HTTPS 服務(wù)。
在騰訊云注冊的域名,可以直接使用云解析控制臺來添加主機記錄,直接選擇上面購買的 CVM。

解析生效后,我們在瀏覽器使用域名就可以進行 HTTPS 訪問。

會話管理依賴 Redis 進行作為緩存管理,開發(fā)者可以選擇自行搭建 Redis 服務(wù)或者直接購買云存儲 Redis 服務(wù)。
一筆到底小程序使用 MongoDB 來存儲用戶繪制的圖像路徑,要運行小程序開發(fā)者需要自行搭建 MongoDB 服務(wù)或者直接購買云數(shù)據(jù)庫 MongoDB。
在鏡像的 nginx 配置中(/etc/nginx/conf.d),已經(jīng)把/applet/session的請求轉(zhuǎn)發(fā)到 http://127.0.0.1:5757處理。我們需要把 Node 服務(wù)運行起來。Node 代碼部署在目錄/data/release/qcloud-applet-session下。
進入該目錄:
cd /data/release/qcloud-applet-session
在該目錄下有個名為config.js的配置文件(如下所示),根據(jù)注釋將appId、appSecret、redisConfig、mongoConfig修改成自己的配置。
module.exports = { port: '5757', ROUTE_BASE_PATH: '/applet', // 微信小程序 App ID appId: '', // 微信小程序 App Secret appSecret: '', // Redis 配置 // @see https://www.npmjs.com/package/redis#options-object-properties redisConfig: { host: '', port: '', password: '', }, // MongoDB 配置 // @see https://www.qcloud.com/doc/product/240/3979 mongoConfig: { username: '', password: '', host: '', port: '', query: '?authMechanism=MONGODB-CR&authSource=admin', database: 'qcloud-applet-session', },};
一筆到底示例使用 pm2 管理 Node 進程,執(zhí)行以下命令啟動 node 服務(wù):
pm2 start process.json
會話層實現(xiàn)包含兩個部分:
我們的 Demo 直接使用這兩個倉庫,可以快速地擁有會話層的能力。
會話層的實現(xiàn)和傳統(tǒng) Cookie 的實現(xiàn)方式類似,都是在 Header 上使用特殊的字段跟蹤。一個請求的完整流程如下:

requestrequest
wx.login() 和 wx.getUserInfo() 接口獲得 code、rawData 和 signaturerequset 的頭部帶上 code、rawData 和 signaturecode 供下次調(diào)用request 的頭部帶上保存的 coderequest,中間件從頭部提取 code、rawData 和 signature 字段
code 為空,跳到第 4 步code 不為空,且 rawData 不為空,需要進行簽名校驗
code,appid、app_secret 請求微信接口獲得 session_key 和 openid
ERR_SESSION_KEY_EXCHANGE_FAILEDrawData 和 session_key 計算簽名 signature2signature 和 signature2
rawData 為 wxUserInfo
openid 寫入到 wxUserInfo(code, wxUserInfo) 緩存到 RediswxUserInfo 存放在 request.$wxUserInfo 里4 步ERR_UNTRUSTED_RAW_DATAcode 不為空,但 rawData 為空,從 Redis 根據(jù) code 查詢緩存的用戶信息
request.$wxUserInfo 字段里,跳到第 4 步ERR_SESSION_EXPIREDrequest 被業(yè)務(wù)處理,可以使用 request.$wxUserInfo 來獲取用戶信息(request.$wxUserInfo 可能為空,業(yè)務(wù)需要自行處理)可從 Github 獲取 https://github.com/CFETeam/weapp-session