小程序如何接入和维护微信登录态?

阅读 7792  ·  发布日期 2020-08-24 17:26  ·  温州雄霸网络科技有限公司|建站|APP小程序制作|做网站SEO推广优化
【摘要】 为了方便小程序应用使用微信登录态进行授权登录,微信小程序提供了登录授权的开放接口。乍一看文档,感觉文档上讲的非常有道理,但是实现起来又真的是摸不着头脑,不知道如何管理和维护登录态。本文就来手把手的教会大家在业务里如何接入和维护微信登录态。接入流程这里官方文档上的流程图已经足够清晰,我们直接就该图展开详述和补充。首先大家... 【温州小程序开发,温州微信公众号,平阳做网站,平阳网站建设公司,平阳小程序商城制作,昆阳万全做网站,鳌江水头小程序,萧江腾蛟微信公众号,山门顺溪南雁海西南麂凤卧麻步怀溪网络网店服务,政采云网店管理服务】...

小程序如何接入和维护微信登录态?

为了方便小程序应用使用微信登录态进行授权登录,微信小程序提供了登录授权的开放接口。
乍一看文档,感觉文档上讲的非常有道理,但是实现起来又真的是摸不着头脑,不知道如何管理和维护登录态。
本文就来手把手的教会大家在业务里如何接入和维护微信登录态。
接入流程这里官方文档上的流程图已经足够清晰,我们直接就该图展开详述和补充。
首先大家看到这张图,肯定会注意到小程序进行通信交互的不止是小程序前端和我们自己的服务端,微信第三方服务端也参与其中,那么微信服务端在其中扮演着怎样的角色呢?我们一起来串一遍登录鉴权的流程就明白了。
1. 调用wx.login生成codewx.login()这个API的作用就是为当前用户生成一个临时的登录凭证,这个临时登录凭证的有效期只有五分钟。
我们拿到这个登录凭证后就可以进行下一步操作:
获取openid和session_keywx.login({
success: function(loginRes) {
if (loginRes.code) {
// example: 081LXytJ1Xq1Y40sg3uJ1FWntJ1LXyth }
}
}
);
2. 获取openid和session_key我们先来介绍下openid,用过公众号的童鞋应该对这个标识都不陌生了,在公众平台里,用来标识每个用户在订阅号、服务号、小程序这三种不同应用的唯一标识,也就是说每个用户在每个应用的openid都是不一致的,所以在小程序里,我们可以用openid来标识用户的唯一性。
那么session_key是用来干嘛的呢?有了用户标识,我们就需要让该用户进行登录,那么session_key就保证了当前用户进行会话操作的有效性,这个session_key是微信服务端给我们派发的。
也就是说,我们可以用这个标识来间接地维护我们小程序用户的登录态,那么这个session_key是怎么拿到的呢?我们需要在自己的服务端请求微信提供的第三方接口https://api.weixin.qq.com/sns/jscode2session,这个接口需要带上四个参数字段:
从这几个参数,我们可以看出,要请求这个接口必须先调用wx.login()来获取到用户当前会话的code。
那么为什么我们要在服务端来请求这个接口呢?其实是出于安全性的考量,如果我们在前端通过request调用此接口,就不可避免的需要将我们小程序的appid和小程序的secret暴露在外部,同时也将微信服务端下发的session_key暴露给“有心之人”,这就给我们的业务安全带来极大的风险。
除了需要在服务端进行session_key的获取,我们还需要注意两点:
session_key和微信派发的code是一一对应的,同一code只能换取一次session_key。
每次调用wx.login(),都会下发一个新的code和对应的session_key,为了保证用户体验和登录态的有效性,开发者需要清楚用户需要重新登录时才去调用wx.login()session_key是有失效性的,即便是不调用wx.login,session_key也会过期,过期时间跟用户使用小程序的频率成正相关,但具体的时间长短开发者和用户都是获取不到的function getSessionKey (code, appid, appSecret) {
var opt = {
method: '
GET'
, url: '
https://api.weixin.qq.com/sns/jscode2session'
, params: {
appid: appid, secret: appSecret, js_code: code, grant_type: '
authorization_code'
}
}
;
return http(opt).then(function (response) {
var data = response.data;
if (!data.openid || !data.session_key || data.errcode) {
return {
result: -2, errmsg: data.errmsg || '
返回数据字段不完整'
}
}
else {
return data }
}
);
}
3. 生成3rd_session前面说过通过session_key来“间接”地维护登录态,所谓间接,也就是我们需要自己维护用户的登录态信息,这里也是考虑到安全性因素,如果直接使用微信服务端派发的session_key来作为业务方的登录态使用,会被“有心之人”用来获取用户的敏感信息,比如wx.getUserInfo()这个接口呢,就需要session_key来配合解密微信用户的敏感信息。
那么我们如果生成自己的登录态标识呢,这里可以使用几种常见的不可逆的哈希算法,比如md5、sha1等,将生成后的登录态标识(这里我们统称为'
skey'
)返回给前端,并在前端维护这份登录态标识(一般是存入storage)。
而在服务端呢,我们会把生成的skey存在用户对应的数据表中,前端通过传递skey来存取用户的信息。
可以看到这里我们使用了sha1算法来生成了一个skey:
const crypto = require('
crypto'
);
return getSessionKey(code, appid, secret) .then(resData => {
// 选择加密算法生成自己的登录态标识 const {
session_key }
= resData;
const skey = encryptSha1(session_key);
}
);
function encryptSha1(data) {
return crypto.createHash('
sha1'
).update(data, '
utf8'
).digest('
hex'
) }
4. checkSession前面我们将skey存入前端的storage里,每次进行用户数据请求时会带上skey,那么如果此时session_key过期呢?所以我们需要调用到wx.checkSession()这个API来校验当前session_key是否已经过期,这个API并不需要传入任何有关session_key的信息参数,而是微信小程序自己去调自己的服务来查询用户最近一次生成的session_key是否过期。
如果当前session_key过期,就让用户来重新登录,更新session_key,并将最新的skey存入用户数据表中。
checkSession这个步骤呢,我们一般是放在小程序启动时就校验登录态的逻辑处,这里贴个校验登录态的流程图:
下面代码即校验登录态的简单流程:
let loginFlag = wx.getStorageSync('
skey'
);
if (loginFlag) {
// 检查 session_key 是否过期 wx.checkSession({
// session_key 有效(未过期) success: function() {
// 业务逻辑处理 }
, // session_key 过期 fail: function() {
// session_key过期,重新登录 doLogin();
}
}
);
) else {
// 无skey,作为首次登录 doLogin();
}
推荐:
《小程序开发教程》以上就是小程序如何接入和维护微信登录态?的详细内容,更多请关注php中文网其它相关文章!
微信
分享相关标签:
小程序本文转载于:
即速资讯,如有侵犯,请联系a@php.cn删除
上一篇:
如何开发小程序插件?
下一篇:
小程序的21个新功能相关文章相关视频为什么微信小程序打开来会黑屏微信小程序怎么实现购物车功能?(方法介绍)小程序中下拉刷新页面的功能怎么实现?如何配置小程序开发项目结构?(教程)小程序如何接入和维护微信登录态?认识小程序开发工具认识小程序的目录结构小程序文档 [温州做小程序]