前言
第三方登录之PCQQ生成二维码 成功并回调
一、所需参数
@Resource
private RedisCache redisCache;
@Resource
private UserAccountService userAccountService;
//应用AppID
private String qqAppId="";
//应用AppSecret
private String qqAppSecre="";
//回调方法路径
yml配置
project:
servlet: xxx
@Value("${project.servlet}")
private String wxCallback;
//模版
private RestTemplate restTemplate = new RestTemplate();
二、前端调用接口
1.生成二维码
代码如下(示例):
/**
* 生成登录二维码
* return: 前端展示二维码路径,可以直接用a标签包裹
**/
@GetMapping("/getCode")
public R getCode(String type) throws UnsupportedEncodingException {
String qqOauthUrl = "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=APPID&redirect_uri=REDIRECT_URI&state=STATE";
String qq_redirect_uri = URLEncoder.encode(qqCallback+"/qqLogin/qqCallback", "utf-8");
qqOauthUrl = qqOauthUrl.replace("APPID",qqAppId).replace("REDIRECT_URI",qq_redirect_uri);
if ("1".equals(type))
redisCache.setCacheObject("user",SecurityUtil.getCurrentUserId());
return data(qqOauthUrl) ;
}
2.成功回调
代码如下(示例):
//回调方法(用户扫描二维码授权后调用)
@GetMapping("/qqCallback")
public void qqCallback(@RequestParam(name = "code", required = false) String code, HttpServletResponse response) throws IOException {
if (code == null || "".equals(code)) {
// return R.error("用户禁止授权");
return;
}
//1.通过code获取access_token
String url = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=APPID&client_secret=APPSECRET&code=CODE&redirect_uri=REDIRECT_URI";
url = url.replace("APPID", qqAppId).replace("APPSECRET", qqAppSecre).replace("CODE", code).replace("REDIRECT_URI", qqCallback);
//String tokenInfoStr = HttpRequestUtils.httpGet(url, null, null);
ResponseEntity<String> tokenData = restTemplate.getForEntity(url, String.class);
Map<String, String> tokenMap = new HashMap<>();
if (tokenData.getStatusCodeValue() == 200) {
String tokenStr = tokenData.getBody();
String[] strs = tokenStr.split("&");
for (String string : strs) {
String key = string.split("=")[0];
String value = string.split("=")[1];
tokenMap.put(key, value);
}
} else {
// return R.error("用code获取access_token失败");
return;
}
//2.通过access_token和openid获取用户信息
String userInfoUrl = "https://graph.qq.com/oauth2.0/me?access_token=ACCESS_TOKEN";
userInfoUrl = userInfoUrl.replace("ACCESS_TOKEN", tokenMap.get("access_token"));
ResponseEntity<String> responseEntity = restTemplate.getForEntity(userInfoUrl, String.class);
if (responseEntity.getStatusCodeValue() == 200) {
JSONObject userInfoObject = ConvertToJson(responseEntity.getBody());
if (userInfoObject.getString("openid") == null || "".equals(userInfoObject.getString("openid"))) {
// return R.error("获取用户信息失败");
return;
}
//登录后唯一id
String openid = userInfoObject.getString("openid");
//------------业务处理
LambdaQueryWrapper<UserAccount> wrapper = Wrappers.lambdaQuery(new UserAccount()).eq(UserAccount::getQqOpenid, openid).ne(UserAccount::getIsDelete, 1);
UserAccount userAccount = userAccountService.getOne(wrapper);
//判断是否是绑定第三方
if (redisCache.getCacheObject("user") !=null ){
LambdaQueryWrapper<UserAccount> wrapper1 = Wrappers.lambdaQuery(new UserAccount()).eq(UserAccount::getId, redisCache.getCacheObject("user")).ne(UserAccount::getIsDelete, 1);
UserAccount userAccount1 = userAccountService.getOne(wrapper1);
userAccount1.setWxOpenid(openid);
//判断是否已被绑定
if (userAccount !=null){
userAccount.setWxOpenid(null);
userAccountService.updateByPrimaryKey(userAccount);
}
userAccountService.updateByPrimaryKey(userAccount1);
StpUtil.login(userAccount1.getId(), "pc");
redisCache.deleteObject("user");
response.sendRedirect("http://xxx/#/?token1=" + StpUtil.getTokenValue());
//判断用户是否存在直接登录
} else if (userAccount != null) {
StpUtil.login(userAccount.getId(), "pc");
response.sendRedirect("http://xxx/#/?token1=" + StpUtil.getTokenValue());
//用户不存在注册登录
}else{
UserAccount userAccount1 = new UserAccount();
String salt = "qazwsx";
userAccount1.setSalt(salt);//加密方式、、、、、、
String randomStr = String.valueOf((long) ((Math.random() * 9.0 + 1) * (Math.pow(10, 10 - 1))));
userAccount1.setNickName(randomStr);
userAccount1.setRegistrationTime(new Date());
userAccount1.setType(0);
userAccount1.setPicture("xxx");
userAccount1.setWxOpenid(openid);
userAccountService.save(userAccount1);
StpUtil.login(userAccount1.getId(), "pc");
response.sendRedirect("http://xxx/#/?token1=" + StpUtil.getTokenValue());
}
/**
* 根据openid查询平台用户:
* 1. 如果没有查询到用户,则将openid与平台用户绑定,或者注册新账户
* 2. 如果查询到用户,则调用本地登录方法
*/
} else {
// return R.error("获取用户信息失败");
return;
}
return;
}
private JSONObject ConvertToJson(String string) {
string = string.substring(string.indexOf("(") + 1, string.length());
string = string.substring(0, string.indexOf(")"));
JSONObject jsonObject = JSONObject.parseObject(string);
return jsonObject;
}
总结
第三方QQ登录 首先调用生成二维码 扫码登陆成功后回调