(二)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; 
        }


        //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(strOpenId);
            string openId = qqOpenId.openid;
            return openId;
        }
    /// 
    /// QQ回调类,获取Openid
    /// 
    public class QQCallBack
    {
        public string client_id { get; set; }
        public string openid { get; set; }
    }

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

    /// 
    /// qq登录回调结果实体类
    /// 
    public class QQUser
    {
        /// 
        /// 回调结果码(0成功,其他失败)
        /// 
        public int ret { get; set; }
        public string msg { get; set; }
        public string is_lost { get; set; }
        /// 
        /// 用户昵称
        /// 
        public string nickname { get; set; }
        /// 
        /// 性别
        /// 
        public string gender { get; set; }

        public string province { get; set; }

        public string city { get; set; }

        public string year { get; set; }
       /// 
        /// 用户头像
        /// 
        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(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);

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

同样,本人初学者,欢迎批评指正,谢谢!




你可能感兴趣的:((二)C# winform C/S WebBrowser qq第三方授权登录)