微信小程序用户登录与登录态维护详细指南:实现用户标识与信息获取

2025-01-01 开发教程 95次阅读

想要在小程序里实现用户登录及保持登录状态?这可是实现个性化服务的关键所在,但不少开发者对此感到头疼。

用户登录很重要

在小程序中,若以用户为中心提供服务,用户登录环节至关重要。这一环节能识别用户身份、获取用户数据。然而,小程序的登录方式受到诸多限制。例如,它缺乏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 {
 // 执行错误处理
 }
})

声明:演示站所有作品(图文、音视频)均由用户自行上传分享,仅供网友学习交流。若您的权利被侵害,请联系
微信扫码,联系我们