一、你得先去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
/// <summary>
/// QQ授權之后返回的字段
/// </summary>
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授權登錄基本那就是這樣實現的,根據這些步驟來操作基本你沒有什么問題了