超赞!终于有网友用 Java 实现了第三方 QQ 账号登录。。。
Java专栏
共 6954字,需浏览 14分钟
· 2020-11-08
双11了,服务器限时限量秒杀
1核2G,1年62元,3年200元,限时秒杀
1核2G,1年62元,3年200元,限时秒杀
1核2G,1年62元,3年200元,限时秒杀
来源 | uidaima.com/blog/4725615031700480.html
QQ互联注册一个账号 加入jar包 登录页面 Controller编写 AuthComment类编写 登录成功跳转到页面 成功后的页面index freemarker配置
QQ互联注册一个账号
网站地址:https://connect.qq.com/,添加一个应用,具体怎么申请以及需要填写的信息,腾讯官网有详细文档。注册并完成相应信息填写后,可以在应用管理中查到应用的APP ID和APP Key。(注,这个申请还是比较麻烦的,申请了好几次,可能是脸黑吧)成功后如下图:
还需要添加一个回调地址,如下图:
加入jar包
com.qq
Sdk4J
2
登录页面
Controller编写
package com.gbq.boot.web.controller;
import cn.hutool.core.util.StrUtil;
import com.alibaba.fastjson.JSONObject;
import com.gbq.boot.web.bean.User;
import com.gbq.boot.web.comment.qqLoginComment.AuthComment;
import com.gbq.boot.web.service.UserService;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
import javax.annotation.Resource;
import javax.servlet.http.HttpServletResponse;
/**
* 登录Controller
* @author 阿前
* 2019年1月4日09:48:21
*/
@RestController
@RequestMapping("/login")
public class LoginController {
@Resource
private UserService userService;
@Resource
private AuthComment authComment;
@RequestMapping("/index")
public ModelAndView index(@ModelAttribute("user") User user) {
return new ModelAndView("/shop/index","user",user);
}
@RequestMapping("/login.html")
public ModelAndView toLogin() {
return new ModelAndView("login");
}
@RequestMapping("/qqLogin")
public void qqLogin(HttpServletResponse response)throws Exception{
//随机产生字符串
String state = StrUtil.uuid();
String url = authComment.getAuthUrl(state);
System.out.println(url);
//重定向
response.sendRedirect(url);
}
@GetMapping("/redirect")
public ModelAndView getData(@RequestParam(value = "code") String code, RedirectAttributes model){
//获取token
String accessToken = authComment.getAccessToken(code);
System.out.println("accessToken"+accessToken);
//获取openId
String openId = authComment.getOpenId(accessToken);
System.out.println("openId"+openId);
//获取用户信息
JSONObject userInfo = authComment.getUserInfo(accessToken, openId);
String myName = userInfo.getString("nickname");
User user = new User(null, "","111111",myName, System.currentTimeMillis(),"是",
userInfo.getString("figureurl_2"), userInfo.getString("gender")
,1,1,"", "", openId);
//通过openId查询
User usr = userService.findUsrByOpenId(openId);
if (null != usr){
user.setId(usr.getId());
userService.updateById(user);
}else {
userService.insert(user);
}
model.addFlashAttribute("user", user);
//重定向
return new ModelAndView("redirect:/login/index");
}
}
AuthComment类编写
package com.gbq.boot.web.comment.qqLoginComment;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static org.apache.commons.io.IOUtils.toByteArray;
@Component
public class AuthComment {
//QQ 登陆页面的URL
private final static String AUTHORIZATION_URL =
"https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=%s&redirect_uri=%s&scope=%s";
//获取token的URL
private final static String ACCESS_TOKEN_URL = "https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=%s&client_secret=%s&code=%s&redirect_uri=%s";
// 获取用户 openid 的 URL
private static final String OPEN_ID_URL = "https://graph.qq.com/oauth2.0/me?access_token=%s";
// 获取用户信息的 URL,oauth_consumer_key 为 apiKey
private static final String USER_INFO_URL = "https://graph.qq.com/user/get_user_info?access_token=%s&oauth_consumer_key=%s&openid=%s";
// 下面的属性可以通过配置读取
// QQ 在登陆成功后回调的 URL,这个 URL 必须在 QQ 互联里填写过
private static final String CALLBACK_URL = "http://127.0.0.1:8080/login/redirect";
// QQ 互联应用管理中心的 APP ID
private static final String APP_ID = "你的id";
// QQ 互联应用管理中心的 APP Key
private static final String APP_SECRET = "你的key";
/**
* QQ 登陆页面的URL
* @param scope
* @return
*/
public String getAuthUrl(String scope) {
return String.format(AUTHORIZATION_URL, APP_ID, CALLBACK_URL, scope);
}
/**
* 获取Access Token值
*/
public String getAccessToken(String code){
String ur = String.format(ACCESS_TOKEN_URL, APP_ID, APP_SECRET,code, CALLBACK_URL);
String compile = "access_token=(\\w*)&";
String result = this.getUrl(ur);
return this.getMatcher(result,compile);
}
/**
* 获取openId
* @param accessToken
* @return
*/
public String getOpenId(String accessToken) {
String url = String.format(OPEN_ID_URL, accessToken);
String compile = "openid\":\"(\\w*)\"";
String result = this.getUrl(url);
return this.getMatcher(result,compile);
}
/**
* 获取qq用户信息
* @param accessToken
* @param openId
* @return
*/
public JSONObject getUserInfo(String accessToken, String openId) {
String url = String.format(USER_INFO_URL, accessToken, APP_ID, openId);
String result = this.getUrl(url);
return JSON.parseObject(result);
}
private String getMatcher(String result,String compile) {
//使用正则表达式解析网址
Pattern p = Pattern.compile(compile);
Matcher m = p.matcher(result);
m.find();
return m.group(1);
}
//解析url
private String getUrl(String ur) {
try {
URL url = new URL(ur);
HttpURLConnection conn = null;
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5 * 1000);
conn.setRequestMethod("GET");
InputStream inStream = conn.getInputStream();
byte[] data = toByteArray(inStream);
String result = new String(data, "UTF-8");
System.out.println(result);
return result;
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
}
此处不再编写userService
成功会返回json串
其中主要需要的是,nickname——qq名称,figureurl_qq_x——不同尺寸的qq头像,等等等等!
登录成功跳转到页面
成功后的页面index
<span>欢迎你,${user.name}span>
freemarker配置
注意我使用的是freemarker模板,给大家贴上freemarker配置,已经mvc配置
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-freemarkerartifactId>
dependency>freemarker:
template-loader-path: classpath:/templates/
# 是否启用模板缓存。
suffix: .ftl
cache: false
# 模板编码。
charset: UTF-8
# 是否检查模板位置是否存在。
check-template-location: true
content-type: text/html
#是否启用freemarker
enabled: true
mvc:
view:
prefix: /templates/
suffix: .html
static-path-pattern: /static/**
至此全文结束。欢迎点赞转发支持一波~~~
评论
用 Shader 实现旗帜飘扬动画效果
我觉得对于刚入门 3D 编程的朋友来说,如果能够完成代码创建模型数据->创建材质->编写Shader动画这一系列,想必会有满满的成就感。今天就用 Cocos Creator 的 utils.MeshUtils.createMesh 接口,带大家感受一下这个流程。这个流程不仅可以用于新手学
COCOS
2
【送书福利】《Java面试八股文:高频面试题与求职攻略一本通》
先来唠唠最近粉丝面试回来跟我聊天,基本上都提到一个点,在面试过程中八股文占比很高(八股文70%、项目20%、10%算法)除了一些搞算法突出的厂除外。其实现在很多厂八股都是逐渐深入的方式来问,所以大家在学习的过程中,针对一些重点的内容,最好深入去学习,不然还是比较难应对这种追问式的问题。最近刚好从一位
Java后端技术
0
上班的时候,有一群摸鱼搭子非常重要...
上班的时候,有一群摸鱼搭子非常重要!一到上班时间,他们就从四面八方涌进群里冒泡...从八卦聊到股市、从职场聊到乌X兰局势,偶尔还会复读、相亲、battle...然后,下午6点钟准时消失不见...所以你要不要加入我们一起摸鱼?我们有北京、上海、深圳、广州、杭州、武汉、成都、南京等8个城市的摸鱼群,还有
产品经理日记
0
周四002 瑞超:同样落寞的境遇——北雪平vs埃尔夫斯堡
上赛季最终排名联赛第9的北雪平本赛季伊始表现不佳,4轮战罢他们仅以1胜1平2负的战绩排在倒数第三,这支历史上曾夺得13次联赛冠军、6次杯赛冠军老牌劲旅,正如英格兰赛场上的一众百年俱乐部,在低谷中不断探索着出路。球队主教练安德烈亚斯·阿尔姆曾是AIK索尔纳及赫根队的主教练,他于今年年初刚刚拿起球队教鞭
产品与体验
0
雷军辟谣了!不是高考状元,卡里也没有冰冷的 40 亿
架构师大咖
架构师大咖,打造有价值的架构师交流平台。分享架构师干货、教程、课程、资讯。架构师大咖,每日推送。
公众号该公众号已被封禁最近很火的雷军简历,听说落魄时卡里只有冰冷的 40
源码共读
0
知乎高问:程序员有必要知道为什么做某个功能吗?
将Python客栈设为“星标⭐”第一时间收到最新资讯前言知乎上有一个提问:程序员有必要知道为什么做某个功能吗?↓↓↓今天,我们就这个话题一起来做个讨论。不知道程序员的你,在接到产品经理提的一个需求后,是习惯马上动手开始撸代码呢?还是会先暂停一下,认真思考一会如下一些问题,比如这个需求产生的背景是什么
Python客栈
0
盘点一个使用超级鹰识别验证码并自动登录的案例
点击上方“Python共享之家”,进行关注回复“资源”即可获赠Python学习资料今日鸡汤江上几人在,天涯孤棹还。大家好,我是皮皮。一、前言前几天在Python钻石交流群【静惜】问了一个Python实现识别验证码并自动登录的问题,提问截图如下:验证码的截图如下所示:二、实现过程这里大家激烈的探讨,【
IT共享之家
0
警报炸锅了,FastJson 又立功了。。
往期热门文章:1、一个小公司的技术开发心酸事(已倒闭)2、JetBrains 如何看待自己的软件在中国被频繁破解?3、程序员因Bug被要求归还4万多年终奖,网友:不还!4、一套万能通用的异步处理方案5、微服务全做错了!谷歌提出新方法,成本直接降9倍!线上事故回顾前段时间新增一个特别简单的功能,晚上上
Java后端技术
1