哈喽小伙伴们,上一期为大家讲解了一下小程序的架构之【视图层】篇。今天为大家总结几个微信小程序比较常见的面试题和问题吧;希望可以填补大家的知识空缺。好了,让我们一起来看看吧
了解小程序登陆之前,我们写了解下小程序/公众号登录涉及到两个最关键的用户标识:
OpenId
是一个用户对于一个小程序/公众号的标识,开发者可以通过这个标识识别出用户。UnionId
是一个用户对于同主体微信小程序/公众号/APP的标识,开发者需要在微信开放平台下绑定相同账号的主体。开发者可通过UnionId,实现多个小程序、公众号、甚至APP 之间的数据互通了。wx.login
官方提供的登录能力wx.checkSession
校验用户当前的session_key
是否有效wx.authorize
提前向用户发起授权请求wx.getUserInfo
获取用户基本信息wx.getUserProfile
新增获取用户基本信息小程序登录、用户信息相关接口调整说明官方
直接复用现有系统的登录体系,只需要在小程序端设计用户名,密码/验证码输入页面,便可以简便的实现登录,只需要保持良好的用户体验即可
OpenId
是一个小程序对于一个用户的标识,利用这一点我们可以轻松的实现一套基于小程序的用户体系,值得一提的是这种用户体系对用户的打扰最低,可以实现静默登录。具体步骤如下
wx.login
获取 code
;code
向服务端,服务端拿到 code
调用微信登录凭证校验接口,微信服务器返回 openid
和会话密钥 session_key
,此时开发者服务端便可以利用 openid
生成用户入库,再向小程序客户端返回自定义登录态;storage
)自定义登录态(token
),后续调用接口时携带该登录态作为用户身份标识即可。如果想实现多个小程序,公众号,已有登录系统的数据互通,可以通过获取到
用户 unionid
的方式建立用户体系。因为 unionid 在同一开放平台下的所所有应用都是相同的,通过unionid
建立的用户体系即可实现全平台数据的互通,更方便的接入原有的功能,那如何获取
unionid
呢,有以下两种方式
wx.login
可以直接获取 到 unionid
;wx.getUserInfo
和
这两种方式引导用户主动授权,主动授权后通过返回的信息和服务端交互 (这里有一步需要服务端解密数据的过程,很简单,微信提供了示例代码) 即可拿到 unionid
建立用户体系, 然后由服务端返回登录态,本地记录即可实现登录,附上微信提供的最佳实践
wx.login
获取 code
,然后从微信后端换取到 session_key
,用于解密 getUserInfo
返回的敏感数据;wx.getSetting
获取用户的授权情况;
wx.getUserInfo
获取用户最新的信息;
注意事项
:
- 需要获取
unionid
形式的登录体系,在以前(18年4月之前)是通过以下这种方式来实现,但后续微信做了调整(因为一进入小程序,主动弹起各种授权弹窗的这种形式,比较容易导致用户流失),调整为必须使用按钮引导用户主动授权的方式,这次调整对开发者影响较大,开发者需要注意遵守微信的规则,并及时和业务方沟通业务形式,不要存在侥幸心理,以防造成小程序不过审等情况;
wx.login(获取code) ===> wx.getUserInfo(用户授权) ===> 获取 unionid
- 因为小程序不存在
cookie
的概念, 登录态必须缓存在本地,因此强烈建议为登录态设置过期时间;- 值得一提的是如果需要支持风控安全校验,多平台登录等功能,可能需要加入一些公共参数,例如
platform
,channel
,deviceParam
等参数。在和服务端确定方案时,作为前端同学应该及时提出这些合理的建议,设计合理的系统;openid
,unionid
不要在接口中明文传输,这是一种危险的行为,同时也很不专业。
session_key
有有效期,有效期并没有被告知开发者,只知道用户越频繁使用小程序,session_key
有效期越长;wx.logi
n 时会直接更新 session_key
,导致旧 session_key
失效;wx.checkSession
检查登录态,并保证没有过期的 session_key
不会被更新,再调用 wx.login
获取 code
。接着用户授权小程序获取用户信息,小程序拿到加密后的用户数据,把加密数据和 code
传给后端服务。后端通过 code
拿到 session_key
并解密数据,将解密后的用户信息返回给小程序。session_key
对用户信息进行加密。调用 wx.login
重新登录,会刷新 session_key
,这时后端服务从开放平台获取到新 session_key
,但是无法对老 session_key
加密过的数据解密,用户信息获取失败;wx.checkSession
呢?wx.checkSession
检查登录态,并且保证 wx.login
不会刷新 session_key
,从而让后端服务正确解密数据。但是这里存在一个问题,如果小程序较长时间不用导致 session_key
过期,则 wx.login
必定会重新生成 session_key
,从而再一次导致用户信息解密失败。这是一种常见的引流方式,一般同时会在图片中附加一个小程序二维码。
canvas
元素,将需要导出的样式首先在 canvas
画布上绘制出来 (api基本和h5保持一致,但有轻微差异,使用时注意即可;**canvasToTempFilePath
导出图片,最后再使用 saveImageToPhotosAlbum
(需要授权)保存图片到本地。class CanvasKit {
constructor() {
}
drawImg(option = {}) {
...
return this
}
drawRect(option = {}) {
return this
}
drawText(option = {}) {
...
return this
}
static exportImg(option = {}) {
...
}
}
let drawer = new CanvasKit('canvasId').drawImg(styleObj1).drawText(styleObj2)
drawer.exportImg()
注意事项
:
- 小程序中无法绘制网络图片到canvas上,需要通过downLoadFile 先下载图片到本地临时文件才可以绘制;
- 通常需要绘制二维码到导出的图片上,有一种方式导出二维码时,需要携带的参数必须做编码,而且有具体的长度(32可见字符)限制,可以借助服务端生成 短链接 的方式来解决。
WebView
渲染,并非原生渲染。(部分原生);Set-Cookie
;npm
,但是可以自搭构建工具或者使用 mpvue
。(未来官方有计划支持);,可以自己用
babel+webpack自搭或者使用
mpvue`;base64
的方式来使用 iconfont
;formId
,formId
只有7天有效期。(现在的做法是在每个页面都放入form
并且隐藏以此获取更多的 formId
。后端使用原则为:优先使用有效期最短的);2M
,分包总计不超过 8M
;unionId
必须绑在同一个开放平台下。开放平台绑定限制:
access_token
;wx.checkSession
,并且在session_key
有效期内,授权获取用户信息也会得到新的session_key
。这篇为小伙伴们讲解了一些小程序的问题;水滴石穿,积少成多。各位小伙伴让我们 let’s be prepared at all times!
✨原创不易,还希望各位大佬支持一下!
点赞,你的认可是我创作的动力!
⭐️ 收藏,你的青睐是我努力的方向!
✏️ 评论,你的意见是我进步的财富!