SpringBoot微信公众号授权登录
一、JAVA代码部分
1.Controller类
1.1.通知微信公众平台,申请微信公众号的appid和secret
@ApiOperation(value = "公众号登录", notes = "公众号登录")
@AutoLog(value = "公众号登录")
@GetMapping(value = "/login")
public Result login(@ApiParam(name = "code", value = "code", required = true)
@RequestParam(name = "code", required = true) String code) {
//配置参数
String openidParams = "appid=" + Configure.appID_gzh + "&secret=" + Configure.secret_gzh + "&code=" + code + "&grant_type=authorization_code";
//公众号发送请求
String openidResult = HttpRes.sendGet("https://api.weixin.qq.com/sns/oauth2/access_token", openidParams);
JSONObject openidJson = JSONObject.parseObject(openidResult);
String openid = (String) openidJson.get("openid");
String accessToken = (String) openidJson.get("access_token");
//获取用户信息
JSONObject userInfoJson = this.getGzUserInfo(accessToken,openid);
//中文是乱码
String nickname =(String) userInfoJson.get("nickname");
String headimgurl =(String) userInfoJson.get("headimgurl");
SysUser gzUser = sysUserService.getOne(new QueryWrapper<SysUser>().eq("open_id", openid));
JSONObject jsonObject = new JSONObject();
jsonObject.put("openId", openid);
jsonObject.put("headimgurl", headimgurl);
//todo 以下换成自己的业务逻辑
return null;
}
2.HttpRes工具类
public class HttpRes {
/**
* 向指定URL发送GET方法的请求
*
* @param url
* 发送请求的URL
* @param param
* 请求参数,请求参数应该是 name1=value1&name2=value2 的形式。
* @return URL 所代表远程资源的响应结果
*/
public static String sendGet(String url, String param) {
String result = "";
BufferedReader in = null;
try {
String urlNameString = url + "?" + param;
URL realUrl = new URL(urlNameString);
// 打开和URL之间的连接
URLConnection connection = realUrl.openConnection();
// 设置通用的请求属性
connection.setRequestProperty("accept", "*/*");
connection.setRequestProperty("connection", "Keep-Alive");
connection.setRequestProperty("user-agent",
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)");
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
Map<String, List<String>> map = connection.getHeaderFields();
// 遍历所有的响应头字段
for (String key : map.keySet()) {
System.out.println(key + "--->" + map.get(key));
}
// 定义 BufferedReader输入流来读取URL的响应
in = new BufferedReader(new InputStreamReader(
connection.getInputStream()));
String line;
while ((line = in.readLine()) != null) {
result += line;
}
} catch (Exception e) {
System.out.println("发送GET请求出现异常!" + e);
e.printStackTrace();
}
// 使用finally块来关闭输入流
finally {
try {
if (in != null) {
in.close();
}
} catch (Exception e2) {
e2.printStackTrace();
}
}
return result;
}
/**
* 自定义证书管理器,信任所有证书
*
* @author pc
*/
public static class MyX509TrustManager implements X509TrustManager {
@Override
public void checkClientTrusted(
java.security.cert.X509Certificate[] arg0, String arg1)
throws CertificateException {
}
@Override
public void checkServerTrusted(
java.security.cert.X509Certificate[] arg0, String arg1)
throws CertificateException {
}
@Override
public java.security.cert.X509Certificate[] getAcceptedIssuers() {
return null;
}
}
}
2.getGzUserInfo方法
private JSONObject getGzUserInfo(String accessToken, String openid) {
String openidParams = "access_token=" + accessToken + "&openid=" + openid + "&lang=zh_CN";
// 发送请求,获取用户信息
String openidResult = HttpRes.sendGet("https://api.weixin.qq.com/sns/userinfo", openidParams);
System.out.println(openidResult);
JSONObject openidJson = JSONObject.parseObject(openidResult);
return openidJson;
}
一个在学习的开发者,勿喷,欢迎交流