• C# winform C/S WebBrowser qq第三方授权登录


    qq的授权登录,跟微信相似,不同的地方是:

    1 申请appid与appkey的时候,注意填写回调地址。

    2 这里可以在WebBrowser的是Navigated事件中直接得到Access Token,一般情况是通过Authorization Code获取Access Token。

    3 获取用户信息,需要先根据Access Token获取用户的OpenID。

    最后,在WebBrowser的DocumentCompleted事件中,完成所有的调用。


    总结一下,分以下几步:

    1 根据appid与appkey获取Authorization Code(这里忽略此步,直接到步骤2)。

    2 根据code获取Access Token,这里可在WebBrowser的Navigated事件中,直接在网址中获取Access Token。

    3 使用Access Token来获取用户的OpenID

    4 根据Access Token和OpenID  调用OpenAPI获取各种信息,这里qq提供了具体的API文档。

    需要的资料,都在qq互联-文档资料,非常的详细。


    具体的过程如下:

    1 在新的form中,拉一个WebBrowser控件,在属性-url,设置为

    https://graph.qq.com/oauth2.0/authorize?response_type=token&client_id=你的appid&redirect_uri=你的回调地址&scope=get_user_info

    同样,回调地址注意进行URLEncode。这样运行,可以进入到qq授权登录的界面。

    2 在Navigated事件中,用list记录跳转的网址

    ArrayList addressList2 = new ArrayList();
    
        private void webBrowser_QQ_Navigated(object sender, WebBrowserNavigatedEventArgs e)  
        {  
            string url = e.Url.ToString();  
            addressList2.Add(url);   
        }  


    3 遍历addressList2,找到含有access_token的网址,取出access_token

        //Step2:一般情况是通过Authorization Code获取Access Token,这里直接从网址获取Access Token  
        protected string Get_AccessToken()  
        {  
            string strTempToken = "";  
            // 获取含有Access_token的网址  
            foreach (string url in addressList2)  
            {  
                if (url.Contains("access_token"))  
                {  
                    strTempToken = url;  
                    break;  
                }  
            }              
            if (string.IsNullOrEmpty(strTempToken))  
                return null;  
            //qq最终获得的Access_token  
            string AccessToken = "";  
            int iStart = strTempToken.IndexOf("=");  
            int iEnd = strTempToken.LastIndexOf('&');  
            if (iStart < iEnd)  
            {  
                int codeLength = iEnd - iStart - 1;  
                AccessToken = strTempToken.Substring(iStart + 1, codeLength);  
            }  
           return AccessToken;   
        }  


    3

        //Step3:使用Access Token来获取用户的OpenID  
        protected string Get_OpenID(string Access_token)  
        {  
            string callback = JsonHelper.GetJson("https://graph.qq.com/oauth2.0/me?access_token=" + Access_token);  
            int ibegin = callback.IndexOf("{");  
            int iEnd = callback.IndexOf("}");  
            int ilength = 0;  
            if(ibegin<iEnd)  
            {  
                ilength = iEnd - ibegin;  
            }  
            string strOpenId = callback.Substring(ibegin, ilength + 1);  
            QQCallBack qqOpenId = JsonHelper.ParseFromJson<QQCallBack>(strOpenId);  
            string openId = qqOpenId.openid;  
            return openId;  
        }  


     

      /// <summary>  
        /// QQ回调类,获取Openid  
        /// </summary>  
        public class QQCallBack  
        {  
            public string client_id { get; set; }  
            public string openid { get; set; }  
        }  


    4 先定义QQUser用户信息类,根据Access_token和openId获取用户信息

        /// <summary>  
        /// qq登录回调结果实体类  
        /// </summary>  
        public class QQUser  
        {  
            /// <summary>  
            /// 回调结果码(0成功,其他失败)  
            /// </summary>  
            public int ret { get; set; }  
            public string msg { get; set; }  
            public string is_lost { get; set; }  
            /// <summary>  
            /// 用户昵称  
            /// </summary>  
            public string nickname { get; set; }  
            /// <summary>  
            /// 性别  
            /// </summary>  
            public string gender { get; set; }  
          
            public string province { get; set; }  
          
            public string city { get; set; }  
          
            public string year { get; set; }  
           /// <summary>  
            /// 用户头像  
            /// </summary>  
            public string figureurl { get; set; }  
          
            public string figureurl_2 { get; set; }  
          
            public string figureurl_qq_2 { get; set; }         
        }  


        //Step4: 调用OpenAPI获取各种信息  
      

     protected QQUser Get_qqUserInfo(string Access_token, string openId)  
        {  
            string userInfostr = JsonHelper.GetJson("https://graph.qq.com/user/get_user_info?access_token=" + Access_token + "&oauth_consumer_key=" + app_id + "&openid=" + openId);  
            QQUser qqUser = JsonHelper.ParseFromJson<QQUser>(userInfostr);  
            return qqUser;  
        }  


    最后,在WebBrowser的DocumentCompleted事件中,调用上述的函数。

        private void webBrowser_QQ_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)  
        {  
            string access_token = Get_AccessToken();  
            if (string.IsNullOrEmpty(access_token))  
                return;  
            string openid = Get_OpenID(access_token);  
            if (string.IsNullOrEmpty(openid))  
            {  
                return;  
            }  
            QQUser qqUser = Get_qqUserInfo(access_token, openid);  


    中间没有提到的相关的函数,在上篇微信中,都有提到,这里不再赘述。

  • 相关阅读:
    kindeditor扩展粘贴截图功能&修改图片上传路径并通过webapi上传图片到图片服务器
    解决VS2015 VBCSCompiler.exe 占用CPU100%的问题
    电商网站商品模型之商品详情页设计方案
    大三那年在某宝8块钱买的.NET视频决定了我的职业生涯
    单点登录改进版-使用ajax分发cookie避免重定向轮询
    可跨域的单点登录(SSO)实现方案【附.net代码】
    使用ANTS Performance Profiler&ANTS Memory Profiler工具分析IIS进程内存和CPU占用过高问题
    js封装的三级联动菜单(使用时只需要一行js代码)
    EF查询之性能优化技巧
    EF使用CodeFirst方式生成数据库&技巧经验
  • 原文地址:https://www.cnblogs.com/hnsongbiao/p/7837128.html
Copyright © 2020-2023  润新知