session_key是相当于一个登录状态,应该在小程序加载的时候就获取。因为小程序在后续处理过程中会遇到一些和session_key相关的数据,如手机号、unionId、步行数据等。如果我们等到要用这些数据时,再去获取session_key,就会造成接口的重复调用,而且效率也比较低下。
获取session_key需要两步,一步是wx.login(),它会返回一个code。第二调用服务端的code2session接口,把第一步的code传入,则可以获得session_key、openid,甚至特殊情况下还能获取到unionId(如果关注了关联开放平台的公众号)。这个获取的过程是有点繁琐的,所以,把session_key获取回来放那里备用是正确的做法。
我们小程序常常会用到会员模块,而我们最常用的做法是通过openid来关联会员,这样就可以做到所谓的“微信自动登录”了。如上面所说,在获取openid时,其实需要和获取session_key一样的操作。所以说,与其一上来只获取openid,不如把openid和session_key一起获取了。一步操作,两份收获,何乐不为?!
session_key获取到了之后,就一直有效,一直可以用吗?不是的。微信小程序官方称,session_key是有一定的超时时间的,但具体多久,官方并没有公布。但官方提供了一下检测session_key是否能用的方法,即wx.checkSession()。在它的success回调中写入session_key尚能用的逻辑,在fail回调中写session_key已经超时的处理逻辑即可。
下面是封装好了的一个checkSession的Promise,它将获取回来的session_key、openid、unionId放到Storage存储中。
/** * 验证小程序session_key的Promise封装 */, checkSession: function(){ return new Promise(function (resolve, reject) { //去登录 var wxlogin = function(){ wx.login({ success: function (res) { wxcode2session(res) } }) } //获取session var wxcode2session = function(res){ var data = { action: 'wxcode2session', code: res.code } wd.mina.request(data).then(res=>{ console.log('wxcode2session return:'); console.log(res.data); if( res.data.session_key != undefined ){ try { console.log('checkSession():'); console.log(res.data); wx.setStorageSync('session_key', res.data.session_key) wx.setStorageSync('openid', res.data.openid) wx.setStorageSync('unionid', res.data.unionid) resolve() } catch (e) { reject('设置session失败') } }else{ reject('获取session失败') } }) } //检查是否存放了session_key try { var session_key = wx.getStorageSync('session_key') if (!session_key) { console.log('checkSession login-1'); wxlogin() }else{ //检查session是否过期 wx.checkSession({ success () { resolve() }, fail () { console.log('checkSession login-3'); wxlogin() } }) } } catch (e) { console.log('checkSession login-2'); wxlogin() } })//eof-promise}
有了这个函数之后,我们可以在app.js中去调用它,用它返回的信息去做其它的业务处理。