微信登录的优势

目前微信用户数量巨大,用户更希望通过更快更便捷的方式进行登录,而不是传统的账号密码登录。

springboot 接入微信登陆

准备工作

网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。 在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的网站应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。

说白了就是需要一个AppID和对应的Appsecret

传送门:微信开放平台 (qq.com)

登陆后选一个,这里是网站应用

顺便再把回调域改一下。

授权流程


那我们要做什么呢?

设置一个链接让用户跳转到微信登录扫码界面,然后用户点确认后会带上codestate重定向到我们设置的回调域,这是我们带上code访问微信获得用户的一些基本信息和access_token refresh_token,有了token我们就可以获取用户具体的信息了。这时候我们再设置session就可以让用户登录成功了。

  1. 打开链接

    设置一个链接,格式如下:

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


0. 添加回调域网址接受回调信息

在用户授权之后,将会重定向到回调域,redirect_uri?code=CODE&state=STATE这时我们就获取了code,随后访问链接获取 access_token`https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code`

正确的返回:

{
"access_token":"ACCESS_TOKEN",
"expires_in":7200,
"refresh_token":"REFRESH_TOKEN",
"openid":"OPENID",
"scope":"SCOPE",
"unionid": "o6_bmasdasdsad6_2sgVt7hMZOPfL"
}
参数 说明
access_token 接口调用凭证(我们需要的)
expires_in access_token接口调用凭证超时时间,单位(秒),一般是两小时
refresh_token 用户刷新access_token
openid 授权用户唯一标识,对于当前appid是唯一的
scope 用户授权的作用域,使用逗号(,)分隔
unionid 当且仅当该网站应用已获得该用户的userinfo授权时,才会出现该字段。
  1. 获取用户详细信息

    继续访问https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID就可以获取用户的详细信息了

实际操作

1. appId和appSecret的配置

在application.yml的配置:

import lombok.Data;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.stereotype.Component;
@Component
@Data
@ConfigurationProperties(prefix = "wx")
public class WXConfig {private String appId;private String appSecret;
}

2. 设置网址

3. 设置回调域

导包

<!-- https://mvnrepository.com/artifact/org.apache.httpcomponents/httpclient -->
<dependency><groupId>org.apache.httpcomponents</groupId><artifactId>httpclient</artifactId><version>4.5.13</version>
</dependency>
<dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.78</version>
</dependency>

工具类

public class CommonUtil {private static final int BUFFER_SIZE = 1024 * 8;public static String getBody(InputStream inputStream) throws IOException {Reader reader = new BufferedReader(new InputStreamReader(inputStream));StringWriter writer = new StringWriter();int read;char[] buf = new char[BUFFER_SIZE];while ((read = reader.read(buf)) != -1) {writer.write(buf, 0, read);}return writer.getBuffer().toString();}
}

回调域逻辑

@Slf4j
@Controller
public class WXController {@Autowiredprivate WXConfig wxConfig;
​@ResponseBody@RequestMapping("/wx/login")public String login(HttpServletRequest request) throws IOException {String code = request.getParameter("code");String state = request.getParameter("state");if (code == null){log.error("用户取消登录");}log.info("code = {}", code);CloseableHttpClient httpClient = HttpClientBuilder.create().build();String url = "https://api.weixin.qq.com/sns/oauth2/access_token" +"?appid=" + wxConfig.getAppId() +"&secret=" + wxConfig.getAppSecret() +"&code=" + code +"&grant_type=authorization_code";HttpGet httpGet = new HttpGet(url);CloseableHttpResponse response = httpClient.execute(httpGet);
​HttpEntity entity = response.getEntity();String body = CommonUtil.getBody(entity.getContent());log.info(body);response.close();
​JSONObject bodyJson = JSON.parseObject(body);// 这里已经获取了用户的部分信息,可以在数据库中查询,如果已经记录过了,就没有必要进入后面的步骤了String accessToken = bodyJson.getString("access_token");String openId = bodyJson.getString("openId");
​url = "https://api.weixin.qq.com/sns/userinfo" +"?access_token=" + accessToken +"&openid=" + openId;httpGet = new HttpGet(url);response = httpClient.execute(httpGet);body = CommonUtil.getBody(response.getEntity().getContent());bodyJson = JSON.parseObject(body);// 获取了用户信息后进行存储log.info("the info of user is {}", bodyJson);response.close();// 登录成功,设置sessionrequest.getSession().setAttribute("unionId", bodyJson.getString("union_id"));return "登录成功";}
}

\

springboot微信登陆相关推荐

  1. Spring-Boot整合微信登陆、微信支付、邮箱发送、支付宝支付和阿里云短信

    Spring-Boot整合 1. 发送邮件 2. 支付宝支付 3. 阿里云短信 4. 微信登陆 5. 微信支付 6. Swargger2 前后端API接口信息文档 7. ehcache缓存缓存 8. ...

  2. SpringBoot项目 + Maven + 企业微信登陆授权登陆

    SpringBoot项目 + Maven + 企业微信授权 项目背景 需求描述 准备 一. 建立SpringBoot项目 开始 1.创建新的Maven工程(创建父工程) 2.选择左侧Maven项目,直 ...

  3. (附源码)基于springboot微信小程序的长沙县图书馆图书导览系统 毕业设计 170900

    基于springboot微信小程序的长沙县图书馆图书导览系统 摘  要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也 ...

  4. springboot+微信小程序老年人健康保障管理系统毕业设计源码302303

    基于springboot微信小程序的老年人健康保障管理系统 摘  要 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是 ...

  5. Java实现扫码微信登陆(获取登陆成功的用户信息 + 包含使用vue怎么显示登陆二维码)

    实现于springboot中 依据b站视频写出的: 点击此处进行观看 然后记录于此处. 首先微信登陆的流程为: (可以去微信开发者平台看) 第一步:请求CODE 若提示"该链接无法访问&qu ...

  6. uniappH5+springboot微信授权登录获取用户数据(非静默授权)

    uniappH5+springboot微信授权登录获取用户数据(非静默授权) 微信网页授权开发文档 准备工作 微信公众号appid和appSecret及配置相关的ip白名单 配置网页授权域名,具体操作 ...

  7. openid java_微信小程序调用微信登陆获取openid及java做为服务端示例

    一.微信小程序 第一步:调用 wx.login获取code 文档地址 第二步:判断用户是否授权读取用户信息 文档地址 第三步:调用wx.getUserInfo读取用户数据 文档地址 第四步:由于小程序 ...

  8. html5app微信登陆,基于h5+的微信登陆,hbuilder打包

    wxLoginFn() { let self= this; getService()//微信受权登陆对象 let aweixin = null;//当前环境支持的全部受权登陆对象 let auths ...

  9. Android之调用微信登陆、分享、支付

    转载:http://blog.csdn.net/lowprofile_coding/article/details/48086381 前言:用了微信sdk各种痛苦,感觉比qq sdk调用麻烦多了,回调 ...

  10. java微信demo_微信登陆 , 简单的demo , java

    这几天简单的做了一下微信登陆的demo,希望对大家有帮助 不多说,直接上代码: /** * * @author TY * */ @Controller @RequestMapping("/w ...

最新文章

  1. 英雄多少钱steam_¥50元到手蓝宝石显卡?玩转GTAV轻松CSGO英雄联盟帧数144fps
  2. opengl如何画出一个球_OpenGL-Controlling and Monitoring the Pipeline
  3. 【HP-Unix快捷命令行键详解】
  4. TensorFlow 2.0要来了,tf.contrib要砍了 | 有什么意见你说啊
  5. 骆驼壳修改服务器,【电视直播】发烧友TV,骆驼壳导入直播源教程,打造个人专属永久盒子软件,你们想看的这都有!...
  6. Golang Web框架性能对比
  7. 如何解决切换双系统导致windows没声音的问题
  8. 描述内存分配方式以及它们的区别?
  9. 百度地图InfoWindow添加点击事件
  10. AltiumDesigner2020导入3D Body-SOLIDWORKS三维模型
  11. python的ols_看懂python3 之statsmodels包的OLS
  12. excel 基础笔记整理
  13. 2022保育员(高级)考试模拟100题及在线模拟考试
  14. 百度推广创意怎么写?百度推广创意十大秘籍
  15. xctf 实时数据监测
  16. Babel转码时报错 Unexpected EOF at line 1 column 2 of the JSON5 data. Still to read:“”
  17. 基于CC2530的温湿度传感器和基于C#的应用界面设计
  18. zpl php,php – 如何在垂直标签中垂直打印zpl条形码
  19. 线性数据与非线性数据的区别
  20. mapreduce——invertedindex

热门文章

  1. java里如何继承一个类_java如何继承类
  2. 开三个iframe不断刷访问量
  3. python刷博客点击量
  4. java有哪些技术领域
  5. 面试前hr加了微信,面试后是否可以向hr询问面试结果?
  6. Unity获取IOS端相机权限的状态
  7. 运放输入偏置电流方向_输入偏置电流和输入失调电流(运放参数的详细解释和分析)...
  8. 微信生成带参数二维码以及获取此二维码参数
  9. ps两张图片合在一起
  10. 四、ARDUINO UNO开发板介绍