超讚!用Java實現了第三方qq帳號登錄...

2021-02-13 傳智匯

作者:人間蒸發

來源:zuidaima.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 {

    @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

注意我使用的是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 帳號登錄...
    公眾號關注 「菜鳥要飛」來源 | uidaima.com/blog/4725615031700480.htmQQ互聯註冊一個帳號-- 第三方QQ登錄 --><dependency>    <groupId>com.qq</groupId>    <artifactId>Sdk4J</artifactId>    <version>2</version></dependency>
  • Java 實現第三方 QQ 帳號登錄
    來源 | uidaima.com/blog/4725615031700480.htmQQ互聯註冊一個帳號網站地址:https://connect.qq.com/,添加一個應用,具體怎麼申請以及需要填寫的信息,騰訊官網有詳細文檔。註冊並完成相應信息填寫後,可以在應用管理中查到應用的APP ID和APP Key。
  • 超讚!終於有網友用Java實現了第三方qq帳號登錄...
    # QQ互聯註冊一個帳號網站地址
  • 黑客QQ教程,第三方帳號登錄!
    QQ互聯註冊一個帳號網站地址:https://connect.qq.com/,添加一個應用,具體怎麼申請以及需要填寫的信息,騰訊官網有詳細文檔。註冊並完成相應信息填寫後,可以在應用管理中查到應用的APP ID和APP Key。
  • PHP實現QQ登錄的原理和實現過程
    (商務合作聯繫QQ號:2230304070)http://www.jb51.net/article/134362.htm第三方登錄,就是使用大家比較熟悉的比如QQ、微信、微博等第三方軟體登錄自己的網站,這可以免去註冊帳號、快速留住用戶的目的,免去了相對複雜的註冊流程
  • SpringBoot實現QQ郵箱註冊和登錄
    1、登錄註冊思路 這是一個使用spring boot做的一個qq郵箱註冊和登錄的項目。 沒寫前端頁面,使用postman測試。有截圖詳細。
  • 微信第三方實現一鍵登錄及獲取用戶信息的方法(PHP版)
    (商務合作聯繫QQ號:2230304070)http://www.jb51.net/article/94717.htm本文實例講述了PHP版微信第三方實現一鍵登錄及獲取用戶信息的方法。分享給大家供大家參考,具體如下:注意,要使用微信在第三方網頁登錄是需要「服務號」才可以哦,所以必須到官方申請。
  • 解析新第三方登錄方式——蘋果登錄「Sign in with Apple」
    Apple登錄,指的就是通過Apple ID登錄第三方應用與網站,那麼它究竟是如何實現與設計的呢?本文將展開詳細的分析說明。現在,蘋果的APP都需要在第三方登錄這裡接入「 Apple 登錄」(Sign in with Apple),這篇文章給大家解析說明下蘋果登錄是什麼,以及如何實現和設計的問題,接下來帶大家一起來看看,希望能給產品和設計的朋友提供參考。
  • APP第三方登錄入口接入:Sign in with Apple
    要求所有使用 第三方登錄 的 App,都 必須接入Sign in with Apple。符合以下條件的 App,可以不接入:使用自建帳戶和登錄系統;要求用戶使用現有的教育或企業帳戶登錄的教育、企業或商業類應用;使用政府或行業支持的公民身份識別系統或電子 ID 來驗證用戶;應用特定於第三方服務,用戶需要使用郵箱、社交媒體或其它第三方帳戶才能訪問其內容的應用
  • 華爾街日報:Twitter有14%的活躍用戶從不登錄 均授權登錄第三方網站
    儘管公司第二季度財報看起來這兩方面都超出預期:營收實現翻一番多,而月活躍用戶量環比增長加速,但在這背後一直存在一個隱憂。華爾街日報在一篇報導中拋出了這樣一個數據:在 Twitter 的 2.71 億活躍用戶當中,約有 14%(約 3790 萬人)從未直接登錄 Twitter.com 或者移動 App,這些人只是使用 Twitter 帳號來登錄其他第三方應用:比如利用 Flipboard 來閱讀 Twitter 內容,通過 Instagram 來分享 Twitter 上的圖片,通過 Foursquare
  • 基於 Spring Boot + Vue.js + MySQL 的 QQ 登陸實戰
    OAuth2.0 是一個開放協議的標準,該標準允許用戶讓第三方應用訪問該用戶在某一網站上存儲的私密資源(如頭像、照片、視頻等),而在這個過程中無需將用戶名和密碼提供給第三方應用。實現這一功能是通過提供一個令牌(token),而不是使用用戶名和密碼來訪問他們存放在特定服務提供者的數據。採用令牌(token)的方式可以讓用戶靈活的對第三方應用授權或者收回權限。
  • Sign In with Apple - 使用蘋果帳號登錄你的應用
    符合以下條件的 App,可以不接入:• 使用自建帳戶和登錄系統;• 要求用戶使用現有的教育或企業帳戶登錄的教育、企業或商業類應用;• 使用政府或行業支持的公民身份識別系統或電子 ID 來驗證用戶;• 應用特定於第三方服務,用戶需要使用郵箱、社交媒體或其它第三方帳戶才能訪問其內容的應用;已經上架的 App 需在 2020 年
  • 實現新浪微博登錄接口的申請及使用流程(PHP版)
    d=66本次把我使用第三方新浪微博登錄接口的經驗來跟大家分享一下,希望對大家有所幫助,尤其對沒是使用過新浪微博登錄接口的用戶使用新浪微博登錄接口也需要得到新浪微博的認可,所以也需要 微博開發平臺 實現四步驟就行了,開發者註冊-》創建應用-》完善應用資料-》提交審核。等提交審核完成後就可以開發這一塊了。以下是具體步驟。
  • 騰訊:第三方偽造QQ登錄頁面 存在盜號風險
    通過手機號、QQ號、微信號等已有帳戶,無需註冊直接登錄第三方服務,這種非常便捷的登陸方式已經十分普及,但一定要認清登錄頁面是否屬於QQ官方,否則是相當危險的,很容易被人鑽空子。騰訊QQ發布公告稱, 7月12日起,騰訊QQ陸續接到多位用戶舉報,發現有部分非法連結偽造QQ空間登錄頁面,而且存在盜號風險。 騰訊表示, 這類連結疑似因為存在漏洞而被黑產利用,QQ安全團隊已進行攔截處理。
  • Facebook發布匿名登錄第三方應用功能
    該新功能名為「匿名登錄」。據稱Facebook表示,Facebook的新功能適用於想要試用應用但不想將個人信息交給開發者的用戶,讓用戶可以在購買應用之前進行試用。  Facebook CEO馬克·扎克伯格(Mark Zuckerberg)在F8大會上指出,「它可讓你放心試用應用。」
  • 「網警提醒」在第三方登錄過12306信息的旅客 馬上改密碼!
    這時,有不少網友選擇了通過第三方購票網站進行「搶票」。而目前,這些第三方購票網站代理購買火車票的方式主要分為兩種:1、登錄12306帳號購票,需要在該App中輸入12306帳號及密碼。2、委託平臺來買票,通過在APP上直接購買,免登錄12306網站。無論哪種方式,如果這些第三方平臺未做好防護工作,很可能會造成用戶個人信息洩露,包括不限於12306帳號及密碼,乘車人的身份信息。
  • 一號多用,魅族Flyme帳號能幹啥?
    雖然有些帳號是可以通過QQ、微博這些常用軟體的帳號綁定登錄的,但還是需要第三方的登錄。但是如果手機ROM採用同一帳號,打通所有應用的話是不是更加的簡單便捷了呢?為了幫助用戶解決這些困擾,魅族Flyme帳號已經實現了一號多用,來看看它都能幹啥?
  • Facebook第三方網站登錄功能或令用戶數據面臨洩露風險
    騰訊證券訊 據普林斯頓大學信息技術政策中心主辦的博客網站Freedom to Tinker報導,該博客的研究員Steven Englehardt及其他兩名研究人員發布安全研究報告稱,如果用戶使用「login with Facebook」(用Facebook帳號登錄)的功能來登入一個網站或應用
  • 社交網站登錄表單設計
    許多研究表明社交登錄表單是非常有益而便捷的。比如這個跑步應用,當你註冊完畢後它會跟蹤你的跑步活動。而你的登錄方式可以直接使用第三方社交平臺登錄。跑步結果你可以分享到社交平臺,一來二去,互惠互利。)減少重新登錄時的失敗次數(使用此舉直接不用再另外輸入密碼,省事兒省心)垃圾郵件保護機制(使用社交帳號登錄直接減緩了垃圾郵件的產生,因為郵件的發送需要實現進行第三方驗證) 僅允許使用社交帳號登錄的情況有時候某些網站僅允許用戶使用社交帳號登錄。
  • 手機QQ怎樣切換/登錄/退出帳號
    手機QQ登錄後,現在的手機QQ軟體一般都是自動保存登錄後的QQ密碼自動登陸,而想要退出手機當前的QQ帳號,登錄別的QQ帳號不知道怎麼處理,那到底該如何處理呢!雙擊手機界面中的QQ圖標,如下圖進入到手機QQ界面,如下圖選擇手機QQ界面中的【設置】,來到【設置】界面,如下圖來到【設置】界面後,點擊自己的QQ頭像圖片,如下圖接著彈出【帳號管理】界面,如下圖在【帳號管理】界面中我們可以選擇自己想要登錄的QQ帳號,如下圖如果要登錄【帳號管理】界面中沒有的QQ帳號,則可以通過界面中的