前言

在进行微信公众号业务开发的时候,微信公众号授权操作是非常重要的一环,因为基本上操作所有微信的接口,前提都是需要用户的openId,而要拿到这个openid,就必须通过用户授权。该篇文章每一步都有记录,力争理解的同时各位小伙伴也能够实现功能

文章目录

  • 前言
  • 1、配置微信测试公众号
  • 2、SpringBoot实现授权
  • 3、前端部分
  • 4、测试
  • 总结

1、配置微信测试公众号

同样,这里拿微信官方提供的测试公众号进行测试
1、登录微信测试号:https://mp.weixin.qq.com/debug/cgi-bin/sandboxinfo?action=showinfo&t=sandbox/index

2、配置网页访问域名(注意:这里配置的是网页访问的域名哦)

3、往下滑,找到网页账号,进行配置(注意:这里配置的是后端接口的域名)

注意:这里配置的两个域名必须是公网的域名,我这里用的是内网穿透技术,仿制了两个公网域名映射到我本地端口,有时间我会单独写一篇关于如何免费进行内网穿透的文章。

至此,配置完毕。

2、SpringBoot实现授权

提前说明:其实这里有两种方式,但其实本质是一样的,因为目的都说获取code值,无非是前端做多一点或者后端做多一点,都差不多,因为我相信看这篇文章的可能后端多一点,所以我就写后端获取code的方式啦,但另外一种前端获取code的方式我也会顺带说的,大家觉得那种好就用那种~

1、引入依赖

<dependencies><dependency><groupId>com.github.binarywang</groupId><artifactId>weixin-java-mp</artifactId><version>4.0.0</version></dependency><dependency><groupId>dom4j</groupId><artifactId>dom4j</artifactId><version>1.1</version></dependency>
</dependencies>

2、添加配置

#公众号id和秘钥
wechat.mpAppId: wx09f201013e81d8
wechat.mpAppSecret: 6c999765c151850d28055e8b6e2eda
# 授权回调获取用户信息接口地址
wechat.userInfoUrl: http://eric.vipgz1.91tunl.com/api/user/wechat/userInfo

3、添加工具类

@Component
public class ConstantPropertiesUtil implements InitializingBean {@Value("${wechat.mpAppId}")private String appid;@Value("${wechat.mpAppSecret}")private String appsecret;public static String ACCESS_KEY_ID;public static String ACCESS_KEY_SECRET;@Overridepublic void afterPropertiesSet() throws Exception {ACCESS_KEY_ID = appid;ACCESS_KEY_SECRET = appsecret;}
}

4、编写Controller

@Controller
@RequestMapping("/api/user/wechat")
public class WechatController {@Autowiredprivate UserInfoService userInfoService;@Autowiredprivate WxMpService wxMpService;@Value("${wechat.userInfoUrl}")private String userInfoUrl;@GetMapping("/authorize")public String authorize(@RequestParam("returnUrl") String returnUrl, HttpServletRequest request) {String redirectURL = wxMpService.oauth2buildAuthorizationUrl(userInfoUrl, WxConsts.OAUTH2_SCOPE_USER_INFO, URLEncoder.encode(returnUrl.replace("guiguketan", "#")));return "redirect:" + redirectURL;}@GetMapping("/userInfo")public String userInfo(@RequestParam("code") String code,@RequestParam("state") String returnUrl) throws Exception {WxMpOAuth2AccessToken wxMpOAuth2AccessToken = this.wxMpService.oauth2getAccessToken(code);String openId = wxMpOAuth2AccessToken.getOpenId();WxMpUser wxMpUser = wxMpService.oauth2getUserInfo(wxMpOAuth2AccessToken, null);//这里根据自己的业务来,我是获取到openId后判断该用户是否存在,如果不存在,那么将该用户新增到数据库中UserInfo userInfo = userInfoService.getByOpenid(openId);if(null == userInfo) {userInfo = new UserInfo();userInfo.setOpenId(openId);userInfo.setUnionId(wxMpUser.getUnionId());userInfo.setNickName(wxMpUser.getNickname());userInfo.setAvatar(wxMpUser.getHeadImgUrl());userInfo.setSex(wxMpUser.getSexId());userInfo.setProvince(wxMpUser.getProvince());userInfoService.save(userInfo);}//生成tokenString token = JwtHelper.createToken(userInfo.getId(), userInfo.getNickName());if(returnUrl.indexOf("?") == -1) {//等于-1说明不存在return "redirect:" + returnUrl + "?token=" + token;} else {return "redirect:" + returnUrl + "&token=" + token;}}
}

说明:其中用了JWT工具类,关于JWT其实也没啥说,简单来说就是将用户信息封装为一个字符串,称之为Token,并且由,公共部分、私有部分、签名部分组成,我们可以获取其中任何一部分,JWT最重要的作用就是对 token信息的防伪作用。

3、前端部分

前端部分是已进入页面,自动发送请求给后端,然后由后端给微信服务器发送获取Code的请求,也就是用户授权。

created() {// 处理微信授权登录
this.wechatLogin();
},methods: {wechatLogin() {// 处理微信授权登录let token = this.getQueryString('token') || '';if(token != '') {window.localStorage.setItem('token', token);}// 所有页面都必须登录,两次调整登录,这里与接口返回208状态token = window.localStorage.getItem('token') || '';if (token == '') {let url = window.location.href.replace('#', 'guiguketan')window.location = 'http://eric.free.idcfengye.com/api/user/wechat/authorize?returnUrl=' + url}console.log('token2:'+window.localStorage.getItem('token'));},

方式二:这个code也可以由前端来进行发送获取code,然后前端将这个code直接发送给后端。

4、测试

因为当时在创建菜单的时候已经设置好了对应的路径,不了解的朋友可以看:【微信开发第一章】SpringBoot实现微信公众号创建菜单,同步菜单功能

1、任意点击一个菜单

2、可以看到就弹出授权的窗口啦~

3、此时只要我们点击同意,那么会自动回调调用该接口,微信放会传递一个code和要跳转的路径给我们

到这里,那么微信授权就完毕了


总结

怎么样,是不是特别简单,简单来说流程就是:

  1. 用户进入页面,前端发送请求给后端,携带要跳转页面的参数
  2. 后端接受到请求后,给微信服务器发送用户授权的请求
  3. 用户同意授权后,微信服务器会自动回调,携带code和要跳转的页面给后端,后端凭借该用户的code就可以做很多事情了,比如:获取用户信息

【微信开发第一章】SpringBoot实现微信公众号创建菜单,同步菜单功能:https://blog.csdn.net/weixin_47316183/article/details/127821095?spm=1001.2014.3001.5502

【微信开发第二章】SpringBoot实现微信公众号普通消息和模板消息回复:https://blog.csdn.net/weixin_47316183/article/details/127821653?spm=1001.2014.3001.5502

【微信开发第三章】SpringBoot实现微信授权登录
https://blog.csdn.net/weixin_47316183/article/details/127833802?spm=1001.2014.3001.5502

【微信开发第四章】SpringBoot实现微信H5支付
https://blog.csdn.net/weixin_47316183/article/details/127949620?spm=1001.2014.3001.5502

【微信开发第五章】SpringBoot实现微信分享
https://blog.csdn.net/weixin_47316183/article/details/127950090?spm=1001.2014.3001.5502

【微信开发第三章】SpringBoot实现微信授权登录相关推荐

  1. 【微信开发第四章】SpringBoot实现微信H5支付

    前言 在进行微信公众号业务开发的时候,微信支付可以说是非常重要的一环.该篇文章每一步都有记录,力争理解的同时各位小伙伴也能够实现功能 文章目录 前言 1.公众号配置 2.微信支付实现代码 总结 1.公 ...

  2. 手把手教你springboot企业微信开发(三)之 weui、zepto、thymeleaf

    手把手教你springboot企业微信开发(三)之 weui.zepto.thymeleaf weui zepto thymeleaf 这一篇主要事基础部分,概述一下weui.zepto.thymel ...

  3. 微信开发学习总结(一)——微信公众号开发入门指引

    本节要求: ①微信公众号申请 ②测试公众号的注册 ③准备微信公众号开发的环境 微信公众号开发入门指引 微信公众号的接入在微信公众平台-微信公众平台技术文档中有着详细的介绍.在进行微信开发前,建议先完整 ...

  4. ASP.NET自定义控件组件开发 第三章 为控件添加事件 后篇

    第三章 为控件添加事件 后篇 前一篇文章只是简单的说了下事件,但是大家应该方法,在ASP.NET自定义控件中只是简单那么定义事件是行不 通.如果大家开发的是WinForm中的事件,之前的定义可能没有什 ...

  5. ASP.NET自定义控件组件开发 第三章 为控件添加事件 前篇

    第三章 为控件添加事件 好了,我们之前以前开发一个控件.而且也添加了属性,开发也很规范,但是那个控件还差最后一点:添加事件. 系列文章链接: ASP.NET自定义控件组件开发 第一章 待续 ASP.N ...

  6. 微信小程序中如何获取用户手机号授权登录

    随着微信小程序的普及,许多应用程序需要用户登录才能提供更好的服务.而获取用户手机号码是验证用户身份和确保账户安全的重要步骤之一.因此,在本文中,我们将介绍如何在微信小程序中实现手机号授权登录. 步骤一 ...

  7. 微信支付(一)SpringBoot 实现微信扫码支付/Native支付

    SpringBoot 实现微信扫码支付/Native支付 一.背景 在开发一个捐赠项目时须在pc端接入微信扫码支付(Native 扫码支付),在微信端接入微信公众号支付(Jsapi 支付).后端使用的 ...

  8. [Python微信开发] 一.itchat入门知识及微信自动回复、微信签名词云分析

    最近准备学习微信小程序开发,偶然间看到了python与微信互动的接口itchat,简单学习了下,感觉还挺有意思的,故写了篇基础文章供大家学习.itchat是一个开源的微信个人号接口,使用python调 ...

  9. java微信昵称保存_JAVA微信开发-如何保存包含特殊字符的微信昵称

    我们在做微信开发的时候,有一个很重要的就是通过openid获取用户的详细信息,包含昵称,头像,省,市,区的信息,但是现在移动时代,很多人追求个性,在名字当中大量使用火星文或者表情符.(本人实际测试过一 ...

  10. java 过滤微信昵称_JAVA微信开发-如何保存包含特殊字符的微信昵称

    我们在做微信开发的时候,有一个很重要的就是通过openid获取用户的详细信息,包含昵称,头像,省,市,区的信息,但是现在移动时代,很多人追求个性,在名字当中大量使用火星文或者表情符.(本人实际测试过一 ...

最新文章

  1. 活动目录(Active Directory)安装
  2. metasploit framework
  3. 阿里云服务器部署SpringBoot项目(mysql安装、服务部署)
  4. java虚拟机工作原理图_Java虚拟机工作原理
  5. oracle编程基本语法,oracle编程基础语法
  6. java jdbc标签jsp_JDBC结合JSP使用(1)
  7. CSSSCSS的学习笔记
  8. 如何获取kindle资源
  9. html5 拾色器原理,HTML_html5 学习简单的拾色器 ,下面是源码 需要浏览器支持htm - phpStudy...
  10. jq ajax input file,基于jq的input file文件上传
  11. [从零开始学习FPGA编程-34]:进阶篇 - 基本时序电路-计数器(Verilog语言)
  12. 新手必备!最全电路基础知识讲解
  13. linux man 位置,Linux系统如何查看命令帮助,man命令使用详解
  14. 未睹棺椁先哭君——谷歌墓志铭
  15. import java.sql.*;问题:The package java.sql is not accessible
  16. 英文字母间隔很大怎么解决?全角半角的概念
  17. 瑞星卡卡升级出现错误:kmon.dll.zip,错误代码:0x0/0x0(chech)
  18. mysql如何加索引的时候不锁表
  19. 共享 满城尽带黄金甲 在线免费观看网址
  20. 微信程序开发之微信接入(详细开发)

热门文章

  1. python 新闻分类_python实现简单的新闻文章归类
  2. 电商项目测试实战(四)手机注册页面用例设计
  3. lintcode-507-摆动排序 II
  4. 在RK3066/RK3188电视棒上安装ubuntu(MK802III/MK808B/MK809/MK908/UG802/QC802
  5. 数据运营是什么?该如何做?
  6. C++ 解决多对一问题
  7. apns java 证书_GitHub - linyu19872008/apns-http2-java: 苹果推送apns的http2解决方案
  8. 半挂式洒水车的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  9. 尚硅谷Javase项目一(家庭收支记账软件)
  10. 通俗理解路由器和交换机的区别?