使用面向对象开发QQ第三方登录,附流程图及核心代码

好几年前就做过QQ第三方登录,但一直没有详细系统去了解过,今天项目又需要开发这个功能,这回想好好了解一下.

QQ第三方登录申请地址:https://connect.qq.com/index.html  接入QQ互联平台,让你的移动应用支持QQ帐号登录、分享到QQ等功能。

提交申请后一般需要1-2个工作日后才通过,不知道现在大伙是不是都去做微信相当开发,QQ这个功能是不是不太重视这个功能了,打开时经常数据未能及时加载.

一.先上流程图

二.相关代码

  1.    获取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;
        }

 本文写时比较仓促,存在错误在所难免,请见谅!

posted @ 2017-08-27 17:43  Sofeng  阅读(989)  评论(0)    收藏  举报
青丰科技网址:www.QinSoft.cn