微信扫码登录:
准备工作
网站应用微信登录是基于OAuth2.0协议标准构建的微信OAuth2.0授权登录系统。 在进行微信OAuth2.在进行微信OAuth2.0授权登录接入之前,在微信开放平台注册开发者帐号,并拥有一个已审核通过的网站应用,并获得相应的AppID和AppSecret,申请微信登录且通过审核后,可开始接入流程。
授权流程说明
微信OAuth2.0授权登录让微信用户使用微信身份安全登录第三方应用或网站,在微信用户授权登录已接入微信OAuth2.0的第三方应用后,第三方可以获取到用户的接口调用凭证(access_token),通过access_token可以进行微信开放平台授权关系接口调用,从而可实现获取微信用户基本开放信息和帮助用户实现基础开放功能等。 微信OAuth2.0授权登录目前支持authorization_code模式,适用于拥有server端的应用授权。该模式整体流程为:
1. 第三方发起微信授权登录请求,微信用户允许授权第三方应用后,微信会拉起应用或重定向到第三方网站,并且带上授权临时票据code参数;
2. 通过code参数加上AppID和AppSecret等,通过API换取access_token;
3. 通过access_token进行接口调用,获取用户基本数据资源或帮助用户实现基本操作。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-DmrvEw9k-1604366628585)(C:\Users\马浩雲\Desktop\微信扫码登录\img\1573889762(1)].jpg)
微信扫码登录整合springboot:
上代码:
pom
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
<dependency>
<groupId>org.apache.httpcomponents</groupId>
<artifactId>httpclient</artifactId>
<version>4.5.6</version>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.40</version>
</dependency>
</dependencies>
entity:
AccessToken:通过code获取access_token
public class AccessToken {
/**
* 接口调用凭证
*/
private String access_token;
/**
* access_token接口调用凭证超时时间,单位(秒)
*/
private Integer expires_in;
/**
* 用户刷新access_token
*/
private String refresh_token;
/**
* 授权用户唯一标识
*/
private String openid;
/**
* 用户授权的作用域,使用逗号(,)分隔
*/
private String scope;
/**
* 当且仅当该网站应用已获得该用户的userinfo授权时,才会出现该字段。
*/
private String unionid;
public String getAccess_token() {
return access_token;
}
public void setAccess_token(String access_token) {
this.access_token = access_token;
}
public Integer getExpires_in() {
return expires_in;
}
public void setExpires_in(Integer expires_in) {
this.expires_in = expires_in;
}
public String getRefresh_token() {
return refresh_token;
}
public void setRefresh_token(String refresh_token) {
this.refresh_token = refresh_token;
}
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getScope() {
return scope;
}
public void setScope(String scope) {
this.scope = scope;
}
public String getUnionid() {
return unionid;
}
public void setUnionid(String unionid) {
this.unionid = unionid;
}
}
HttpParame Description: 请求参数
public class HttpParame {
// 应用唯一标识
public static final String APPID = "appid";
// 密匙
public static final String SECRET = "secret";
// 微信用户唯一标识
public static final String OPENID = "openid";
// 接口调用凭证
public static final String ACCESS_TOKEN = "access_token";
// 回调地址
public static final String REDIRECT_URI = "redirect_uri";
// 网页授权回调地址
public static final String AUTHORIZATION_URL = "https://open.weixin.qq.com/connect/qrconnect?appid=APPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect";
// 通过code获取access_token
public static final String ACCESS_TOKEN_URL = "https://api.weixin.qq.com/sns/oauth2/access_token?appid=APPID&secret=SECRET&code=CODE&grant_type=authorization_code";
// 此接口用于获取用户个人信息 UnionID机制
public static final String GET_UNIONID_URL = "https://api.weixin.qq.com/sns/userinfo?access_token=ACCESS_TOKEN&openid=OPENID";
}
Result:返回结果包装对象使用
public class Result {
/**
* 状态
*/
private Object status;
/**
* 结果
*/
private Object result;
/**
* 消息
*/
private String message;
public Result() {
}
public Result(Object status, String message) {
this.status = status;
this.message = message;
}
public Result(Object status, Object result) {
this.status = status;
this.result = result;
}
public Result(Object status, Object result, String message) {
this.status = status;
this.result = result;
this.message = message;
}
public Object getStatus() {
return status;
}
public void setStatus(Object status) {
this.status = status;
}
public Object getResult() {
return result;
}
public void setResult(Object result) {
this.result = result;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
WechatUserUnionID:获取用户个人信息(UnionID机制)
public class WechatUserUnionID {
/**
* 普通用户的标识,对当前开发者帐号唯一
*/
private String openid;
/**
* 普通用户昵称
*/
private String nickname;
/**
* 普通用户性别,1为男性,2为女性
*/
private Integer sex;
/**
* 普通用户个人资料填写的省份
*/
private String province;
/**
* 普通用户个人资料填写的城市
*/
private String city;
/**
* 国家,如中国为CN
*/
private String country;
/**
* 用户头像,最后一个数值代表正方形头像大小 (有0、46、64、96、132数值可选,0代表640*640正方形头像) 用户没有头像时该项为空
*/
private String headimgurl;
/**
* 用户特权信息,json数组,如微信沃卡用户为(chinaunicom)
*/
private List<String> privilege;
/**
* 用户统一标识。针对一个微信开放平台帐号下的应用,同一用户的unionid是唯一的。
*/
private String unionid;
public String getOpenid() {
return openid;
}
public void setOpenid(String openid) {
this.openid = openid;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
public Integer getSex() {
return sex;
}
public void setSex(Integer sex) {
this.sex = sex;
}
public String getSexStr(){
if (getSex() != null) return getSex() == 1 ? "男" : "女";
return "";
}
public String getProvince() {
return province;
}
public void setProvince(String province) {
this.province = province;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
public String getCountry() {
return country;
}
public void setCountry(String country) {
this.country = country;
}
public String getHeadimgurl() {
return headimgurl;
}
public void setHeadimgurl(String headimgurl) {
this.headimgurl = headimgurl;
}
public List<String> getPrivilege() {
return privilege;
}
public void setPrivilege(List<String> privilege) {
this.privilege = privilege;
}
public String getUnionid() {
return unionid;
}
public void setUnionid(String unionid) {
this.unionid = unionid;
}
}
Util:
AesUtil: AES加密解密
Base64Util : Base64Util工具类 — 加密和解密
DateUtil: 日期工具类
HttpClientUtil: httpClient 工具类
PropertiesUtil: properties资源文件解析工具
Constant:系统所用到的常量---------自定义加密措施
weixinconnectconfig.properties:
appid=wxda40b1c158a1f380
secret=570486c6a6adf2d61055b74a463e64e6
redirect_uri=http://www.open1111.com/weixinconnect/
Util: AES加密解密
Base64Util : Base64Util工具类 — 加密和解密
DateUtil: 日期工具类
HttpClientUtil: httpClient 工具类
PropertiesUtil: properties资源文件解析工具
Constant:系统所用到的常量---------自定义加密措施
weixinconnectconfig.properties:
appid=wxda40b1c158a1f380
secret=570486c6a6adf2d61055b74a463e64e6
redirect_uri=http://www.open1111.com/weixinconnect/