QQ授權登入
阿新 • • 發佈:2020-08-24
一、你得先去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授權登入基本那就是這樣實現的,根據這些步驟來操作基本你沒有什麼問題了