微信小程序的“小”字迷惑了很多人,至今许多人仍然任务小程序很容易(微信也是这样宣传)。其实不然,小程序的门槛不低,虽然可以简单拼凑一个简单的小程序,但要达到实用、好用,需要花费的功夫依然不少。就像能写 Hello World!并不表示你掌握了一门编程语言。
说个实际的例子,用户登陆态的维护就挺麻烦,官方推荐后端产生 session,自己维护用户登陆态,但官方没有提用户取消授权的处理,所以在实际中, 除了判断自定义 session key 之外,首先得判断用户是否授权了。
总的说来,用户基本状态有三种:
- 首次访问,或使用了新的手机,或是重装了微信。此时用户没有 session key。
- 用户有 session key,但未授权访问昵称、头像。
- 用户有 session key,并且授权访问昵称、头像。
授权获取用户名和头像
以前可以调用 wx.getUserInfo() 已经失效,目前唯一可以获取用户名和头像的方式是使用 button ,设定 open-type 为 getUserInfo:
<button open-type=“getUserInfo” lang=“zh_CN” bindgetuserinfo=“onGotUserInfo”>获取用户信息</button>
js 文件中:
onGotUserInfo: function(res) {
console.log(res.detail.userInfo);
}
如果用户拒绝授权,返回的 res.detail.userInfo 是 undefined;如果用户同意授权,则是这个对象:
{
avatarUrl:
“https://wx.qlogo.cn/mmopen/vi_32/Q0j4TwGTfTJtsmOQO4h7r0w6HwJICCpOMfHVfrvcBsZ6DjTY3X0zK9eGMO8CHIYax8lxyONd0vfktI2gIDaknw/139”,
city: “海淀”,
country: “中国”,
gender: 1,
language: “zh_CN”,
nickName: “张三”,
province: “北京”
}
session
按照微信官方解释:
通过 wx.login() 获取到用户登录态之后,需要维护登录态。开发者要注意不应该直接把 session_key、openid 等字段作为用户的标识或者 session 的标识,而应该自己派发一个 session 登录态(请参考登录时序图)。
因此如果只需要识别微信用户,就可以静默获取openid,无需弹出授权框。
如果要获取用户昵称、头像等,或其他信息,需要弹出用户授权登陆框。
另外还有一个函数常引起开发者迷惑:
wx.checkSession()
这个函数通常不需要调用,甚至,其设计就是一个接口冗余。一是用户登陆态由服务器维护,并不需要向微信验证用户登陆态。二是,当我们需要用户处于登陆才能做某些操作时,比如用session_key来解密用户群组,可以有两种处理方法:
- 服务器维护的登陆态同样有会话实效,过期时间与微信的一致,都设置为7200秒。一旦实效过期,重新发起一次wx.login(),更新记录信息。
- 在特定操作实效的时候,重新发起wx.login(),更新登陆信息,再次进行特定操作。
微信推荐的是第一种。