微信小遊戲屬於h5小遊戲,本來h5小遊戲是沒有相關的規則比較自由。因爲有了微信的登錄驗證之後加了少許規則進來。這樣後臺也會有所變化。
https://developers.weixin.qq.com/minigame/dev/tutorial/open-ability/login.html
這裏有官方示例的前後登錄驗證流程;
梳理一下你在後端要多兩件事,第一件事,要拿着前端傳來的code和appid/appsecret一起請求微信接口;第二件就是把這拿到的東西放session裏給前端一個id;以後前端有這個就是登錄,沒有這個就下線了。
我們常規寫的nodejs項目是自己的session,但是如果你要做以上的驗證你用的常規session是要加以改造的,因爲
我們用的相關信息會長期呆在session裏。今天我實現這個session用的是mp-session-koa2。
我們先安裝mp-session-koa2插件npm i mp-session-koa2 -save;
裝好後可以看到 index.js的第141行:
const { sessionKey, openId } = await login({ appId, appSecret, code });
可以看到這個插件是最新的支持es7 await的;這一句就是請求微信的API;login是另一個js文件調用;
const res = await axios.get(exchangeUrl, {
responseType: 'json',
}).catch((e) => {
throw e;
});
login這一段res即是微信返你的res,裏面的openid session_key是我們需要的東東了;
這個插件默認是支持redis的,session將會存在redis裏,真正在開發的時候我們的redis一般會有安全驗證,這樣我們手工加上自己的安全密碼,redisStore.js是我們要動的文件;
this.redis = new Redis();
初始化時這裏需要加,我們可以略爲加以改造;
之前的項目一直用這個插件,wafer-node-session,那個是在express下跑,m但有個很大的不足,即他造的session,是不能修改的。
req.session.xxx = xxxx;這種賦值將失敗;關於這個問題我在官方論壇留言官方給出了mp-session-koa2這個插件,現在來說確如官方所說,現在mp是在koa下跑,ctx.session.xxx= xxx ;這種賦值是可以實現了;這個後端才真正完整,如果session這個主要的共享工具不能存數據,是多麼的難受。
// 保存原始的session數據
const oldSession = _.cloneDeep(ctx.session);
await next();
const newSession = ctx.session;
if (_.isEqual(oldSession, newSession)) return;
//儲存新的session數據
if (!newSession || _.isEmpty(newSession)) {
await Promise.resolve(store.destroy(id, ctx)).catch((e) => {
throw e;
});
ctx.cookies.set(constants.WX_HEADER_ID, null);
return;
}
const ops = Object.assign({}, options, { sid: id });
const sid = await Promise.resolve(store.set(ctx.session, ops, ctx));
ctx.cookies.set(constants.WX_HEADER_ID, sid, options);
這裏這mp實現新數據存儲的邏輯,_ 是lodash,以上大致的意思是如果跑完用戶的接口後,session不是以前的將會再存一下新的;這是在以前wafer-node-session沒有的邏輯;