即时新闻

微信小程序加载时先获取session_key登录状态

2022年12月16日 来源:大美华赢
分享到微信
打开微信,点击底部的“发现”,
使用“扫一扫”即可将网页分享至朋友圈。

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中去调用它,用它返回的信息去做其它的业务处理。


推荐阅读

友情链接 :  搜狐新闻  |  今日头条  |  腾讯新闻  |  一点资讯  |  凤凰新闻  |  网易新闻

城市 : 中国·南京

详细地址 : 南京市雨花台区

联系电话 : 18061221902

电子邮件 : hr-web100@qq.com