微信公众号网页OAuth2.0授权登录并获取用户信息(SpringBoot实现)
微信公众号网页OAuth2.0授权登录并获取用户信息(SpringBoot实现)
文章目录
- 微信公众号网页OAuth2.0授权登录并获取用户信息(SpringBoot实现)
- 准备工作
- 开发思路
- 具体代码
- 编写一个WxConstant.java常量类用来存放公众号的一些信息,也可以在application.yml里面配置
- 编写重定向到微信要求用户授权页面的接口
- loginService.doWxLogin (request, response)
- 编写接收code接口
- loginService.auth (code, request, response)
准备工作
- 最好是有服务器和已经备案的域名
- 注册邮箱,网易邮箱注册地址
- 开通一个公众号,点击开通公众号,或者申请一个测试号,点击申请测试号
- 修改网页授权回调域名
如果是正式公众号只能填已经备案的域名且使用80端口,测试号可以填ip,ip:端口,或者域名:端口,本地ip(127.0.0.1)也是可以调通的
正式公众号还需要将下面这个文件放到服务器上 ,放在一个可以用 xxx.fun/文件名访问的地方
开发思路
- 开发一个接口,使用户点击这个接口的链接之后重定向到微信给定的授权页面【https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect】(注意里面的参数redirect_uri)
- 用户来到这个页面点击同意
- 用户同意授权,微信服务器将会以参数的形式给你返回一个code到上面重定向链接的参数redirect_uri
- 所以我们还要开发一个接口用来接收这个code,接口的链接就是上面重定向链接的参数redirect_uri
具体代码
编写一个WxConstant.java常量类用来存放公众号的一些信息,也可以在application.yml里面配置
//服务号//APPIDpublic static final String SERVICE_APPID = "wxc***";//授权成功后重定向的前端页面public static final String BASE_URL = "http://xxx.fun/home";//APPSECRETpublic static final String SERVICE_APPSECRET = "c7c***";//授权URLpublic static final String AUTH_BASE_URL = "https://open.weixin.qq.com/connect/oauth2/authorize?";//获取tokenpublic static final String ACCESS_TOKEN_BASE_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?";//获取用户信息public static final String INFO_BASE_URL = "https://api.weixin.qq.com/sns/userinfo?";//授权回调public static final String REDIRECT_URL = "http://xxx.fun/weixin/auth";//授权允许的范围public static final String SCOPE = "snsapi_userinfo";
编写重定向到微信要求用户授权页面的接口
/*** create by: Antares* description: 服务号授权登录(引导用户授权)* create time: 2020/5/25 14:13* return**/@GetMapping ("/login")public void doWxLogin (HttpServletRequest request, HttpServletResponse response) {try {loginService.doWxLogin (request, response);} catch (Exception e) {e.printStackTrace ();//相应的处理}}
loginService.doWxLogin (request, response)
@Overridepublic void doWxLogin (HttpServletRequest request, HttpServletResponse response) throws IOException {String authUrl = new StringBuilder (WxConstants.AUTH_BASE_URL).append ("appid=").append (WxConstants.SERVICE_APPID).append ("&redirect_uri=").append (URLEncoder.encode (WxConstants.REDIRECT_URL)).append ("&response_type=code").append ("&scope=").append (WxConstants.SCOPE).append ("&connect_redirect=1").append ("&state=STATE#wechat_redirect").toString ();String signature = request.getParameter ("signature");/// 微信加密签名String timestamp = request.getParameter ("timestamp");/// 时间戳String nonce = request.getParameter ("nonce"); /// 随机数String echostr = request.getParameter ("echostr"); // 随机字符串log.info (URLEncoder.encode (WxConstants.REDIRECT_URL));PrintWriter out = response.getWriter ();if (signature != null && timestamp != null && nonce != null && echostr != null) {if (SignUtil.checkSignature (signature, timestamp, nonce)) {out.print (echostr);}out.close ();} else {response.sendRedirect (authUrl);log.info ("url:{}", authUrl);}}
编写接收code接口
/*** create by: Antares* description: 服务号授权成功重定向* create time: 2020/5/25 14:13* return**/@GetMapping ("/auth")public void auth (@RequestParam ("code") String code,@RequestParam ("state") String state,HttpServletRequest request,HttpServletResponse response) throws IOException {log.info ("code={}", code);//code=081uURiJ0SW1Bd2BWAhJ0XxWiJ0uURiYloginService.auth (code, request, response);}
loginService.auth (code, request, response)
@Overridepublic void auth (String code,HttpServletRequest request,HttpServletResponse response) throws IOException {//获取openid,access_tokenString authUrl = new StringBuilder (WxConstants.ACCESS_TOKEN_BASE_URL).append ("appid=").append (WxConstants.SERVICE_APPID).append ("&secret=").append (WxConstants.SERVICE_APPSECRET).append ("&code=").append (code).append ("&grant_type=authorization_code").toString ();String authResult = HttpUtil.sendGet (authUrl);//解析出openid,access_token存进RedisJSONObject authObject = JSON.parseObject (authResult);String accessToken = authObject.getString (KeyConst.H5_ACCESS_TOKEN_KEY);String openId = authObject.getString (KeyConst.OPENID_KEY);redisUtil.set ("access_token: " + openId, accessToken, 7000);log.info ("openid: {}, access_token: {}", openId, accessToken);//已经授权过Integer userId = weChatUserMapper.selectUserId (openId);//获取用户信息String url = new StringBuilder (WxConstants.INFO_BASE_URL).append ("access_token=").append (accessToken).append ("&openid=").append (openId).append ("&lang=zh_CN").toString ();String result = HttpUtil.sendGet (url);log.info (result);JSONObject object = JSON.parseObject (result);//存进数据库WeChatUser user = new WeChatUser (object.getString (KeyConst.OPENID_KEY),object.getString ("nickname"),object.getString ("headimgurl"),object.getString ("sex"),object.getString ("province") + " " + object.getString ("city"));if (userId != null) {user.setUserId (userId);weChatUserMapper.updateUser (user);String token = redisUtil.get ("token:" + userId).toString ();response.sendRedirect (WxConstants.BASE_URL + "?user_id=" + userId + "&token=" + token);return;}weChatUserMapper.insertUser (user);//生成tokenString token = JwtUtil.sign (1, user.getUserId ().toString (), openId);String key = "token:" + user.getUserId ();if (redisUtil.hasKey (key)) {redisUtil.del (key);}redisUtil.set (key, token);if (user.getUserId () != null) {response.sendRedirect (WxConstants.BASE_URL + "?user_id=" + user.getUserId () + "&token=" + token);}}
这里是用授权成功后重定向到前端页面的方式,因为一开始我是用让前端调/login接口,然后最后返回json数据的方式,但是这里会产生一个问题就是重定向到授权页面的时候前端和微信服务器会有跨域问题
微信公众号网页OAuth2.0授权登录并获取用户信息(SpringBoot实现)相关推荐
- 微信公众号(H5)授权登录
拿到临时code 获取临时CODE网址:https://open.weixin.qq.com/connect/oauth2/authorize?appid=APPID&redirect_uri ...
- 微信公众号最佳实践 ( 4.7)获取用户地理位置
开通了上报地理位置接口的微信公众号,在用户关注并进入微信公众号回话时,会弹框让用户确认是否允许微信公众号使用其地理位置.弹框只在关注后出现一次,用户以后可以在微信公众号详情页面进行操作. 本章代码还需 ...
- 微信公众号开发1-微信授权登录
说在前面的话 关于微信公众号的项目也已经告落一段时间了,但是项目结束后又有参加了新的项目,导致一直没有时间分享项目经验,今天正好得空来分享一下本项目,本项目主要用到了微信公众号开发,百度地图api等, ...
- 微信公众号授权登录,获取用户信息openid(亲测有效)
需求:客户登录微信公众号进行账号注册,绑定微信openid,下次根据openid验证自动登录. 详细代码:https://download.csdn.net/download/yaya_jn/7492 ...
- 微信公众号授权登录、获取用户信息(openid)
配置微信公众号开发环境就不赘述了. 进入正题..... 首先,先理清楚微信登录的两种实现途径(这里我们先演示一种)1.微信开放平台实现,2.微信公众号(微信公众平台)实现. 因为微信登录不同与QQ登录 ...
- java支付宝网页授权登录界面_支付宝开发平台之第三方授权登录与获取用户信息...
对于第三方登录,我们常见了,很多应用可以进行第三方登录,我常用的有:QQ.微信.新浪.支付宝等等,今天我们就一起来简单学习一下支付宝第三方授权登录. 打开支付宝开发平台,注册成为开发者,点击开发者中心 ...
- PHP 公众号获取用户地理位置,微信公众号接口配置,并利用接口获取用户地理位置...
微信公众号获取用户地理位置有两种方法: 一是在进入微信公众号时获取,然后微信服务器将位置传到我们的服务器. 二是在公众号网页中,通过 JS-SDK 获取. 本文介绍的是第一种方法,第二种方法的部分内容 ...
- 微信公众号前后端分离授权登录
前后端分离模式下微信授权登录 https://blog.csdn.net/qq_39524670/article/details/81118721?utm_medium=distribute.pc_r ...
- SpringBoot2.0(九):实现微信授权登录并且获取用户信息
第一步:配置域名 由于我是本地测试,需要一个域名映射工具,改工具使用非常简单,如果自己有域名可以使用自己的域名(自己的域名必须备案)如果没有可以在第一个输入框里面输入自己的域名前缀!微信授权登录端口必 ...
最新文章
- ubuntu 配置 jdk 环境
- 使用ANY和ALL条件
- Qt Load and Save PCL/PLY 加载和保存点云
- 在Ext JS 6中添加本地化包
- SAP ABAP SM50的另类用途 - ABAP工作进程对数据库表读取操作的检测
- 【OS学习笔记】二十三 保护模式七:保护模式下任务的隔离与任务的特权级概念
- 动态规划6个题目总结比较
- 22个学习Python必备的库,你是否还有没见过的呢
- nvidia TX2 CUDA yolov5环境搭建
- 决策树Decision Tree+ID3+C4.5算法实战
- 一建已经过去,正是中级通信工程师黄金备考期!
- Android长图文截图的实现(支持截取微博,知乎,头条等第三方app)
- PAT A1002 A+B for Polynomials (25 分)
- C语言if语句的基本用法
- 高盛区块链79页完整报告:从理论到实践!
- problem: ERROR cluster.YarnClientSchedulerBackend: Yarn application has already exited with state
- 傻瓜式PHP模版,poscms傻瓜式开发模块
- 一文彻底学会CSS-3
- uniapp让ios软键盘-点击-非输入框地方-自动收起
- 物联网发展方向(复制来的)