您的位置 首页 java

超赞!终于有网友用Java实现了第三方qq账号登录

# QQ互联注册一个账号

网站地址:,添加一个应用,具体怎么申请以及需要填写的信息,腾讯官网有详细文档。注册并完成相应信息填写后,可以在应用管理中查到应用的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.annotat io n.*;
import org.springframework.web. servlet .ModelAndView;
import org.springframework.web.servlet.mvc.support. redirect Attributes;

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 =
            "#34;;
    //获取token的URL
    private final static String ACCESS_TOKEN_URL = "#34;;
    // 获取用户 openid 的 URL
    private static final String OPEN_ID_URL = "#34;;
    // 获取用户信息的 URL,oauth_consumer_key 为 apiKey
    private static final String USER_INFO_URL = "#34;;
    // 下面的属性可以通过配置读取
    // QQ 在登陆成功后回调的 URL,这个 URL 必须在 QQ 互联里填写过
    private static final String CALLBACK_URL = "#34;;
    // 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.boot</groupId>
    <artifactId>spring-boot-starter-freemarker</artifactId>
</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/**  

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

文章来源:智云一二三科技

文章标题:超赞!终于有网友用Java实现了第三方qq账号登录

文章地址:https://www.zhihuclub.com/191509.shtml

关于作者: 智云科技

热门文章

评论已关闭

1条评论

  1. สล็อตสล็อตเว็บตรงตรงไม่ผ่านนายหน้าไม่มีอย่างต่ำเว็บเกมสล็อตออนไลน์เกมสล็อตแตกหนัก 2022 Slotเว็บตรงสล็อตออนไลน์ตรงไม่ผ่านเอเย่นต์ไม่มีอย่างน้อยเว็บเกมสล็อตออนไลน์ Slot Gameเชี่ยวชาญเล่นผ่านระบบออนไลน์ได้ง่าย
    เพียงท่านมีโทรศัพท์เครื่องเดียว
    เชื่อมต่ออินเตอร์เน็ตเพียงแค่นั้นเว็บพนันสล็อตที่เล่นได้ทุกวัยไม่ว่าท่านจะอยู่บ้าน ก็สามารถร่วมสนุกสนานกับ slot สล็อตออนไลน์เว็บหลักตรง ไม่ผ่านคนกลางที่พวกเราพร้อมบริการ
    เกมคาสิโนที่มีเกมมากนานัปการค่าย ให้ผู้เล่นได้เลือกเล่นกันง่ายๆสล็อตเว็บสล็อตออนไลน์ตรง ไม่ผ่านคนกลางไม่มีอย่างน้อย จะทำให้ท่านได้เจอกับประสบการณ์ใหม่ๆกับเราสล็อตสลับซับซ้อน โบนัสให้มากมายพร้อมให้บริการและก็มีคณะทำงานมากยิ่งกว่า200คนที่ดูแลผู้เล่นอยู่
    คณะทำงานของเรามีประสบการณ์มากยิ่งกว่า 2
    ปีสล็อตเว็บใหญ่ปัจจุบันไม่ว่าผู้เล่นจะเกิดปัญหาฝากเงินไม่มี อย่างน้อยหรือปรารถนาหารือเกี่ยวกับเกมสล็อตออนไลน์ หรือปัญหากับระบบคณะทำงานเราก็ทำได้แก้ไขได้อย่างเร็ว ทันใจแน่ๆแต่ว่าให้อย่าคลาดโอกาสดีๆกับเราโปรสมัครสมาชิกใหม่สล็อตเว็บเล่นสล็อตตรง โบนัสแตกหนักโปรสล็อตออนไลน์เยอะแยะรอท่าอยู่ สล็อตแตกหนักเว็บหลักสล็อตตรงไม่ผ่านคนกลางไม่มีอย่างต่ำเกมมาก Slot Gameมากไม่ว่าจะเป็นเกมสล็อต,Baccarat Online,กีฬา|กีฬาออนไลน์|เกมกีฬา|เกมกีฬาออนไลน์|บอล|ฟุตบอล
    และก็ฯลฯที่มีให้แด่ท่านนั้นได้บันเทิงใจกับเกม
    สล็อตเว็บสล็อตออนไลน์รวมค่ายเว็บหลักสล็อตออนไลน์ตรง ไม่ผ่านเอเย่นต์ พร้อมจังหวะการจ่ายเงินเดิมพันที่จะทำให้คุณนั้นลุ้นกันสนุกๆเกมสล็อตแตกง่ายไม่มีอย่างน้อยปัจจุบันSlot Onlineเล่นงานได้เงินจริง ท่านควรจะมีสติครั้งใดก็ตามเล่นSlot Onlineสล็อตเว็บตรงตรง ไม่ผ่านนายหน้าเว็บหลักสล็อตออนไลน์ตรง กำลังมาแรงแจกเครดิตฟรีสล็อตสล็อตเว็บตรงตรงกำลังเดินทางมาแรง เครดิตฟรีสล็อตผู้เล่นที่กำลังมองหาสล็อตเว็บหลักสล็อตออนไลน์ไม่มีขั้นต่ำเว็บพนันสล็อตของพวกเราตอบโจทย์สล็อตเครดิตฟรีเหมาะสมกับผู้เล่นที่ปรารถนาศึกษาเล่าเรียน
    รูปแบบการชนะ ฟิเจอร์เกมเพื่อผู้เล่นนั้นรู้เรื่องตัวเกม ต้นแบบเกมว่าจะต้องเล่นSlotเว็บใหญ่สล็อตออนไลน์ตรง ไม่ผ่านคนกลางแบบไหนนับว่าเป็นเทคนิคเล็กๆของเกมนั้นจะก่อให้ผู้เล่นนั้นเชื่อมั่นทุกการจ่ายเงินเดิมพันมากขึ้นเรื่อยๆมีใบรับรองโอกาสชนะก็จะมากขึ้นอีกต้วย
    เล่นให้คุ้นชินรู้เรื่องให้มากมายแจกฟรีเครดิต 2022 เล่นได้ทุกGameไม่ว่าจะเป็นเกมใหม่ๆที่พวกเราได้เก็บมาให้ทุกสัปดาห์หรือเกมมันยอดฮิตก็เชี่ยวชาญร่วมบันเทิงใจกันได้กับสล็อตแตกง่าย 2022โดยไม่ต้องฝากเงินเข้าสู่ระบบของเราก่อนเลย และไม่จำเป็นต้องใช้เงินของนักเดิมพันเองท่านจะได้พบกับประสบการณ์ที่ท่านอาจไม่เคยเผชิญที่ไหนมาก่อนของพวกเราให้ทุกคนนั้นตรึงใจแน่ๆ โปรโมชั่นมีให้ไม่อั้นเพื่อเพิ่มความสนุกสนานไปอีกขั้นกับสล็อตออนไลน์เว็บเดิมพันสล็อตตรง
    ลิขสิทธิ์แท้ ค่ายSlot Onlineเยอะแยะเว็บพนันสล็อตตรงลิขสิทธิ์แท้
    ค่ายSlot Gameมากมาย พวกเรามีทีมงานคัดสรรค์GameSlotOnlineเว็บใหญ่สล็อตตรง ไม่ผ่านคนกลาง ไม่มีอย่างต่ำ เยอะแยะมีแต่เกมมันๆGameที่การันสนุกสนาน พร้อมสูตรSlot 2022
    คำนวณด้วยระบบ AI 100% เพิ่มช่องทางเอาชนะการเล่นสล็อตเว็บพนันสล็อตแท้ ไม่มีอย่างน้อยแล้วก็เราได้มีการอัพเดตเกมใหม่ๆอยู่เสมอพวกเรามีเกมมากมายก่ายกองมากกว่า สองพันGameจากค่ายดังไม่ว่าจะเป็นพีจีสล็อตSLOTJOKER XOสล็อตรวมทั้งฯลฯพร้อมให้บริการผู้เล่นไม่ว่าท่านจะอยู่ที่มุมไหนของโลกกันเลยสล็อตแตกง่าย 2022กับGameที่มีเทคนิคมากมาย การหมุนให้ครบทั้งหมดทั้งปวงโดยประมาณเคล็ดวิธีง่ายๆใครก็เล่นได้

    my web page;

网站地图