应用程序开发公司
软件开发

针对您的项目需求及预算规划量身制定方案

个体/中小企业/集团/政府机构/行业组织 了解详情 了解详情

微信小程序云端解决方案教程三:会话管理场景

发布时间:2024-01-01 00:00 浏览次数:24

部署和运转


整体架构


1. 准备工作域名和证书


2. 云主机和镜像部署


3. 布局 HTTPS


4. 域名解析


5. 布局云存储 Redis


6. 布局云数据库 MongoDB


7. 启动一笔到底示例 Node 服务


同时实现


会话层同时实现


源代码


微信小程序示例 - 一笔到底


微信小程序提供更多了一套在微信上运转小程序的解决方案,存有比较完备的框架、组件以及 API,在这个平台上面的想象空间非常大。


微信的定位并不是 HTML5,这里很多人都存有误会。在一些同时实现上,并无法想当然地用 HTML5 的思路去思索。比如说,微信的命令USB wx.request并不积极支持 cookie 传达,所以会话层无法采用传统的 Session 方式。


这篇文章互动一个直观的画图应用领域,采用自己新鲜出炉的小程序可以话管理能力去推论并当前用户的身份。


小程序非常简单,采用 Canvas 绘图后,把序列化的 actions 递交给服务器留存。下次读取的时候,再列举用户曾经绘制过的图。


部署和运转


领到利斯勒小程序源码的朋友可以尝试自己运转出来。


整体架构


1. 准备工作域名和证书


在微信小程序中,所有的网路命令受严苛管制,不满足条件的域名和协议无法命令,具体内容包含:


只容许和在 MP 中布局不好的域名展开通信,如果还没域名,须要登记注册一个。


网络命令必须跑 HTTPS 协议,所以你还须要为你的域名提出申请一个证书。


域名登记注册不好之后,可以登入微信公众平台布局通信域名了。


2. 云主机和镜像部署


一笔到底的服务器运转代码和布局已经装箱成腾讯云 CVM 镜像,大家可以轻易采用。


腾讯云用户可以免费申领礼包,体验腾讯云小程序解决方案。


镜像已涵盖所有小程序的服务器环境与代码,须要体验其它小程序的朋友无须重复部署


3. 布局 HTTPS


镜像中已经部署了 nginx,须要在 /etc/nginx/conf.d 下修正布局中的域名、证书、私钥。


布局顺利完成后,即可启动 nginx。


nginx


4. 域名解析


我们还须要嵌入域名记录解析至我们的云服务器上,这样才可以采用域名展开 HTTPS 服务。


在腾讯云登记注册的域名,可以轻易采用云解析控制器去嵌入主机记录,轻易挑选上面出售的 CVM。


解析生效后,我们在浏览器采用域名就可以展开 HTTPS 出访。


5. 布局云存储 Redis


可以话管理倚赖 Redis 展开做为内存管理,开发者可以挑选自行构建 Redis 服务或者轻易出售云存储 Redis 服务。


6. 布局云数据库 MongoDB


一笔到底小程序采用 MongoDB 去存储用户绘制的图像路径,必须运转小程序开发者须要自行构建 MongoDB 服务或者轻易出售云数据库 MongoDB。


7. 启动一笔到底示例 Node 服务


在镜像的 nginx 布局中(/etc/nginx/conf.d),已经把/applet/session的命令留言至 http://127.0.0.1:5757处置。我们须要把 Node 服务运转出来。Node 代码部署在目录/data/release/qcloud-applet-session之下。


步入该目录:


cd /data/release/qcloud-applet-session


在该目录下有个名叫config.js的配置文件(如下右图),根据注解将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 进程,继续执行以下命令启动 node 服务:


pm2 start process.json


同时实现


会话层同时实现


会话层同时实现涵盖两个部分:


服务器端:https://github.com/CFETeam/weapp-session


客户端:https://github.com/CFETeam/weapp-session-client


我们的 Demo 轻易采用这两个仓库,可以快速地具有会话层的能力。


会话层的同时实现和传统 Cookie 的同时实现方式相似,都就是在 Header 上采用特定的字段追踪。一个命令的完备流程如下:


客户端(微信小程序)发动命令 request


weapp-session-client 外包装 request


首次命令


调用 wx.login() 和 wx.getUserInfo() USB赢得 code、rawData 和 signature


requset 的头部带 code、rawData 和 signature


留存 code 可供下次调用


非首次命令


request 的头部带留存的 code


服务器接到命令 request,中间件从头部抽取 code、rawData 和 signature 字段


如果 code 为空,冲到第 4 步


如果 code 不为空,且 rawData 不为空,须要展开亲笔签名校验


采用 code,appid、app_secret 命令微信USB赢得 session_key 和 openid


如果USB失利,积极响应 ERR_SESSION_KEY_EXCHANGE_FAILED


采用亲笔签名算法通过 rawData 和 session_key 排序亲笔签名 signature2


对照 signature 和 signature2


亲笔签名一致,解析 rawData 为 wxUserInfo


把 openid 载入至 wxUserInfo


把 (code, wxUserInfo) 内存至 Redis


把 wxUserInfo 存放在 request.$wxUserInfo 里


冲到第 4 步


亲笔签名不一致,积极响应 ERR_UNTRUSTED_RAW_DATA


如果 code 不为空,但 rawData 为空,从 Redis 根据 code 查阅内存的用户信息


找出用户信息,存放在 request.$wxUserInfo 字段里,冲到第 4 步


没有找出用户信息(可能将就是过期),积极响应 ERR_SESSION_EXPIRED


request 被业务处置,可以采用 request.$wxUserInfo 去以获取用户信息(request.$wxUserInfo 可能将为空,业务须要自行处理)


源代码


可以从 Github 以获取 https://github.com/CFETeam/weapp-session

TAG标签:
阅读推荐