1.微信登录

微信登录属于第三方登录,和普通的账号密码登陆的最大的优点为方便快捷,且用户的基数比较大,

2.基于OAuth2.0下的微信登录

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

这是请求的链接,对应的填入要的数据即可

https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect

我这里是把这个请求的链接进行封装为一个枚举,然后在进行数据的替换

 // 2.根据code从微信去获取token + openIdString getToken = RegisterUtils.getToken.replace("APPID", RegisterUtils.APPID).replace("SECRET", RegisterUtils.SECRET).replace("CODE", code);

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一起带回

 // 3.2. 没有,需要走微信绑定流程HashMap<String, String> map2 = new HashMap<>();map2.put("accessToken", access_token);map2.put("openid", openid);// 需要返回:token + openIdreturn new AjaxResult().setSuccess(false).setResultObj(map2);

这里是通过Ajax后置拦截器(后面有时间写4大拦截器)跳转到注册页面(在这里简称callback页面)

在callback页面用户进行手机号注册,

大致页面就是获取用户的手机号

说一下为什么这里明明说是微信登录,又在手机号登录

因为他是第一次登录,所有我要给他进行新建一个本地用户对象,我的本地用户对象里面的字段有个手机号(为了后面的业务)所有我这里可以先获取到他的手机号

当点击注册按钮之后的操作

前端携带上openid和token手机号,到后端

这里大致说一下步骤

A-先把前端给的数据进行基本的校验

B-拿到手机去本地用户表查询有无对象

C-又本地对象,我就直接创建微信用户表的对象即可

D-没有就根据这个手机号去创建本地对象在在对应的创建出微信对象

E-进行免密登录,把相关的信息进行封装为map放回前端即可

以下是相关的代码

public Map<String, Object> binderWechat(BinderDto dto) {/*先进行基本的校验*/if (StringUtils.isEmpty(dto.getPhone()) ||StringUtils.isEmpty(dto.getVerifyCode()) ||StringUtils.isEmpty(dto.getAccessToken()) ||StringUtils.isEmpty(dto.getOpenId())) {throw new MyException("参数不能为空");}/*校验手机验证码是否输入成功*/String keyTmp = RegisterUtils.binder + dto.getPhone();Object codeTmp = redisTemplate.opsForValue().get(keyTmp);/*校验验证码是否失效*/if (codeTmp == null) {throw new MyException("验证码已经失效,请重新获取");}if (!dto.getVerifyCode().equalsIgnoreCase(codeTmp.toString().split(":")[0])) {throw new MyException("验证码不一致");}/*利用手机号在t_usr表进行查询,看是否有这个user* 为什么不查t_logininfo表,是因为要查的话还有加一个type建,这个前端的,后端没有*/User user = userMapper.loadByPhone(dto.getPhone());Logininfo logininfo = null;if (user == null) {/*就要先进行保存这个创建一个user表*/user = dto2User(dto);/*这里把模板usercopy给logininfo*/logininfo = user2Logininfo(user);logininfoMapper.save(logininfo);System.out.println(logininfo.getId());/*user还有一个关于logininfo的外键*/user.setLogininfoId(logininfo.getId());userMapper.save(user);}/*进行创建一个wxuser表*//*当了这里是怎么样都会有一个user表生成的*//*利用http  根据token + openId 发送到微信进行拿到数据*/String getWxUSER = RegisterUtils.getWxUSER.replace("ACCESS_TOKEN", dto.getAccessToken().replace("OPENID", dto.getOpenId()));/*根据这个路径去wx那用户的资源*/String httpGet = HttpClientUtils.httpGet(getWxUSER);/*利用JSONOBject工具进行转换为对象和接受*/Wxuser wxuser = JSONObject.parseObject(httpGet, Wxuser.class);/*进行这个wxuser表外键关于user外键的填入*/wxuser.setUserId(user.getId());/*把这个wxuser进行保存到数据库*/wxuserMapper.save(wxuser);/*设置昵称*/user.setUsername(wxuser.getNickname());userMapper.update(user);logininfo.setUsername(wxuser.getNickname());logininfoMapper.update(logininfo);/*在进行免密登录*/Logininfo logininfoTmp = logininfoMapper.loadByUserId(wxuser.getUserId());/*String token = UUID.randomUUID().toString();redisTemplate.opsForValue().set(token, logininfoTmp, 30, TimeUnit.MINUTES);*//*在进行把这个k值和v值封装成map给前端返回回去*//*Map<String, Object> map1 = new HashMap<>();map1.put("token", token);logininfoTmp.setSalt(null);logininfoTmp.setPassword(null);map1.put("logininfo", logininfoTmp);return map1;*/return loginSuccessJwtHandler(logininfoTmp);}

当这里不管是第一次还是第n次的对于的步骤都有

以下是所有的大致的步骤流程图

图太长分为两节截图

完整的图在下面的链接

https://www.processon.com/diagraming/62f60df1079129071a2b366f

欢迎进行学习交流,不足之处请指出,喜欢麻烦点赞+收藏,谢谢各位大佬了

Java快速对接微信登录相关推荐

  1. java快速对接微信支付分(一)

    1.微信支付分产品介绍 维信支付分是对个人的身份特质.支付行为.使用历史等情况的综合计算分值,旨在为用户提供更简单便捷的生活方式. (1)用户可在具体应用场景中,开通威信支付分,此为最常见的开通方法. ...

  2. java快速对接微信支付分(二)

    4.实际开发的细步骤 C--请求订单接口返回结果页面 1.当前端进行调用微信订单接口的时候, 该接口微信那边会进行自己进行返回两个页面给用户,一个是符合免押的条件直接给用户确认订单, 二是为符合微信支 ...

  3. JAVA对接微信登录,有这一篇就够了

    大家好,最近工作有个项目是做小程序,需要用到微信登录,于是稍加研究了一下下面是给大家整理的内容 首先对接微信登录,微信会提供一个api 在调用这个api的时候需要一个HttpClient工具 priv ...

  4. Android绕过微信包名限制对接微信登录和支付

    Android绕过微信包名限制对接微信登录和支付 前言 最终效果 原理 代码 通过 APT 生成 WXEntryActivity 文件 对接微信SDK End 前言 Android对接微信登录和支付几 ...

  5. java+flutter实现微信登录

    java+flutter实现微信登录 这篇文章很简单,讲的是微信登录,app端用flutter实现,服务端用java实现. app负责拿到微信用户的code,服务端通过code拿到openId. 一. ...

  6. 最新修复H5抑云熬夜打卡定制版对接微信登录+免签支付源码+

    最新修复H5抑云熬夜打卡定制版对接微信登录+免签支付源码+搭建视频教程 [别站亲测源码]11月最新H5早起打卡网抑云熬夜打卡定制版对接微信登录/免签 支付 源码全修复完美版本/搭建视频教程 全新的早起 ...

  7. Java后端对接微信支付(微信公众号、PC端扫码)

    微信流程图 项目结构 前期准备 复制证书 将证书中名为apiclient_key.pem的文件复制到你的项目中 依赖 <!-- 微信支付SDK--> <dependency>& ...

  8. App中快速复用微信登录授权的一种方法

    在微信小程序下,小程序登录功能一般会通过 OpenID 或 UnionID 作为唯一标识,与小程序服务的账号体系进行关联打通,完成用户账户体系的构建与设计. 如果在像支付宝小程序.百度小程序第三方平台 ...

  9. 全网最全java Springboot对接微信公众号开发平台(可能是最全)!

    微信服务接入教程文档 文章目录 微信服务接入教程文档 微信开发技术文档官网 注册成为微信开发者 配置接受推送消息服务器 natapp下载,使用 后台构建 后台配置微信推送消息服务器 接受消息推送 操作 ...

  10. Java后端对接微信支付(微信小程序、APP、PC端扫码)非常全,包含查单、退款

    首先我们要明确目标,我们点击 微信支付官网 ,我们主要聚焦于这三种支付方式,其中JSPAI与APP主要与uniapp开发微信小程序与APP对接,而NATIVE主要与网页端扫码支付对接 1.三种支付统一 ...

最新文章

  1. [No0000160]常用C# 正则表达式大全
  2. Linux之vim全选,全部复制,全部删除
  3. MathType使用
  4. 译:Spring Boot 自动伸缩
  5. resetroot_169route_python2(用于ubuntu12.04和14.04,centos系列)
  6. ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇
  7. HttpNotificationChannel 云端推送信息实现
  8. python+appium自动化测试如何控制App的启动和退出
  9. 实体类多层嵌套 遍历_JS获取元素多层嵌套思路详解
  10. 浅谈Cisco ASA的基础
  11. c++类指针赋值表达式必须是可修改的左值_C++笔记 · 右值引用,移动语义,移动构造函数和移动赋值运算符
  12. python智慧树视频爬取_python爬虫利器之requests库的用法(超全面的爬取网页案例)...
  13. 深入浅出MySQL++数据库开发、优化与管理维护+第2版
  14. QAC静态测试配置及使用教程
  15. Java语言十五讲(总结)
  16. Docker 学习之 Docker 容器数据卷
  17. 劳动合同与聘用合同的区别
  18. 预测数值型数据:回归
  19. Python练级打怪全攻略——从上手到走出新手村
  20. faiss search(检索)截断

热门文章

  1. kux转mp4_QSV、KUX一秒转换成MP4,这两款神器你还不收藏?
  2. vscode运行c语言
  3. JS中文转拼音-兼容多浏览器
  4. 如何解决mysql执行语句效率低下不走索引
  5. STM32-ADC模数转换
  6. sqlserver联合查询注入
  7. Pojo、Po、Vo、Dto的含义
  8. “客户机操作系统已将 CD-ROM 门锁定,并且可能正在使用 CD-ROM,这可能会导致客户机...” 报错解决办法
  9. Tensorflow-wavenet生成模拟声音
  10. SpringBoot集成Beetl