想要在小程序里实现用户登录及保持登录状态?这可是实现个性化服务的关键所在,但不少开发者对此感到头疼。
用户登录很重要
在小程序中,若以用户为中心提供服务,用户登录环节至关重要。这一环节能识别用户身份、获取用户数据。然而,小程序的登录方式受到诸多限制。例如,它缺乏Cookie机制,导致依赖Cookie的API无法直接应用。此外,小程序不支持HTML页面,这也影响了依赖页面重定向的第三方API。因此,小程序的用户登录需要特别处理。以实际应用为例,一些商业小程序,如购物或生活服务类,需要识别用户身份以提供个性化服务。若登录环节处理不当,这些功能将难以实现。
用户要想获得小程序的精准服务,必须先完成登录。这就像要进入一扇门,得先打开它。比如,游戏小程序若无法识别用户的登录状态,就无法保存游戏进度,也无法更新用户的游戏成就等。
微信账号登录方式
微信账号与平台间的关联紧密,用户使用体验良好,值得进一步研究。在小程序中,我们可通过App代码或Page页面代码使用wx.request方法向后台API发送请求,并将登录凭证code一同发送。后台服务随后利用此凭证调用微信接口,以获取openid和session_key。以社交类小程序为例,它需要获取用户在微信上的基本信息,以便用户能快速在小程序内建立社交联系,这一过程便涉及上述流程。
注意安全因素,我们不能将openid和session_key直接用作用户的标识或会话标识来返回给客户端。这一点,许多开发者往往容易忽视。我曾遇到过几位朋友在小程序开发过程中,差点就犯了这样的错误。
服务器创建session机制
服务器需要建立专属的会话。获取微信接口数据后,会在服务器上生成一个基于微信账号登录状态的会话标识,并将其纳入自身的会话管理系统中。这个过程就好比服务器为每位用户量身打造了一把独一无二的钥匙。我了解一个做在线教育的微信小程序,他们的服务器就是这样做,这样可以有效避免用户登录状态混淆,同时保证了较高的安全性和稳定性。
App({ onLaunch: function() { wx.login({ success: function(res) { var code = res.code; if (code) { console.log('获取用户登录凭证:' + code); } else { console.log('获取用户登录态失败:' + res.errMsg); } } }); } })
接着,将会话标识分配给小程序客户端作为会话标识。这一过程涉及众多步骤,若稍有不慎便可能引发问题,例如信息传递失误等,因此开发者需严格遵守操作流程。
替代cookie保存sessionid
在制作Web应用时,我们通常会用cookie来存储会话标识,然而在小程序中则不适用。小程序拥有本地存储功能,因此我们用它来保存会话标识。这就像将重要的小东西放在家中的小抽屉里那样方便。有一个美食推荐的小程序就是采用这种方式,用户每次登录时查询登录状态和后续的API调用,都是依靠这个已保存的会话标识完成的。
App({ onLaunch: function() { wx.login({ success: function(res) { var code = res.code; if (code) { console.log('获取用户登录凭证:' + code); // --------- 发送凭证 ------------------ wx.request({ url: 'https://www.my-domain.com/wx/onlogin', data: { code: code } }) // ------------------------------------ } else { console.log('获取用户登录态失败:' + res.errMsg); } } }); } })
使用存储设备时需谨慎,否则数据管理不当可能会引发sessionid获取失误或消失,进而影响登录状态的正常保持。
实际应用场景中的登录态维护
https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code
电商小程序这类应用,常常涉及处理订单和收藏夹等用户数据,因此保持登录状态稳定至关重要。用户登录后,即便切换页面或长时间未操作,小程序也应准确识别其登录状态,确保服务连续不断。若登录状态维护不当,用户订单信息可能丢失,收藏的商品也可能消失,这无疑会带来不便。
同样,在那些提供新闻资讯的小程序里,一旦登录状态未能保持,用户的阅读历史和定制化推荐等功能便会陷入混乱,无法正常运作。这种现象恰恰说明了登录状态维护在实际使用中的关键作用。
router.get('/wx/onlogin', function (req, res, next) { let code = req.query.code request.get({ uri: 'https://api.weixin.qq.com/sns/jscode2session', json: true, qs: { grant_type: 'authorization_code', appid: '你小程序的APPID', secret: '你小程序的SECRET', js_code: code } }, (err, response, data) => { if (response.statusCode === 200) { console.log("[openid]", data.openid) console.log("[session_key]", data.session_key) //TODO: 生成一个唯一字符串sessionid作为键,将openid和session_key作为值,存入redis,超时时间设置为2小时 //伪代码: redisStore.set(sessionid, openid + session_key, 7200) res.json({ sessionid: sessionid }) } else { console.log("[error]", err) res.json(err) } }) })
后续开发基于登录功能
掌握了微信小程序的用户登录与登录状态管理,接下来的开发工作将变得容易许多。以会员制小程序为例,我们能够更便捷地创建针对会员的特别功能,因为系统能够精确识别会员的登录状态。一旦登录机制完善,我们便能在小程序中添加更多与用户身份紧密相关的功能。反之,若登录环节存在缺陷,随着新增功能的增多,潜在的问题风险也会相应增加。
在制作小程序时,你是否曾遭遇过登录状态保持的难题?期待大家能点赞、转发此文,并在评论区热烈讨论。
router.get('/wx/products/list', function (req, res, next) { let sessionid = req.header("sessionid") let sessionVal = redisStore.get(sessionid) if (sessionVal) { // 执行其他业务代码 } else { // 执行错误处理 } })