1. 程式人生 > 程式設計 >SpringBoot整合QQ第三方登陸的實現

SpringBoot整合QQ第三方登陸的實現

一、什麼是第三方登入,第三方登陸平臺如何選擇

1.簡介

第三方登入不得不說的一個優勢:那就是本地註冊和第三方註冊的選擇。雖然這是一個不能稱之為問題的問題,其中的心理學不得不說:做為一個app的新使用者,你有兩個選擇:1.做一個很受歡迎的使用者,註冊帳號,完善資訊,over。2.選用第三方登入/註冊,簡單方便。二者供你選擇,隨心挑選。

2.普通註冊分多種情況:

1.傳統的註冊方式,註冊門檻較高,易在註冊頁面流失使用者。 2.第三方登入後,隨機分配一個id 3.郵件註冊,id手動填寫並且不能重複 App開發過程中登入的選擇還是視情況而定。

3.使用者眼中的第三方登陸

第三方登入簡單快捷,每天面對不同的平臺不同的登入介面能有一種簡單登入的方式再好不過了。第三方登入可以將自己在某個app的動態資訊同步到各個sns平臺,這一功能無疑攬了一大批“懶”使用者,瀟瀟灑灑一號走江湖。不免擔心的是第三方登入有很多資料資訊可以公用,比較保守的人就慎重了,網際網路時代,資訊也保密不到哪去。

4.本地客戶端眼中的第三方登入

簡化登入過程,降低註冊門檻,更能獲取海量使用者,在爭搶使用者,提高使用者轉化率註冊量是不可缺少的重要因素。本地註冊的穩定+第三方登入的便捷才是最合適的登入方案。

5.第三方登入平臺該如何選擇

謂的第三方登入,就是利用使用者在第三方平臺上已有的賬號來快速完成自己應用的登入或者註冊的功能。而這裡的第三方平臺,一般是已經有大量使用者的平臺,如國內關注度較高的騰訊QQ互聯平臺 、百度第三方賬號登陸,一登人臉登入等等。更多關於第三方登入,第三方登入平臺,第三方登入SDK,整合過程及開發建議可百度“開發者服務”學習。

好了,上面說了這麼多,也是無濟於事,我們開始我們的正餐

二、QQ第三方平臺介紹:

1.基本要求:

我們需要有自己的伺服器

我們需要自己的域名(且已備案)

如果上面的要求沒有到達,那就趕快去實現吧。。。。

2.平臺介紹:

2.1進入官網首頁:
https://connect.qq.com/index.html

2.2稽核資訊:(需要提交資訊稽核)

SpringBoot整合QQ第三方登陸的實現

2.3建立網站應用

SpringBoot整合QQ第三方登陸的實現

2.4建立成功(需要稽核通過後才能使用)

SpringBoot整合QQ第三方登陸的實現

2.5檢視資訊

SpringBoot整合QQ第三方登陸的實現

OKOK,到這一步我們的介紹資訊就完成了,起始跟程式碼一點關係還沒有。

我們前提工作要做哈。基礎搭建好,根基才穩。。。:tw-1f38e: :tw-1f38f:

三、實戰教程

1.基礎配置:

1.1首先還是我們的關心的POM檔案(只添加了QQ的依賴)

 <!-- QQ登入依賴包 -->
    <dependency>
      <groupId>net.gplatform</groupId>
      <artifactId>Sdk4J</artifactId>
      <version>2.0</version>
    </dependency>

1.2 application.yml檔案:
這裡就不用列出來了,只配置了一個埠:server.port=80

1.3 qqconnectconfig.properties(qq登陸相關的配置檔案)

  app_ID =(這裡就是你的應用的APPID)
  app_KEY =(這裡就是你的應用的APPKEY)
  redirect_URI =(這裡是你設定的回撥地址)
  scope = get_user_info,add_topic,add_one_blog,add_album,upload_pic,list_album,add_share,check_page_fans,add_t,add_pic_t,del_t,get_repost_list,get_info,get_other_info,get_fanslist,get_idollist,add_idol,del_ido,get_tenpay_addr(\u8BF7\u4FEE\u6539\u6B64\u5904)
  baseURL = https://graph.qq.com/
  getUserInfoURL = https://graph.qq.com/user/get_user_info
  accessTokenURL = https://graph.qq.com/oauth2.0/token
  authorizeURL = https://graph.qq.com/oauth2.0/authorize
  getOpenIDURL = https://graph.qq.com/oauth2.0/me
  addTopicURL = https://graph.qq.com/shuoshuo/add_topic
  addBlogURL = https://graph.qq.com/blog/add_one_blog
  addAlbumURL = https://graph.qq.com/photo/add_album
  uploadPicURL = https://graph.qq.com/photo/upload_pic
  listAlbumURL = https://graph.qq.com/photo/list_album
  addShareURL = https://graph.qq.com/share/add_share
  checkPageFansURL = https://graph.qq.com/user/check_page_fans
  addTURL = https://graph.qq.com/t/add_t
  addPicTURL = https://graph.qq.com/t/add_pic_t
  delTURL = https://graph.qq.com/t/del_t
  getWeiboUserInfoURL = https://graph.qq.com/user/get_info
  getWeiboOtherUserInfoURL = https://graph.qq.com/user/get_other_info
  getFansListURL = https://graph.qq.com/relation/get_fanslist
  getIdolsListURL = https://graph.qq.com/relation/get_idollist
  addIdolURL = https://graph.qq.com/relation/add_idol
  delIdolURL = https://graph.qq.com/relation/del_idol
  getTenpayAddrURL = https://graph.qq.com/cft_info/get_tenpay_addr
  getRepostListURL = https://graph.qq.com/t/get_repost_list
  version = 2.0.0.0

我們只需要修改上面的前三個就可以哦,其他可以不同改動。。。

2.程式碼實現

2.1LoginController

我們只需要寫好我們的介面就完成了。。。

package com.fc.blog.controller.blog;

import com.qq.connect.QQConnectException;
import com.qq.connect.api.OpenID;
import com.qq.connect.api.qzone.UserInfo;
import com.qq.connect.javabeans.AccessToken;
import com.qq.connect.javabeans.qzone.UserInfoBean;
import com.qq.connect.oauth.Oauth;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.Map;

/**
 * 使用者登陸
 */
@Controller
@RequestMapping("fc")
public class LoginController {

  private static final Logger LOGGER = LoggerFactory.getLogger(LoginController.class);

  /**
   * 請求QQ登陸頁面
   * @param request
   * @param response
   * @return
   */
  @GetMapping("qq")
  public void loginByQQ(HttpServletRequest request,HttpServletResponse response){

    response.setContentType("text/html;charset=utf-8");

    try {

      response.sendRedirect(new Oauth().getAuthorizeURL(request));

      LOGGER.info("請求QQ頁面中。。。。");

    } catch (QQConnectException | IOException e) {

      e.printStackTrace();

      LOGGER.error("請求QQ頁面失敗");

    }
  }

  /**
   * @Description QQ登入的回撥方法
   * @Author xw
   * @Date 11:25 2020/2/21
   * @Param [request,response,map]
   * @return java.lang.String
   **/
  @RequestMapping("connection")
  public String connection(HttpServletRequest request,HttpServletResponse response,Map<String,Object> map) {

    try {

      AccessToken accessTokenObj = (new Oauth()).getAccessTokenByRequest(request);

      String accessToken = null,openID = null;

      long tokenExpireIn = 0L;

      if ("".equals(accessTokenObj.getAccessToken())) {

        LOGGER.error("登入失敗:沒有獲取到響應引數");

        return "redirect:/";

      } else {

        accessToken = accessTokenObj.getAccessToken();

        tokenExpireIn = accessTokenObj.getExpireIn();

        LOGGER.info("accessToken" + accessToken);

        request.getSession().setAttribute("demo_access_token",accessToken);

        request.getSession().setAttribute("demo_token_expirein",String.valueOf(tokenExpireIn));

        // 利用獲取到的accessToken 去獲取當前用的openid -------- start

        OpenID openIDObj = new OpenID(accessToken);

        openID = openIDObj.getUserOpenID();

        UserInfo qzoneUserInfo = new UserInfo(accessToken,openID);

        UserInfoBean userInfoBean = qzoneUserInfo.getUserInfo();

        if (userInfoBean.getRet() == 0) {

          String name = removeNonBmpUnicode(userInfoBean.getNickname());

          String imgUrl = userInfoBean.getAvatar().getAvatarURL100();

          HttpSession session = request.getSession();

          session.setAttribute("openId",openID);

          session.setAttribute("name",name);

          session.setAttribute("imgUrl",imgUrl);

          return "redirect:/";

        } else {

          LOGGER.error("很抱歉,我們沒能正確獲取到您的資訊,原因是: " + userInfoBean.getMsg());

          return "admin/404";
        }
      }
    } catch (QQConnectException e) {

      e.printStackTrace();

      LOGGER.error("QQ登陸失敗");

      return "admin/404";
    }
  }
  /**
   * @Description 處理掉QQ網名中的特殊表情
   * @Author xw
   * @Date 11:26 2020/2/21
   * @Param [str]
   * @return java.lang.String
   **/
  public String removeNonBmpUnicode(String str) {
    if (str == null) {
      return null;
    }
    str = str.replaceAll("[^\\u0000-\\uFFFF]","");
    if ("".equals(str)) {
      str = "($ _ $)";
    }
    return str;
  }

}

2.2程式碼講解:

2.2.1 QQ登陸介面: /fc/qq

http://域名/fc/qq

這個介面是跳轉QQ登陸介面------》當我們點選QQ登陸按鈕或者是超連結都可以跳轉到我們的QQ登陸介面,登陸成功後會自動進入到我們的回撥地址進行授權

2.2.2 回撥地址: /fc/connection

這裡需要特殊說明,這個回撥地址需要和你的建立應用的地址一致

SpringBoot整合QQ第三方登陸的實現

在這裡我們的程式碼就完成了,是不是很簡單呢,是的,那些方法都是封裝好了的,我們只需要呼叫就是了。。。。

四、最後補充

1.實現這個QQ登陸操作需要把專案上傳到我們的伺服器上執行
2.可能你們設定的回撥帶有埠,那麼就需要在伺服器上安裝Nginx,反向代理到我們的回撥方法

到此這篇關於SpringBoot整合QQ第三方登陸的實現的文章就介紹到這了,更多相關SpringBoot整合QQ第三方登陸內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!