使用面向对象开发QQ第三方登录,附流程图及核心代码
好几年前就做过QQ第三方登录,但一直没有详细系统去了解过,今天项目又需要开发这个功能,这回想好好了解一下.
QQ第三方登录申请地址:https://connect.qq.com/index.html 接入QQ互联平台,让你的移动应用支持QQ帐号登录、分享到QQ等功能。
提交申请后一般需要1-2个工作日后才通过,不知道现在大伙是不是都去做微信相当开发,QQ这个功能是不是不太重视这个功能了,打开时经常数据未能及时加载.
一.先上流程图

二.相关代码
- 获取Authorization Code 获取QQ回调授权的Code,在于面向对象流行泛滥的今天,我有对象强迫症,啥都要先定义一个对象
public class DBQQAuthorizationCode
{
public string code { get; set; }
public string state { get; set; }
/// <summary>
/// 用户取消登录则返回 1 (非0)
/// </summary>
public int usercancel { get; set; }
}
获取方法:
public static void GetAuthorizationCode(HttpResponseBase response, string appId, string redirect_uri)
{
var url = string.Format("https://graph.qq.com/oauth2.0/authorize?response_type=code&client_id={0}&redirect_uri={1}&state=1&scope=get_user_info&display=&g_ut=1", appId, HttpUtility.UrlEncode(redirect_uri));
response.Redirect(url);
}
QQ回调接收:
public ActionResult QQ(DBQQAuthorizationCode model)
{
//model 就是我们得到的code对象
}
2.通过Authorization Code获取Access Token
按惯例,先定义token对象
public class DBQQAccessToken { /// <summary> /// 授权令牌,access_token。 /// </summary> public string access_token { get; set; } /// <summary> /// 该access token的有效期,单位为秒。 /// </summary> public int expires_in { get; set; } /// <summary> /// 在授权自动续期步骤中,获取新的Access_Token时需要提供的参数。 /// </summary> public string refresh_token { get; set; } }
获取到的token信息
public static DBQQAccessToken GetAccessToken(string appId, string appSecret, string authorization_code,string redirect_uri) { var url = string.Format("https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id={0}&client_secret={1}&code={2}&redirect_uri={3}", appId, appSecret, authorization_code, HttpUtility.UrlEncode(redirect_uri)); var param = Utils.HttpGet(url); var settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, MissingMemberHandling = MissingMemberHandling.Ignore }; var values = RequestHelper.GetQueryString(param); var item = new DBQQAccessToken(); item.access_token = values.Get("access_token"); item.expires_in = values.Get("expires_in").ToInt(0); item.refresh_token = values.Get("refresh_token"); return item; }
3.获取用户OpenID
openid也定义对象,方便以后使用
public class DBQQUserOpenID { public string client_id { get; set; } public string openid { get; set; } public string unioid { get; set; } }
获取openid方法
public static DBQQUserOpenID GetOpenID(string access_token) { var url = string.Format("https://graph.qq.com/oauth2.0/me?access_token={0}", access_token); var json = Utils.HttpGet(url); var value = json.Replace("callback(",string.Empty); value = value.Replace(");", string.Empty); var item = JsonConvert.DeserializeObject<DBQQUserOpenID>(value); return item; }
4.获取登录用户在QQ空间的信息,包括昵称、头像、性别及黄钻信息
定义用户对象:
public class DBQQUserInfo { /// <summary> ///返回码 0为正常 小于 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> /// 大小为40×40像素的QQ头像URL。 /// </summary> public string figureurl_qq_1 { get; set; } /// <summary> /// 大小为100×100像素的QQ头像URL。需要注意,不是所有的用户都拥有QQ的100×100的头像,但40×40像素则是一定会有。 /// </summary> public string figureurl_qq_2 { get; set; } /// <summary> /// 性别。 如果获取不到则默认返回”男” /// </summary> public string gender { get; set; } public byte? Sex { get { var value = gender; if(value=="男") { return 1; } else if(value == "女") { return 2; } else { return 0; } } } /// <summary> /// 标识用户是否为黄钻用户(0:不是;1:是)。 /// </summary> public int is_yellow_vip { get; set; } /// <summary> /// 标识用户是否为黄钻用户(0:不是;1:是) /// </summary> public int vip { get; set; } /// <summary> /// 黄钻等级 /// </summary> public int yellow_vip_level { get; set; } /// <summary> /// 黄钻等级 /// </summary> public int level { get; set; } /// <summary> /// 标识是否为年费黄钻用户(0:不是; 1:是) /// </summary> public int is_yellow_year_vip { get; set; } }
获取用户信息方法
public static DBQQUserInfo GetUserInfo(string accessToken,string appId, string openId) { var url = string.Format("https://graph.qq.com/user/get_user_info?access_token={0}&oauth_consumer_key={1}&openid={2}&format=json ", accessToken, appId, openId); var json = Utils.HttpGet(url); var settings = new JsonSerializerSettings { NullValueHandling = NullValueHandling.Ignore, MissingMemberHandling = MissingMemberHandling.Ignore }; var value = JsonConvert.DeserializeObject<DBQQUserInfo>(json, settings); return value; }
本文写时比较仓促,存在错误在所难免,请见谅!

浙公网安备 33010602011771号