Java快速对接微信登录
OAuth2.0是在客户端和服务端之间有一个授权层,用来将用户和客户端进行分开客户端登录授权层使用的是令牌,意思是给了多少的权限也就只能有多少的权限之类的资源
OAuth的四种模式
A-授权码模式:
你要去学校,学校有保安把大门守着,你先去找你的班主任说你要进学校,你班主任给你一个code,你把这个code去保安看,保安知道了,给你大门的钥匙(token)你拿到这个token就进入了学校
B-简化模式
就是你直接去找保安,他直接就把token给你,你拿到这个token就去开门去进入
一般是用于第三方单页面应用
C-密码模式
给你账号和密码你去开门,
这种是用于第一方的单页面应用以及第一方的原生app (内部使用)
D-客户端模式
你是个人就直接进入学校
所有最安全的模式是授权码模式
3.准备工作--以开发网站为案列
进行相关的注册和申请的步骤
获取到该网站的APPID 和APPSECRET 回调域(如果在公司,这里是直接找公司拿即可)
大致流程图如下
4.实现步骤
A-获取code
前端进行调用获取到code给后端进行传入
public AjaxResult wechat(Map<String, String> map) { // 1.接收code,做校验 String code = map.get("code");
B-根据code进行发送http请求获取到token和appid
这是请求的链接,对应的填入要的数据即可
我这里是把这个请求的链接进行封装为一个枚举,然后在进行数据的替换
C-发送数据进行获取到返回的数据
这里返回的数据我进行了一个对象来进行接受,在进行json数据转实体对象的转化
/*发送Http获取到的是Stirng类型*/ String httpGet = HttpClientUtils.httpGet(getToken); /*把String类型用JSON对象来接受一波*/ JSONObject jsonObject = JSONObject.parseObject(httpGet); /*把里面的openid 和token拿出来*/ String access_token = jsonObject.getString("access_token"); String openid = jsonObject.getString("openid");
D-将数据进行返回给前端即可,进行登录
5.其他步骤
如果第二次,第n次登录的时候怎么办,这么实现免密登录?
5.1设计数据库
要知道是否是第一次还是第二次,那么就要在你的数据库留下东西来证明
这里我把登录成功之后会返回一些东西进行作为字段放在数据库
5.2验证是否存在---(存在)
拿出里面的数据openid去本地数据去查询有无这个包含该字段的对象
----(这里是存在就进行免密登录)
String access_token = jsonObject.getString("access_token"); String openid = jsonObject.getString("openid"); // 3.根据openId查询本地的t_wxuser,看是否曾今已经扫码过 Wxuser wxuser = wxuserMapper.loadByOpenId(openid); // 3.1. 有值且t_wxuser表中的user_id有值 曾今已经扫过,本次是第二...N扫码 if (wxuser != null && wxuser.getUserId() != null) { /*以下是免密登录*/ Logininfo logininfoTmp = logininfoMapper.loadByUserId(wxuser.getUserId());
5.3创建自己程序端的用户
自己程序端用户:意思是通过比如手机号注册,短信注册,账号密码注册等;而不是第三方的用户
5.4验证是否存在--(不存在)
这里需要给正在登录的用户跳转到本地用户注册的页面,拿就要告诉前端验证不存在进行跳转,所有这里我直接把验证失败消息放回,并且把openid和token一起带回
这里是通过Ajax后置拦截器(后面有时间写4大拦截器)跳转到注册页面(在这里简称callback页面)
在callback页面用户进行手机号注册,
大致页面就是获取用户的手机号
因为他是第一次登录,所有我要给他进行新建一个本地用户对象,我的本地用户对象里面的字段有个手机号(为了后面的业务)所有我这里可以先获取到他的手机号
当点击注册按钮之后的操作
前端携带上openid和token手机号,到后端
这里大致说一下步骤
A-先把前端给的数据进行基本的校验
B-拿到手机去本地用户表查询有无对象
E-进行免密登录,把相关的信息进行封装为map放回前端即可
以下是相关的代码
当这里不管是第一次还是第n次的对于的步骤都有
以下是所有的大致的步骤流程图
完整的图在下面的链接