点击上方蓝色“程序猿DD”,选择“设为星标”

回复“资源”获取独家整理的学习资料!

来源 | uidaima.com/blog/4725615031700480.htm

QQ互联注册一个账号

网站地址:https://connect.qq.com/,添加一个应用,具体怎么申请以及需要填写的信息,腾讯官网有详细文档。注册并完成相应信息填写后,可以在应用管理中查到应用的APP ID和APP Key。(注,这个申请还是比较麻烦的,申请了好几次,可能是脸黑吧)成功后如下图:

还需要添加一个回调地址,如下图:

加入jar包

<!-- 第三方QQ登录 -->
<dependency><groupId>com.qq</groupId><artifactId>Sdk4J</artifactId><version>2</version>
</dependency>

登录页面

<button type="submit" class="btn btn-default" onclick="qqLogin()">qq登录</button>
function qqLogin() {window.open("/login/qqLogin","TencentLogin");
}

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 {@Resourceprivate UserService userService;@Resourceprivate 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){//获取tokenString accessToken = authComment.getAccessToken(code);System.out.println("accessToken"+accessToken);//获取openIdString 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 登陆页面的URLprivate final static String AUTHORIZATION_URL ="https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=%s&redirect_uri=%s&scope=%s";//获取token的URLprivate 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 的 URLprivate static final String OPEN_ID_URL = "https://graph.qq.com/oauth2.0/me?access_token=%s";// 获取用户信息的 URL,oauth_consumer_key 为 apiKeyprivate 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 IDprivate static final String APP_ID = "你的id";// QQ 互联应用管理中心的 APP Keyprivate 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);}//解析urlprivate 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.boot</groupId><artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>freemarker:template-loader-path: classpath:/templates/# 是否启用模板缓存。suffix: .ftlcache: false# 模板编码。charset: UTF-8# 是否检查模板位置是否存在。check-template-location: truecontent-type: text/html#是否启用freemarkerenabled: truemvc:view:prefix: /templates/suffix: .htmlstatic-path-pattern: /static/**

至此全文结束。欢迎点赞转发支持一波~~~

往期推荐

求职屡次被虐?务必拿走这300道面试宝藏题!

线下实操:搭建微服务天气预报应用!

分布式事务、分布式锁、分布式session

天天都会写接口,但它的用途和好处有多少人能说得清楚?

卧槽!竟然可以直接白嫖 Github Action 的 2C7G 服务器!

离职后与大家在星球聊了很多,你不来看看?

我的星球是否适合你?

点击阅读原文看看我们都聊过啥?

Java 实现第三方 QQ 账号登录相关推荐

  1. Java实现了第三方qq账号登录...

    文章目录 实现思路 QQ登录 总结 实现思路 创业初期 归结为创业初期是因为这个时候用户量比较少,甚至还没有接入上面所说的其他第三方的账户系统,只是自建的体系就可以满足,自建体系的话,目前常用的有 用 ...

  2. 【Android】第三方QQ账号登录的实现

    在APP开发过程中,时常会用到第三方账号登录体系. 下面,简要说明QQ的第三方登录体系在Android平台上的运用. 申请APPID 进入QQ互联的官网,http://connect.qq.com/ ...

  3. java string转jsonobject_超赞!终于有网友用Java实现了第三方qq账号登录

    Java面试笔试面经.Java技术每天学习一点 Java面试 关注不迷路 整理 | Java面试那些事儿 来源 | http://www.zuidaima.com/ 网站地址:https://conn ...

  4. python的flask实现第三方登录怎么写_Python语言的Flask框架应用程序实现使用QQ账号登录的方法...

    本文主要向大家介绍了Python语言的Flask框架应用程序实现使用QQ账号登录的方法,希望对大家学习Python语言有所帮助. Flask-OAuthlib是OAuthlib的Flask扩展实现, ...

  5. Java程序模拟QQ空间登录 - 并模拟刷说说的赞(图文) 注意:腾讯修改了加密算法,已失效(2015-01-31)

    Java程序模拟QQ空间登录 - 并模拟刷说说的赞 背景:在2013-10-25的一天,有个friend在QQ问我:"post登陆QQ空间抓取不到post的数据".于是故事就开始了 ...

  6. Python学习笔记7:实操案例四(支付密码的验证,模拟QQ账号登录,商品价格竞猜,星座看运势)

    Python学习笔记7:实操案例四(支付密码的验证,模拟QQ账号登录,商品价格竞猜,星座看运势) 1.支付密码的验证: 这个主要就是调用isdigit()函数判断字符串是不是全是数字组成. pwd=i ...

  7. tp框架实现第三方QQ快捷登录

    最近公司更新商城网站平台,原来基础上新增许多功能,接到任务实现第三方QQ快捷登录,功能已实现,今天特梳理一下.大致流程首先在开发者开放平台QQ互联注册应用,把你的域名空间注册,一般域名空间备过案的比较 ...

  8. 实现app第三方QQ授权登录

    关于QQ授权登录的实现,官网有详细描述,点击链接 . 这里根据自己的实现过程简单介绍一下整个过程: 1. 注册成为开发者,创建应用,获取appid,这个appid后面要用到.详情步骤请查看官网链接 2 ...

  9. laravel实现第三方qq一键登录

    首先composer安装依赖: composer require socialiteproviders/qq复制代码 注册服务提供者(同时注释掉原有的Socialite提供者): 'providers ...

最新文章

  1. enscape渲图按哪个键_手机输入法之争:九宫格和全键盘哪个更科学?
  2. mysql 编译_mysql 5.7 编译——VS2017
  3. 曲阜有学计算机的学校吗,曲阜职业中专计算机专业课程上几年
  4. 中国金控(00875):林裕豪调任执行董事并获任首席执行官
  5. scala spark 埋点统计_spark—1:WordCount(Python与Scala对照)
  6. mybatis 分页查询_MyBatis之分页查询:MyBatis PageHelper
  7. discovery_01
  8. Tracking 的SimTrack 以及 4D seg
  9. varnish几个工具命令行工作情况
  10. java实验6 词频统计_Java实现的词频统计——单元测试
  11. 中国女性补体面膜市场趋势报告、技术动态创新及市场预测
  12. Java进制间的转换
  13. Django常用命令
  14. Linux下的python.......安装
  15. ICLR 2019 Oral 论文 BigGAN 解读及源代码拆解
  16. 账户注销及用户信息删除的合规实务问答
  17. 苹果手机计算机隐藏照片app,‎App Store 上的“秘密计算器 - 隐藏私人照片和视频”...
  18. html5 图片粒子效果,Canvas + JavaScript 制作图片粒子效果
  19. 【Excel神技】之 区域命名
  20. JS屏蔽功能类(屏蔽F5,退格键,空格键......

热门文章

  1. nginx proxy_next_upstream导致的一个重复提交错误
  2. linux perl cpan 安装使用
  3. golang 写入文件 覆盖旧文件 将旧文件清空
  4. linux bashrc与profile的区别
  5. linux下几种反弹Shell方法的总结与理解
  6. NTP时间服务器简介
  7. 对 jiffies 溢出、回绕及 time_after 宏的理解
  8. 《UNIX环境编程》第十六章--网络IPC:套接字
  9. TCP/IP详解--第十八章
  10. mysql near_完美解决 ERROR 1064 (42000): You have an error in your SQL syntax ... near …