技术点:HttpClient(模拟浏览器的请求),Json转换工具

第一步:密钥ID的配置

wx.open.app_id=wxed9954c01bb89b47wx.open.app_secret=a7482517235173ddb4083788de60b90ewx.open.redirect_url=http://localhost:8160/api/ucenter/wx/callback
#wx.open.redirect_url=http://guli.shop/api/ucenter/wx/callback

第二步:整合一个工具类方便读取配置文件属性值,InitializingBean这里很细节,利用初始化将数据加载

package com.guli.ucenter.util;@Component
//@PropertySource("classpath:application.properties")
public class ConstantPropertiesUtil implements InitializingBean {@Value("${wx.open.app_id}")private String appId;@Value("${wx.open.app_secret}")private String appSecret;@Value("${wx.open.redirect_url}")private String redirectUrl;public static String WX_OPEN_APP_ID;public static String WX_OPEN_APP_SECRET;public static String WX_OPEN_REDIRECT_URL;@Overridepublic void afterPropertiesSet() throws Exception {WX_OPEN_APP_ID = appId;WX_OPEN_APP_SECRET = appSecret;WX_OPEN_REDIRECT_URL = redirectUrl;}
}

第三步:controller层

package com.guli.ucenter.controller.api;@CrossOrigin
@Controller//注意这里没有配置 @RestController
@RequestMapping("/api/ucenter/wx")
public class WxApiController {@GetMapping("login")public String genQrConnect(HttpSession session) {// 微信开放平台授权baseUrlString baseUrl = "https://open.weixin.qq.com/connect/qrconnect" +"?appid=%s" +"&redirect_uri=%s" +"&response_type=code" +"&scope=snsapi_login" +"&state=%s" +"#wechat_redirect";// 回调地址String redirectUrl = ConstantPropertiesUtil.WX_OPEN_REDIRECT_URL; //获取业务服务器重定向地址try {redirectUrl = URLEncoder.encode(redirectUrl, "UTF-8"); //url编码} catch (UnsupportedEncodingException e) {throw new GuliException(20001, e.getMessage());}// 防止csrf攻击(跨站请求伪造攻击)//String state = UUID.randomUUID().toString().replaceAll("-", "");//一般情况下会使用一个随机数String state = "imhelen";//为了让大家能够使用我搭建的外网的微信回调跳转服务器,这里填写你在ngrok的前置域名System.out.println("state = " + state);// 采用redis等进行缓存state 使用sessionId为key 30分钟后过期,可配置//键:"wechar-open-state-" + httpServletRequest.getSession().getId()//值:satte//过期时间:30分钟//生成qrcodeUrlString qrcodeUrl = String.format(baseUrl,ConstantPropertiesUtil.WX_OPEN_APP_ID,redirectUrl,state);return "redirect:" + qrcodeUrl;}
}

第四步:如何生成微信二维码?

请求微信的固定地址,然后向地址后面拼接参数

扫描完后,通过请求地址进行回调(需要按照指定规则进行请求),将端口改为8150,创建一个接口callback做回调得到扫码人的信息

第五步:callback回调接口的实现

1.之前第一步扫描二维码callback接口得到的code值——>2.通过code和ID密钥信息去请求微信提供的固定地址得到token访问凭证+openid微信的标识(通过HttpClients访问)——>3.最后拿token和openid再次请求一次微信地址https://api.weixin.qq.com/sns/userinfo

得到用户信息

添加的依赖:

 <!--httpclient-->
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId>
</dependency>
<!--commons-io-->
<dependency><groupId>commons-io</groupId><artifactId>commons-io</artifactId>
</dependency>
<!--gson-->
<dependency><groupId>com.google.code.gson</groupId><artifactId>gson</artifactId>
</dependency>

通过code,密钥和id得到的用户url是一个String字符串,里面包含token和openid——>我们利用gson将字符串转为map,然后从map中得到指定的数据

第六步:最后将信息提取判断数据库中是否有重复数据,然后插入(先根据openid在数据库中查询,如果已经有了说明之前就扫了一次)

 /*** 2.获取扫描人的信息(扫码将人物信息存入数据库),添加数据,返回code类似与手机验证码,随机唯一值->请求微信固定地址* 获得access-token:访问凭证* openid:每个微信唯一的标识* 然后再拿这俩个信息请求获取我们的微信信息->获取扫码人的信息*/@GetMapping("callback")public String callback(String code,String state){System.out.println("code="+code);try {//1.拿code值请求wx固定地址,得到access_token和openidString baseAccessTokenUrl = "https://api.weixin.qq.com/sns/oauth2/access_token" +"?appid=%s" +"&secret=%s" +"&code=%s" +"&grant_type=authorization_code";String accessTokenUrl = String.format(baseAccessTokenUrl,ConstantWxUtils.WX_OPEN_APP_ID, //id和密钥注入ConstantWxUtils.WX_OPEN_APP_SECRET,code);//2.使用httpclient发送请求,得到返回结果String accessTokenInfo = HttpClientUtils.get(accessTokenUrl);//3.将accessTokenInfo中的信息取出来,(将里面字符串转为map集合,根据map里面key获取对应值)Gson gson = new Gson();HashMap mapAcessToken = gson.fromJson(accessTokenInfo, HashMap.class);String access_token = (String) mapAcessToken.get("access_token");String openid = (String) mapAcessToken.get("openid");//4.根据openid对数据库进行查询UcenterMember member=memberService.getOpenIdMember(openid);if(member==null){//5.拿着access_token访问凭证和openid去请求微信提供的固定地址,获取扫描人的信息String baseUserInfoUrl = "https://api.weixin.qq.com/sns/userinfo" +"?access_token=%s" +"&openid=%s";String userInfoUrl = String.format(baseUserInfoUrl,access_token,openid);//6.发送请求得到用户结果String userInfo = HttpClientUtils.get(userInfoUrl);System.out.println("userInfo:"+userInfo);//7.捕获userInfo中人物信息:名字和头像HashMap userInfoMap = gson.fromJson(userInfo, HashMap.class);String nickname = (String) userInfoMap.get("nickname");String headimgurl = (String) userInfoMap.get("headimgurl");//8.说明表中没有相同数据member = new UcenterMember();member.setOpenid(openid);member.setNickname(nickname);member.setAvatar(headimgurl);memberService.save(member);}//9.使用jwt根据member的id和name生成token字符串->解决跨域问题,之后的验证直接判断请求头token就好String jwtToken = JwtUtils.getJwtToken(member.getId(), member.getNickname());return "redirect:http://localhost:3000?token="+jwtToken;} catch (Exception e) {throw new GuliException(20001,"登陆失败");}}

第七步:我们利用memberId和memberName生成token,利用token进行访问(不用cookie是因为无法实现跨域,前端给cookie值设置了domain,所以前台拿不到后台的数据,因为有两个域名一个前台的服务一个后台的服务)

利用token我们再将token解析就能找到我们要的数据了

第八步:我们从header中将token取出来然后解析放到cookie中,因为前端我们这里有cookie拦截器

根据this.$route.query.token取得token值,根据token获得用户信息回显到前端

 /*** 3.根据token获取用户信息*/@GetMapping("getMemberInfo")public R getMemberInfo(HttpServletRequest request){//getMemberIdByJwtToken根据请求头中的token得到用户信息(token得到userid->取出信息)String memberId = JwtUtils.getMemberIdByJwtToken(request);//根据用户id查询用户信息UcenterMember member = memberService.getById(memberId);return R.ok().data("userInfo",member);}

业务复习-微信登录/第三方登录实现相关推荐

  1. 拾人牙慧篇之———QQ微信的第三方登录实现

    一.写在前面 关于qq微信登录的原理之流我就不一一赘述了,对应的官网都有,在这里主要是展示我是怎么实现出来的,看了好几个博客,有的是直接复制官网的,有的不知道为什么实现不了.我只能保证我的这个是我实现 ...

  2. iOS微信实现第三方登录的方法

    这篇文章主要介绍了iOS微信第三方登录实现的全过程,一步一步告诉大家iOS微信实现第三方登录的方法,感兴趣的小伙伴们可以参考一下 一.接入微信第三方登录准备工作.移动应用微信登录是基于OAuth2.0 ...

  3. 微信网页第三方登录原理 微信开放平台和公众平台的区别 1.公众平台面向的时普通的用户,比如自媒体和媒体,企业官方微信公众账号运营人员使用,当然你所在的团队或者公司有实力去开发一些内容,也可以调用公众

    微信网页第三方登录原理 微信开放平台和公众平台的区别 1.公众平台面向的时普通的用户,比如自媒体和媒体,企业官方微信公众账号运营人员使用,当然你所在的团队或者公司有实力去开发一些内容,也可以调用公众平 ...

  4. CAS单点登录-第三方登录[QQ、微信、CSDN、GitHub](十四)

    CAS单点登录-第三方登录[QQ.微信.CSDN.GitHub](十四) 注: 目前博文使用cas版本为5.1.5,由于5.2.x与5.1.x构建模式有差异,所以部分配置会有些偏差. 本章内容 简答介 ...

  5. java 微信 qq 登录_拾人牙慧篇之———QQ微信的第三方登录实现

    一.写在前面 关于qq微信登录的原理之流我就不一一赘述了,对应的官网都有,在这里主要是展示我是怎么实现出来的,看了好几个博客,有的是直接复制官网的,有的不知道为什么实现不了.我只能保证我的这个是我实现 ...

  6. PC端微信QQ第三方登录

    微信第三方登录实现原理准备工作 参考微信开放平台:https://developers.weixin.qq.com/doc/oplatform/Website_App/WeChat_Login/Wec ...

  7. java qq微信微博第三方登录界面_android 实现第三方登录(微博、微信、QQ登录)

    [实例简介]此案例是演示案例,大家可以看到Bmob的第三方登录和信息获取如何工作的 实现了 qq.微信.微博的 第三方登录功能 [实例截图] [核心代码] package com.bmob.demo. ...

  8. 微信QQ第三方登录分享和支付宝微信支付

    登录是使用的是友盟第三方登录:APPID 和APPKEY都是成对出现的,改一个都要改不然出错. QQ第三方登录: APPID ,APPKEY: 微信第三方登录:WEIXINID, WEIXINKEY ...

  9. 微信php第三方登录接口,ThinkPHP实现微信三方登录

    小插曲就是app做微信三方登录是很久之前,后面又添加了PC的微信三方登陆,而文档上说unionid是同一个账号下不同应用统一的,但是app拿的是uid,导致pc拿的unionid始终对不上,导致浪费了 ...

最新文章

  1. 《AngularJS深度剖析与最佳实践》一第1章 从实战开始
  2. 《深入浅出Ext JS》2.19全国首发
  3. [Angularjs]ng-repeat中使用ng-model遇到的问题
  4. 对java面试文章的技术漫谈的C#技术理解
  5. string转换为bigdecimal_java如何将String转换为Int
  6. matlab差分算子的灰度图像边缘检测,常用图像边缘检测方法及MATLAB研究
  7. [译] Subject 和 Observable + Observer 的混淆指北[ Android RxJava2 ] ( 这什么鬼系列 ) 第八话...
  8. 书摘 - 吴军.浪潮之巅
  9. python随机生成中文句子_python – 如何使用NLTK从诱导语法中生成句子?
  10. 【硬见小百科】数字万用表的工作原理
  11. 学做‘视频剪辑’攻略
  12. 计算机营销专业毕业生自我评价,市场营销专业毕业生自我评价
  13. AutoPatch java_Java Beta.canAutoPatch方法代碼示例
  14. 大多数程序员单身的原因(转)
  15. 开源 程序员清单_2016开源夏季阅读清单
  16. pick_types()函数及参数 meg eeg stim eog ecg
  17. Spring之IOC概念、Bean对象创建及DI注入的三种方式
  18. 【MyBatis】缓存——使查询变得快快快!
  19. element-ui文件上传修改上传文件的格式
  20. 辰皇怎么过鸿蒙,最新版 鸿蒙副本快速通关和爆神符攻略

热门文章

  1. 投影仪应该怎么选择?数码粉总结目前最好的家用投影仪
  2. 施工现场工地监管如何能够接入4G摄像头实现流媒体服务器视频监控?
  3. transferwise怎么提现_境外收款和汇款工具推荐:TransferWise 可提现美元到国内
  4. 【PyTorch】下载的预训练模型的保存位置(Windows)
  5. Vue:把组件作为自定义元素来使用以及Identifier ' simple_couter' is not in camel case问题解决
  6. VBA中的MsgBox函数使用
  7. 蓝桥杯历年真题大全+题型分布+分数分布
  8. 山西宗教文化漫谈(三)一五台山:四大佛山之首
  9. COCOS CREATOR(TS)相对坐标转世界坐标
  10. series转换成dataframe