时间:2021-05-26
前言
上一篇文章大概写了一下如何搭一个微信中控服务:【thinkjs搭建微信中控服务】 。
接下来这篇,专门写一下如何在此基础上扩展出来一个比较好用的微信鉴权登陆的方案。
由于这一段的逻辑着实有点绕,所以就单独拿出来写了。
有时候,调用方甚至可以通过这个方案,进行多公众号openid的之间的关联。
官方说明
开发文档
微信文档地址:传送门
鉴权逻辑
拿到openid之后,理论上鉴权的逻辑就算完成了。
开发者可以继续用openid和access_token去获取用户信息;或者进行一些其他的业务流程。
具体的参数说明看微信的官方文档就可以了。
中控逻辑
第一步:页面跳转至中控API
业务调用方会有自己的登陆逻辑,只需要获取到当前调用接口的用户的openid,然后再进行接下来的业务逻辑即可。
前端调用业务接口的时候,如果服务端发现当前访问用户没有登陆状态,就会告诉前端需要鉴权,并且把需要跳转的中控API链接响应给前端。
然后前端就开始往中控的API链接跳转。
第二步:中控重定向到微信API
相关代码
// 接口 - 鉴权获取codeasync go_authAction() { let that = this; let {back, serve = ''} = that.get(); if (think.isEmpty(back)) { return that.json({code: 1, msg: '参数不正确'}) } let newBack = encodeURIComponent(back); let redirectUri = `${baseHost}/api/open/wx/login_wechat?${encodeURIComponent(`back=${newBack}&wxid=${that.wxConfig.id}&serve=${serve}`)}`; let url = `https://open.weixin.qq.com/connect/oauth2/authorize?appid=${that.wxConfig.appid}&redirect_uri=${redirectUri}&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect` that.redirect(url);}作用:
鉴权获取code
地址:
baseHost +/open/wx/go_auth
参数:
参数名 必选 说明 wxid 是 对应配置公众号的id,告诉中控用哪个公众号鉴权 back 是 跳转到鉴权链接之前的页面完整url,便于鉴权完毕后重定向回之前页面 serve 是 调用方api回调地址,在鉴权逻辑完成后,会携带openid重定向回这个地址
描述:
我这里默认都是静默授权。
在这里可以看到代码里面,中控把调用方传过来的wxid ,back 和serve 三个参数拼接到了微信API的回调链接redirect_uri 里面。
第三步:微信回调中控API
相关代码
async login_wechatAction() { let that = this; let {code, back, serve = ''} = that.get(); if (think.isEmpty(code) || think.isEmpty(back)) { return that.json({code: 1, msg: '参数不正确'}) } let newBack = encodeURIComponent(back); let apiWxController = that.controller('private/wx'); let openid = await that._getOpenIdByAuthCode(that.wxConfig.id, code); let backUrl = `${serve}?wxid=${that.wxConfig.id}&openid=${openid}&redirect=${newBack}`; that.redirect(backUrl);}_getOpenIdByAuthCode(wxid, code){ let that = this; let {appid, secret} = await that.controller('common').getWxConfigById(wxid); let {data} = await axios({ method: 'get', url: `https://api.weixin.qq.com/sns/oauth2/access_token?appid=${appid}&secret=${secret}&code=$[code]&grant_type=authorization_code` }) return data.openid}作用:
通过微信回调传回来的code,获取openid
地址:
baseHost +/open/wx/login_wechat
参数:
参数名 必选 说明 wxid 是 对应配置公众号的id,告诉中控用哪个公众号鉴权 code 是 微信回传的code back 是 跳转到鉴权链接之前的页面完整url,便于鉴权完毕后重定向回之前页面(上一步拼接的) serve 是 调用方api回调地址,在鉴权逻辑完成后,会携带openid重定向回这个地址(上一步拼接的)
描述:
这里中控拿到code之后,去获取openid。 获取完之后,重定向回serve (业务系统)地址,并把获取到的openid 和back 作为参数传回去
第四步:业务系统自行处理
接下来业务系统就能通过开放的回调地址(上面的serve ),来拿到以下信息:
这时候就能用这个openid去处理自己的登陆逻辑,比如获取用户信息,缓存session保存登陆状态之类的。
然后再重定向回back 地址,也就是用户在鉴权之前访问的页面。
鉴权结束
简单说就是以下逻辑
虽然历经的跳转和重定向看起来很多,但是实际用起来,其实是很快的,用户基本上没有什么感知。
而且对于业务调用方来说,只需要提供一个回调地址即可,然后在回调里面等着openid传过来就好,剩下的交给中控自己去来回蹦哒吧。
结尾
需要注意的是,公众号的后台需要配置好以下信息。
否则是没有权限鉴权的。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
声明:本页内容来源网络,仅供用户参考;我单位不保证亦不表示资料全面及准确无误,也不保证亦不表示这些资料为最新信息,如因任何原因,本网内容或者用户因倚赖本网内容造成任何损失或损害,我单位将不会负任何法律责任。如涉及版权问题,请提交至online#300.cn邮箱联系删除。
先给大家说下实现原理根据判断UA中是否有关键字micromessenger,有的话则是微信内置浏览器实现代码如下所示://判断是否微信登陆functionisW
微信公众号怎么登陆?如何登陆微信公众号?各位已经注册好了微信公众号的微信用户们,如果您不知道微信公众号怎么登陆,大家可以跟着小编往下看看微信公众号的登陆方法
企业微信怎么登陆?微信企业版怎么创建企业登陆?企业微信是腾讯官方推出的一款专为公司企业打造的工作交流软件,登陆企业微信必须以公司名义登陆,那么企业微信怎么登
微信猎手怎么用微信猎手一键查看被删除好友。微信猎手是一个管理微信的一个软件,以前想查找微信中的好友,谁删除了我。那就要群发信息去验证。现在不用了。只要登陆这软
thinkPHP和微支付实现的微信支付插件,在微信中调用微信jssdk实现支付,这里有详细的代码和教程,具体看这里://实现的Wxpay钩子方法publicfu