网站首页 文章专栏 ASP.NET MVC 接入QQ互联,使用QQ登陆网站。
ASP.NET MVC 接入QQ互联,使用QQ登陆网站。
编辑时间:2017-05-10 21:48 作者:Absolutely 浏览:2668 评论:9


简介


    QQ互联是腾讯旗下的开放平台,通过QQ互联,网站主和开发者可以申请接入QQ登录、用户可以使用QQ账号登录接入的站点,通过添加分享和赞组件,将站点内容分享到QQ空间朋友网,通过获取API授权,网站主还可以将用户操作同步到QQ空间和朋友网。QQ互联提供的API,我们最常用的就是get_user_info(获取登陆用户的昵称、头像、性别),在获取到用户的基本信息后,我们可以将信息保存起来,作为本网站用户,或者与本网站用户绑定!


过程

    

    获取Appid和Appkey ==》获取Access Token ==》 获取OpenId ==》 调用API


接入教程以ASP.NET MVC为例


    1.首先需要申请appid和appkey(在QQ互联官网进行开发者认证申请,然后创建应用,获取appid和appkey)。

        注:这里填写的常规项不多讲,讲一下网站回调地址。这个地址就是用户登录成功后,跳转的地址,在这个这个地址里面进行一些自己网站的数据处理!先随便填后面再改也没事!

    

    2.在网站上放置QQ登陆的触发按钮,链接到Controller的一个Action。比如:UserController下的QQLogin。


    3.在QQLogin组织请求QQ登陆的URL并重定向到这个URL。

        注:在登陆的URL页面,如果用户登陆授权成功,会跳转到指定的回调地址,并带上AuthorizationCode,用于获取AccessToken。

/// <summary>
/// QQ登陆页面
/// </summary>
/// <returns>重定向到QQ登陆页面</returns>
public ActionResult QQLogin()
{
    string appId = "100222222"; //申请QQ登录成功后,分配给应用的appid。
    string redirect_uri = "http://localhost:2721/User/QQLoginCallBack"; //成功授权后的回调地址,必须是注册appid时填写的主域名下的地址。
    string salt = DateTime.Now.ToString("yyyyMMddHHmmssffff");  //client端的状态值。用于第三方应用防止CSRF攻击,成功授权后回调时会原样带回。
    string url = string.Format("{0}?client_id={1}&response_type=code&redirect_uri={2}&state={3}", "https://graph.qq.com/oauth2.0/authorize", appId, redirect_uri, salt);
    RouteValueDictionary routeValue = RouteData.Route.GetRouteData(this.HttpContext).Values;
    Session["QQLoginSalt"] = salt;    //记录client端状态值
    Session["BeforeLoginUrl"] = Request.UrlReferrer;    //记录登陆之前的URL,登陆成功后返回
    return Redirect(url);
}


    4.在QQLoginCallBack(回调地址)中获取AccessToken和OpenID。

        注:上一步用户如果登陆并授权成功,回调地址中会带上AuthorizationCode,这是获取AccessToken的必要条件。


/// <summary>
/// QQ登陆回掉方法
/// </summary>
/// <returns>重定向到登陆之前的页面</returns>
public ActionResult QQLoginCallBack()
{
    string backSalt = Request.QueryString["state"];
    string code = Request.QueryString["code"];
    if (null != backSalt && null != code && null != Session["QQLoginSalt"] && backSalt == Session["QQLoginSalt"].ToString())
    {
        Session["QQLoginSalt"] = null;
        //调获取AccessToken的接口
        string access_token = QQLoginHelper.GetAccessToken(code, "callback");
        //调获取OpenID的接口
        string openid = QQLoginHelper.GetOpenId(access_token);  
        //调获取用户信息的接口
        QQUser qqUserInfo = QQLoginHelper.GetUserInfo(access_token, openid);

        if (qqUserInfo.Ret == 0 && string.IsNullOrEmpty(qqUserInfo.Msg))
        {
            //返回码为0并且没有错误消息,说明获取用户成功
            //后面步骤仅做参考
            UserInfo user = userService.Find(s => s.OpenId == openid).FirstOrDefault(); //根据OpenId(用户在本网站的唯一标识)去数据库查找用户是否存在
            if (user != null)
            {
                //存在则更新用户资料
                user.UserName = qqUserInfo.Nickname; //昵称
                user.Gender = qqUserInfo.Gender; //性别
                user.FigureUrl = qqUserInfo.Figureurl_QQ_1; //头像
                user.LastLoginTime = DateTime.Now;
                if (!userService.Modify(user))
                {
                    throw new Exception("保存用户信息失败");
                }
            }
            else
            {
                user = new UserInfo();
                //不存在则保存用户
                user.UserId = CommonHelper.GetPrimaryKey();
                user.UserName = qqUserInfo.Nickname;
                user.Gender = qqUserInfo.Gender;
                user.FigureUrl = qqUserInfo.Figureurl_QQ_1;
                user.OpenId = openid;
                user.OperTime = DateTime.Now;
                user.LastLoginTime = DateTime.Now;
                if (!userService.Add(user))
                {
                    throw new Exception("保存用户信息失败");
                }
            }
            Session["currentUser"] = user; //保存当前登录用户
            Response.Cookies["currentUserId"].Value = user.UserId;  //将值写入到客户端硬盘Cookie
            Response.Cookies["currentUserId"].Expires = DateTime.Now.AddDays(36500);//设置Cookie过期时间
        }
        else
        {
            //获取用户失败
            throw new ApplicationException(qqUserInfo.Msg);
        }
        if (Session["BeforeLoginUrl"] != null)
        {
            return Redirect(Session["BeforeLoginUrl"].ToString()); //返回登陆之前的URL
        }
        else
        {
            throw new Exception("登陆之前的路由丢失");
        }
    }
    else
    {
        return Redirect("/ErrorPage/404.htm");
    }
}
     5.至此,QQ登录完成!上一步中调用获取AccessToken、OpenID、用户信息三个接口的方法,改天奉上,今天有点晚了,休息!





QQ互联官网:https://connect.qq.com


 出自:不落阁

 地址:www.lyblogs.cn

 转载请注明出处!



来说两句吧
最新评论
  • 看世事繁华
    看世事繁华 2018-01-03 17:03:54
    测试测试
  • huason.tu
    huason.tu 2017-05-12 14:46:18

    感谢楼主!!![good]

  • Exception
    Exception 2017-05-21 00:58:50

    感谢博主 今天正在研究这个

  • Jacky Linゞ
    Jacky Linゞ 2017-05-21 04:24:51
    [鼓掌]有java版本的吗?
  • 謓dêシ累了
    謓dêシ累了 2017-06-05 14:20:32
    阿达[右哼哼]
  • ωǒ們偠開鈊
    ωǒ們偠開鈊 2017-06-21 15:56:47

    感谢楼主!!![good]

  • 对不起的表情
    对不起的表情 2017-08-28 11:17:34
    感谢楼主主分享,我想用你的前端模板做一个博客,可以吗??[嘻嘻]
  • 有毒的地狱野猪肉
    有毒的地狱野猪肉 2017-08-29 22:12:16
    么么哒
  • 徒弟.
    徒弟. 2017-12-20 20:01:40
    我想知道我的项目没上线,怎么调用这个功能,我人工服务问过qq客服,他们说正常是要上线的,遂过来讨教讨教