1. 程式人生 > 實用技巧 >QQ授權登入

QQ授權登入

一、你得先去QQ授權登入官網申請開發者(登入之後右上角頭像點選一下填寫申請資訊)
二、開發者稽核通過之後建立應用
PS:
1、網站名稱必須和後面繫結的域名備案名稱完全一致!!!!不然稽核不通過,提示與備案資訊不一致
2、網站首頁必須放置QQ登入的按鈕,然後點選之後要跳轉到授權頁面,即使沒有稽核通過也要有反應,哪怕是錯誤的頁面,例如下圖即可

三、網站應用稽核通過之後就可以根據PAI文件開發授權登入啦
1、生成授權連線
2、使用者授權登入後根據回撥的code獲取AccessToken
3、再根據AccessToken獲取OpenId
4、再根據AccessToken和OpenId獲取使用者資訊,具體返回的資訊可參考API文件

程式碼參考如下圖

QQLoginHelper 幫助類

public class QQLoginHelper
{
public static string appId = ""; //申請QQ登入成功後,分配給應用的appid。
public static string appKey = ""; //申請QQ登入成功後,分配給應用的appkey。
public static string redirect_uri = ""; //成功授權後的回撥地址,必須是註冊appid時填寫的主域名下的地址。

    /// <summary>
    /// 生成授權連線
    /// </summary>
    /// <param name="state"></param>
    /// <param name="deviceType"></param>
    /// <returns></returns>
    public static string CreateAuthorizeUrl(string state, string deviceType)
    {
        string url = string.Format("{0}?client_id={1}&response_type=code&redirect_uri={2}&state={3}&display={4}&scope=scope", "https://graph.qq.com/oauth2.0/authorize", appId, redirect_uri, state, deviceType);
        return url;
    }

    /// <summary>
    /// 根據回撥獲取AccessToken
    /// </summary>
    /// <param name="code"></param>
    /// <returns></returns>
    public static string GetAccessToken(string code)
    {
        string url = string.Format("https://graph.qq.com/oauth2.0/token?grant_type={0}&client_id={1}&client_secret={2}&code={3}&redirect_uri={4}", "authorization_code", appId, appKey, code, redirect_uri);
        string result = HttpMethodHelper.HttpGet(url);
        string AccessToken = CutString(result, "access_token=", "&expires_in=");
        string ExpiresIn = CutString(result, "&expires_in=", "&refresh_token=");
        string RefreshToken = result.Split(new string[] { "&refresh_token=" }, StringSplitOptions.None)[1];
        return AccessToken;
    }

    /// <summary>
    /// 根據回撥獲取OpenId
    /// </summary>
    /// <param name="access_token"></param>
    /// <returns></returns>
    public static string GetOpenId(string access_token)
    {
        string url = string.Format("https://graph.qq.com/oauth2.0/me?access_token={0}", access_token);
        string result = HttpMethodHelper.HttpGet(url);
        string client_id = CutString(result, @"client_id"":""", @""",");
        string openid = CutString(result, @"openid"":""", @"""}");
        return openid;
    }

    /// <summary>
    /// 獲取使用者資訊轉換為實體
    /// </summary>
    /// <param name="access_token"></param>
    /// <param name="openid"></param>
    /// <returns></returns>
    public static QQUserInfo GetQQUserInfo(string access_token, string openid)
    {
        string url = string.Format("https://graph.qq.com/user/get_user_info?access_token={0}&oauth_consumer_key={1}&openid={2}", access_token, appId, openid);
        string result = HttpMethodHelper.HttpGet(url, Encoding.UTF8);
        QQUserInfo qqUserInfo = JsonConvert.DeserializeObject<QQUserInfo>(result);
        return qqUserInfo;
    }

    /// <summary>
    /// 獲取使用者資訊JSON字串
    /// </summary>
    /// <param name="access_token"></param>
    /// <param name="openid"></param>
    /// <returns></returns>
    public static string GetQQUserInfoJsonStr(string access_token, string openid)
    {
        string url = string.Format("https://graph.qq.com/user/get_user_info?access_token={0}&oauth_consumer_key={1}&openid={2}", access_token, appId, openid);
        string result = HttpMethodHelper.HttpGet(url, Encoding.UTF8);
        return result;
    }
    public static QQUserInfo GetQQUserInfoTest()
    {
        string url = string.Format("https://graph.qq.com/user/get_user_info?access_token={0}&oauth_consumer_key={1}&openid={2}", "", appId, "");
        string result = HttpMethodHelper.HttpGet(url, Encoding.UTF8);
        QQUserInfo qqUserInfo = JsonConvert.DeserializeObject<QQUserInfo>(result);
        return qqUserInfo;
    }



    /// <summary>
    /// 擷取字串中兩個字串中的字串
    /// </summary>
    /// <param name="str">字串</param>
    /// <param name="startStr">開始字串</param>
    /// <param name="endStr">結束字串</param>
    /// <returns></returns>
    public static string CutString(string str, string startStr, string endStr)
    {
        int begin, end;
        begin = str.IndexOf(startStr, 0) + startStr.Length; //開始位置   
        end = str.IndexOf(endStr, begin);            //結束位置     
        return str.Substring(begin, end - begin);   //取搜尋的條數,用結束的位置-開始的位置,並返回     
    }
}

再附上 QQUserInfo.cs

///


/// QQ授權之後返回的欄位
///

public class QQUserInfo
{

    public int is_lost { get; set; }
    public string figureurl_type { get; set; }

    /// <summary>
    /// 地區 省(隱藏顯示則返回空)
    /// </summary>
    public string province { get; set; }
    /// <summary>
    /// 地區 市(隱藏顯示則返回空)
    /// </summary>
    public string city { get; set; }
    /// <summary>
    /// 出生日期 年份(隱藏顯示則返回空)
    /// </summary>
    public string year { get; set; }
    /// <summary>
    /// 星座
    /// </summary>
    public string constellation { get; set; }
    /// <summary>
    /// 返回碼 0返回成功
    /// </summary>
    public int ret { get; set; }
    /// <summary>
    /// 如果ret小於0,會有相應的錯誤資訊提示,返回資料全部用UTF-8編碼。
    /// </summary>
    public string msg { get; set; }
    /// <summary>
    /// 使用者在QQ空間的暱稱。
    /// </summary>
    public string nickname { get; set; }
    /// <summary>
    /// 大小為30×30畫素的QQ空間頭像URL。
    /// </summary>
    public string figureurl { get; set; }
    /// <summary>
    /// 大小為50×50畫素的QQ空間頭像URL。
    /// </summary>
    public string figureurl_1 { get; set; }
    /// <summary>
    /// 大小為100×100畫素的QQ空間頭像URL。
    /// </summary>
    public string figureurl_2 { get; set; }
    /// <summary>
    /// 上傳的QQ頭像原圖
    /// </summary>
    public string figureurl_qq { get; set; }
    /// <summary>
    /// 大小為40×40畫素的QQ頭像URL。
    /// </summary>
    public string figureurl_qq_1 { get; set; }
    /// <summary>
    /// 大小為100×100畫素的QQ頭像URL。需要注意,不是所有的使用者都擁有QQ的100x100的頭像,但40x40畫素則是一定會有。
    /// </summary>
    public string figureurl_qq_2 { get; set; }
    /// <summary>
    /// 性別。 如果獲取不到則預設返回"男"
    /// </summary>
    public string gender { get; set; }
    /// <summary>
    /// 是否黃鑽
    /// </summary>
    public string is_yellow_vip { get; set; }
    /// <summary>
    /// 是否vip
    /// </summary>
    public string vip { get; set; }
    /// <summary>
    /// 黃鑽等級
    /// </summary>
    public string yellow_vip_level { get; set; }
    /// <summary>
    /// vip等級
    /// </summary>
    public string level { get; set; }
    /// <summary>
    /// 是否年費黃鑽
    /// </summary>
    public string is_yellow_year_vip { get; set; }
}

拿到使用者資訊就說明授權成功了,然後就該走自己的邏輯流程了。。。。

QQ授權登入基本那就是這樣實現的,根據這些步驟來操作基本你沒有什麼問題了