总结

大家都知道,在开发中提供用户登录以及维护用户的登录状态,是一个拥有用户系统的软件应用普遍需要做的事情。像微信这样的一个社交平台,如果做一个小程序应用,我们可能很少会去做一个完全脱离和舍弃连接用户信息的纯工具软件。

让用户登录,标识用户和获取用户信息,以用户为核心提供服务,是大部分小程序都会做的事情。我们今天就来了解下在小程序中,如何做用户登录,以及如何去维护这个登录后的会话(Session)状态。下面来看看详细的介绍:

在微信小程序中,我们大致会涉及到以下三类登录方式:

自有的账号注册和登录

使用其他第三方平台账号登录

使用微信账号登录(即直接使用当前已登录的微信账号来作为小程序的用户进行登录)

第一和第二种方式是目前Web应用中最常见的两种方式,在微信小程序中同样可以使用,但是需要值的注意的是,小程序中没有Cookie的机制,所以在使用这2种方式前,请确认你们或第三方的API是否需要依赖Cookie;还有小程序中也不支持HTML页面,那些需要使用页面重定向来进行登录的第三方API就需要改造,或不能用了。

我们今天主要来讨论一下第三种方式,即如何使用微信账号进行登录,因为这种方式和微信平台结合最紧密,用户体验比较好。

登录流程

引用小程序官方文档的登录流程图,整个登录流程基本如下图所示:

登录流程图

该图中,“小程序”指的就是我们使用小程序框架写的代码部分,“第三方服务器”一般就是我们自己的后台服务程序,“微信服务器”是微信官方的API服务器。

下面我们来逐步分解一下这个流程图。

步骤1:在客户端获取当前登录微信用户的登录凭证(code)

在小程序中登录的第一步,就是先获取登录凭证。我们可以使用wx.login()方法并得到一个登录凭证。

我们可以在小程序的App代码中发起登录凭证请求,也可以在其他任何Page页面代码中发起登录凭证请求,主要根据你小程序的实际需要。

App({

onLaunch: function() {

wx.login({

success: function(res) {

var code = res.code;

if (code) {

console.log('获取用户登录凭证:' + code);

} else {

console.log('获取用户登录态失败:' + res.errMsg);

}

}

});

}

})

步骤2:将登录凭证发往你的服务端,并在你的服务端使用该凭证向微信服务器换取该微信用户的唯一标识(openid)和会话密钥(session_key)

首先,我们使用wx.request()方法,请求我们自己实现的一个后台API,并将登录凭证(code)携带过去,例如在我们前面代码的基础上增加:

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);

}

}

});

}

})

你的后台服务(/wx/onlogin)接着需要使用这个传递过来的登录凭证,去调用微信接口换取openid和session_key,接口地址格式如下所示:

https://api.weixin.qq.com/sns/jscode2session?appid=APPID&secret=SECRET&js_code=JSCODE&grant_type=authorization_code

这里是我使用了Node.js Express构建的后台服务的代码,仅供参考:

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)

}

})

})

这段后台代码成功执行的话,就可以得到openid和session_key。这个信息就是当前微信账户在微信服务器那边的登录态了。

但是,为了安全方面的原因,请不要直接使用这些信息作为你小程序的用户标识和session标识回传到小程序客户端中去,我们应该在服务器端做一层自己的session,将这个微信账号登录态生成一个session id并维护在我们自己的session机制中,然后把这个session id派发到小程序客户端作为session标识来使用。

关于如何在服务器端做这个session机制,我们现在一般采用键值对存储工具来做,比如redis。我们为每个session生成一个唯一的字符串作为键,然后可以将session_key和openid作为值,存入redis中,为了安全,存入的时候还应设置一个超时的时间。

步骤3:在客户端保存sessionid

开发Web应用的时候,在客户端(浏览器)中,我们通常将session id存放在cookie中,但是小程序没有cookie机制,所以不能采用cookie了,但是小程序有本地的storage,所以我们可以使用storage来保存sessionid,以供后续的后台API调用所使用。

在之后,调用那些需要登录后才有权限的访问的后台服务时,你可以将保存在storage中的sessionid取出并携带在请求中(可以放在header中携带,也可以放在querystring中,或是放在body中,根据你自己的需要来使用),传递到后台服务,后台代码中获取到该sessionid后,从redis中查找是否有该sessionid存在,存在的话,即确认该session是有效的,继续后续的代码执行,否则进行错误处理。

这是一个需要session验证的后台服务示例,我的sessionid是放在header中传递的,所以在这个示例中,是从请求的header中获取sessionid:

router.get('/wx/products/list', function (req, res, next) {

let sessionid = req.header("sessionid")

let sessionVal = redisStore.get(sessionid)

if (sessionVal) {

// 执行其他业务代码

} else {

// 执行错误处理

}

})

好了,通过微信账号进行小程序登录和状态维护的简单流程就是这样,了解这些知识点之后,再基于此进行后续的开发就会变得更容易了。

另外,腾讯前端团队也开源了他们封装的相关库,可以借鉴和使用。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对脚本之家的支持。

java开发微信如何维护登录状态_微信小程序中做用户登录与登录态维护的实现详解...相关推荐

  1. 快手小店电脑版_微信PC版更新!支持在小程序中使用微信支付 | 一周资讯

    小程序1. 微信PC版更新,支持在小程序中使用微信支付.12月19日,微信PC端推出内测版2.7.2.73,新版本支持以下新功能:新增看一看精选内容,新的订阅号浏览体验,支持在小程序中使用微信支付.( ...

  2. 微信小程序学习:(二)app.js及index.js详解

    微信小程序学习:(二)app.js及index.js详解 项目地址:https://github.com/leoricding/- 在用ide创建小程序项目时,系统默认为我们创建了一个hellowor ...

  3. 微信小程序中获取用户微信公众号授权(openid)用来发送模板消息

    需求: 由于小程序不能直接向用户发送模板消息,所以需要用公众号向用户发送模板消息. 于是需要将小程序的openid和公众号的openid绑定在一起.提供两种思路: 方法一: 1.微信小程序和公众号都绑 ...

  4. 在微信小程序中做自己的数字键盘

    在微信小程序中做自己的数字键盘 为什么要自制键盘? 使用系统键盘带来的不便 理想的自制键盘效果 怎样自制键盘? 键盘的效果 为什么要自制键盘? 我最近在开发一款微信小程序,现在需要用户输入一个数字. ...

  5. 微信小程序- css相比,wxss区别?小程序关联微信公众号如何确定用户的唯一性?微信小程序中的用户ID(openid和unionid)

    1 与css相比, wxss区别? 1) 响应式长度 rpx 2) 样式导入 3) 小程序不支持通配符* *{ width:100rpx; height:100rpx; } 2 小程序关联微信公众号如 ...

  6. 《十四》微信小程序中的常用 API之登录、获取用户信息、支付、提现、跳转小程序、网络请求、弹框、导航、数据缓存、图片、查看文档、音频、拨打电话、剪贴板、滚动、WXML

    微信小程序提供了 wx 这个全局变量,通过这个全局变量可以调用微信小程序的 API. 登录: wx.login():获取登录凭证 code.通过登录凭证 code 进而换取用户登录态信息,包括用户在当 ...

  7. 微信小程序中判断用户是否已关注公众号的两种实现

    背景: 最近的一个小程序项目中有这么一个需求:进入我的主页后, 如果用户没有关注过我们的公众号, 则展示一个引导关注公众号组件, 点击后跳转到一篇公众号文章, 指引用户进行关注,用户完成关注隐藏该组件 ...

  8. 微信小程序中的用户ID(openid和unionid)

    前沿 做过微信开发的同学,多多少少都会涉及到用户的唯一标示的问题.由于微信牢牢把控着用户的信息,因此当你需要在微信平台中获取用户的标示信息,必然要通过微信的平台接口来获取(当然,你可以通过你自己的平台 ...

  9. 微信小程序怎么实现陪诊服务_陪诊小程序怎么做

    小编今天要分享的是一个服务行业的微信小程序,对于很多城市来说现在陪诊服务越来越多人需要了,不仅仅是因为子女不在老人身边,还有就是医院的服务配置设施越来越智能化,操作也基本上离不开智能机,如果有专业的陪 ...

最新文章

  1. 科研人员多维度测试GPT-3发现:它并不是一名“好学生”
  2. thinkphp笔记
  3. JavaScript要点 (二) 使用误区
  4. ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇
  5. Java开发知识之Java面相对象
  6. css3中transform的用法
  7. MySQL之优化器、执行计划、简单优化
  8. 设计用例测试下面的python程序def do_你能变形python的unittest测试用例吗?
  9. android 动态生成fragment,Android动态加载fragment(fragment复用)
  10. 三极管工作原理_三极管的基本工作原理,这个讲的很全
  11. 中国酸性级萤石粉行业市场供需与战略研究报告
  12. 谷歌Android UI设计技巧
  13. 微型计算机步进电机控制,使用微机对步进电机进行控制方式主要有两种
  14. 【数据库系统】C#窗体应用显示用户sa登录失败
  15. C语言main函数参数[转:C语言中文网]
  16. t检验自由度的意义_在统计中自由度是什么?
  17. 光标飞控硬件架构设计与原理
  18. 在INTEL KABYALAKE平台上运行COREBOOT 记录
  19. Java 并发编程之美:并发编程高级篇之一-chat
  20. 台式计算机反复启动,台式机总是一直重启怎么办

热门文章

  1. 重置Catalyst 6500/6000 和 Cisco 7600 系列交换机Consle口密码详解
  2. 最重要的技术深入学习
  3. 中山大学计算机专业实力前景怎么样,计算机专业排名看超算实力,ASC竞赛五大高校排名,中山大学第一...
  4. 爱做梦的人-人的特性之一
  5. [转] 双线双IP双网卡配置
  6. 循环神经网络中困惑度(perplexity)
  7. JVM 参数配置及详解 -Xms -Xmx -Xmn -Xss 调优总结
  8. HTML5期末大作业:汽车主题网页设计——21 汽车租赁(47页) HTML+CSS+JavaScript web前端期末大作业 html+css+javascript网页设计实例 企业网站制作
  9. 庄子:不要把时间浪费在做正事上
  10. Wordpress + Markdown终极搭配