设为首页收藏本站
查看: 3059|回复: 0

[前端开发] 用Java实现了第三方qq账号登录..

[复制链接]
  • TA的每日心情
    开心
    2022-8-26 13:20
  • 签到天数: 345 天

    [LV.8]以坛为家I

    发表于 2021-9-14 10:53:06 | 显示全部楼层 |阅读模式

    # QQ互联注册一个账号

    网站地址:https://connect.qq.com/,添加一个应用,具体怎么申请以及需要填写的信息,腾讯官网有详细文档。注册并完成相应信息填写后,可以在应用管理中查到应用的APP ID和APP Key。(注,这个申请还是比较麻烦的,注意,域名必须备案,而且名称必须与备案名称相同)成功后如下图:


    还需要添加一个回调地址(域名地址按照你的项目而定),如下图:

    用Java实现了第三方qq账号登录..
    加入jar包

    1. <!-- 第三方QQ登录 -->
    2. <dependency>
    3.     <groupId>com.qq</groupId>
    4.     <artifactId>Sdk4J</artifactId>
    5.     <version>2</version>
    6. </dependency>
    复制代码

    登录页面

    用Java实现了第三方qq账号登录..
    Controller编写

    1. package com.gbq.boot.web.controller;

    2. import cn.hutool.core.util.StrUtil;
    3. import com.alibaba.fastjson.JSONObject;
    4. import com.gbq.boot.web.bean.User;
    5. import com.gbq.boot.web.comment.qqLoginComment.AuthComment;
    6. import com.gbq.boot.web.service.UserService;
    7. import org.springframework.web.bind.annotation.*;
    8. import org.springframework.web.servlet.ModelAndView;
    9. import org.springframework.web.servlet.mvc.support.RedirectAttributes;

    10. import javax.annotation.Resource;
    11. import javax.servlet.http.HttpServletResponse;


    12. /**
    13. * 登录Controller
    14. * @author 阿前
    15. * 2019年1月4日09:48:21
    16. */
    17. @RestController
    18. @RequestMapping("/login")
    19. public class LoginController {

    20.     @Resource
    21.     private UserService userService;
    22.     @Resource
    23.     private AuthComment authComment;


    24.     @RequestMapping("/index")
    25.     public ModelAndView index(@ModelAttribute("user") User user) {
    26.         return new ModelAndView("/shop/index","user",user);
    27.     }


    28.     @RequestMapping("/login.html")
    29.     public ModelAndView toLogin() {
    30.         return new ModelAndView("login");
    31.     }

    32.     @RequestMapping("/qqLogin")
    33.     public void qqLogin(HttpServletResponse response)throws Exception{
    34.         //随机产生字符串
    35.         String state = StrUtil.uuid();
    36.         String url = authComment.getAuthUrl(state);
    37.         System.out.println(url);
    38.         //重定向
    39.         response.sendRedirect(url);
    40.     }


    41.     @GetMapping("/redirect")
    42.     public ModelAndView getData(@RequestParam(value = "code") String code, RedirectAttributes model){

    43.         //获取token
    44.         String accessToken = authComment.getAccessToken(code);
    45.         System.out.println("accessToken"+accessToken);

    46.         //获取openId
    47.         String openId = authComment.getOpenId(accessToken);
    48.         System.out.println("openId"+openId);

    49.         //获取用户信息
    50.         JSONObject userInfo = authComment.getUserInfo(accessToken, openId);
    51.         String myName = userInfo.getString("nickname");
    52.         User user = new User(null, "","111111",myName, System.currentTimeMillis(),"是",
    53.                 userInfo.getString("figureurl_2"), userInfo.getString("gender")
    54.                 ,1,1,"", "", openId);

    55.         //通过openId查询
    56.         User usr = userService.findUsrByOpenId(openId);
    57.         if (null != usr){
    58.             user.setId(usr.getId());
    59.             userService.updateById(user);
    60.         }else {
    61.             userService.insert(user);
    62.         }
    63.         model.addFlashAttribute("user", user);
    64.        //重定向
    65.         return new ModelAndView("redirect:/login/index");
    66.     }


    67. }
    复制代码


    AuthComment类编写

    1. package com.gbq.boot.web.comment.qqLoginComment;

    2. import com.alibaba.fastjson.JSON;
    3. import com.alibaba.fastjson.JSONObject;
    4. import org.springframework.stereotype.Component;

    5. import java.io.IOException;
    6. import java.io.InputStream;
    7. import java.net.HttpURLConnection;
    8. import java.net.URL;
    9. import java.util.regex.Matcher;
    10. import java.util.regex.Pattern;

    11. import static org.apache.commons.io.IOUtils.toByteArray;

    12. @Component
    13. public class AuthComment {

    14.     //QQ 登陆页面的URL
    15.     private final static String AUTHORIZATION_URL =
    16.             "https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id=%s&redirect_uri=%s&scope=%s";
    17.     //获取token的URL
    18.     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";
    19.     // 获取用户 openid 的 URL
    20.     private static final String OPEN_ID_URL = "https://graph.qq.com/oauth2.0/me?access_token=%s";
    21.     // 获取用户信息的 URL,oauth_consumer_key 为 apiKey
    22.     private static final String USER_INFO_URL = "https://graph.qq.com/user/get_user_info?access_token=%s&oauth_consumer_key=%s&openid=%s";
    23.     // 下面的属性可以通过配置读取
    24.     // QQ 在登陆成功后回调的 URL,这个 URL 必须在 QQ 互联里填写过
    25.     private static final String CALLBACK_URL = "http://127.0.0.1:8080/login/redirect";
    26.     // QQ 互联应用管理中心的 APP ID
    27.     private static final String APP_ID = "你的id";
    28.     // QQ 互联应用管理中心的 APP Key
    29.     private static final String APP_SECRET = "你的key";


    30.     /**
    31.      * QQ 登陆页面的URL
    32.      * @param scope
    33.      * @return
    34.      */
    35.     public String getAuthUrl(String scope) {
    36.         return String.format(AUTHORIZATION_URL, APP_ID, CALLBACK_URL, scope);
    37.     }

    38.     /**
    39.      * 获取Access Token值
    40.      */
    41.     public String getAccessToken(String code){
    42.         String ur = String.format(ACCESS_TOKEN_URL, APP_ID, APP_SECRET,code, CALLBACK_URL);
    43.         String compile = "access_token=(\\w*)&";
    44.         String result = this.getUrl(ur);
    45.         return this.getMatcher(result,compile);
    46.     }

    47.     /**
    48.      * 获取openId
    49.      * @param accessToken
    50.      * @return
    51.      */
    52.     public String getOpenId(String accessToken) {
    53.         String url = String.format(OPEN_ID_URL, accessToken);
    54.         String compile = "openid":"(\\w*)"";
    55.         String result = this.getUrl(url);
    56.         return this.getMatcher(result,compile);
    57.     }

    58.     /**
    59.      * 获取qq用户信息
    60.      * @param accessToken
    61.      * @param openId
    62.      * @return
    63.      */
    64.     public JSONObject getUserInfo(String accessToken, String openId) {
    65.         String url = String.format(USER_INFO_URL, accessToken, APP_ID, openId);
    66.         String result = this.getUrl(url);
    67.         return JSON.parseObject(result);
    68.     }

    69.     private String getMatcher(String result,String compile) {
    70.         //使用正则表达式解析网址
    71.         Pattern p = Pattern.compile(compile);
    72.         Matcher m = p.matcher(result);
    73.         m.find();
    74.         return m.group(1);
    75.     }

    76.     //解析url
    77.     private String getUrl(String ur) {
    78.         try {
    79.             URL url = new URL(ur);
    80.             HttpURLConnection conn = null;
    81.             conn = (HttpURLConnection) url.openConnection();
    82.             conn.setConnectTimeout(5 * 1000);
    83.             conn.setRequestMethod("GET");
    84.             InputStream inStream = conn.getInputStream();
    85.             byte[] data = toByteArray(inStream);
    86.             String result = new String(data, "UTF-8");
    87.             System.out.println(result);
    88.             return result;
    89.         } catch (IOException e) {
    90.             e.printStackTrace();
    91.         }
    92.         return  null;
    93.     }

    94. }
    复制代码


    此处不再编写userService

    成功会返回json串

    其中主要需要的是,nickname——qq名称,figureurl_qq_x——不同尺寸的qq头像,等等等等!

    登录成功跳转到页面


    成功后的页面index

    1. <span>欢迎你,${user.name}</span>
    复制代码

    feemarker配置

    注意我使用的是freemarker模板,给大家贴上freemarker配置,已经mvc配置

    1. <dependency>
    2.     <groupId>org.springframework.boot</groupId>
    3.     <artifactId>spring-boot-starter-freemarker</artifactId>
    4. </dependency>freemarker:
    5.   template-loader-path: classpath:/templates/
    6.   # 是否启用模板缓存。
    7.   suffix: .ftl
    8.   cache: false
    9.   # 模板编码。
    10.   charset: UTF-8
    11.   # 是否检查模板位置是否存在。
    12.   check-template-location: true
    13.   content-type: text/html
    14.   #是否启用freemarker
    15.   enabled: true

    16. mvc:
    17.   view:
    18.     prefix: /templates/
    19.     suffix: .html
    20.   static-path-pattern: /static/**
    复制代码

    您需要登录后才可以回帖 登录 | 注册

    本版积分规则

    红盟社区--红客联盟 

    Processed in 0.057481 second(s), 24 queries.

    站点统计| 举报| Archiver| 手机版| 黑屋 |   

    备案号:冀ICP备20006029号-1 Powered by HUC © 2001-2021 Comsenz Inc.

    手机扫我进入移动触屏客户端

    关注我们可获取更多热点资讯

    Honor accompaniments. theme macfee

    快速回复 返回顶部 返回列表