• C# winform C/S WebBrowser 微信第三方登录


    网上很多的资料都是B/S结构的,这里是基于C# C/S 结构的微信第三方授权登录

    一、准备知识

    1 http Get和Post方法。做第三方授权登录,获取信息基本上都是用get和post方法,做之前需要进行基本的了解,基本上网页都是get。

    2 微信开发文档。这里参考的是: 微信开发平台——资源中心——网址应用——微信登录功能 。

    3 熟悉WebBrowser控件。这里熟悉的主要是webBrowser的事件Navigating和Navigated。这里可以获取跳转的网页地址,这个很重要!!!

    基础的OAuth2.0协议标准、C#编程基础知识 都需要有一定的了解。

    二、 开发过程。

    1 注册。到微信开发平台注册需要授权登录的应用程序,获取的appid和appsecret。

    2 拖控件WebBrowser到一个winform中。设置属性-url,为 

    https://open.weixin.qq.com/connect/qrconnect?appid=你申请的appid&redirect_uri=你的跳转的网址&response_type=code&scope=snsapi_login&state=123456#wechat_redirect

    注意:这里你跳转的网址,要进行UrlEncode编码。

    运行程序,就可以到下面的界面:


    3 获取code

    这里获取code 就要利用 WebBrowser的Navigating或者Navigated事件。经本人测试,微信的授权登录,这两个事件都可以得到带有code的网址。

    即,在跳转到这个事件的时候,记录网址到一个list中。

     

           // 微信跳转的网址列表
            ArrayList addressList = new ArrayList();
    
            private void webBrowser1_Navigating(object sender, WebBrowserNavigatingEventArgs e)
            {
                string url = e.Url.ToString();
                //微信每次跳转的页面放到list中,第一个是包含code的网址
                addressList.Add(url);            
            } 

     

    4 获取 微信Access_token

     先定义一个 微信Access_token类

     

       /// <summary>
        /// 微信Access_token类
        /// </summary>
        public class OAuth_Token
        {
            public OAuth_Token()
            {
    
                //
                //TODO: 在此处添加构造函数逻辑
                //
            }
            //access_token    网页授权接口调用凭证,注意:此access_token与基础支持的access_token不同
            //expires_in    access_token接口调用凭证超时时间,单位(秒)
            //refresh_token    用户刷新access_token
            //openid    用户唯一标识,请注意,在未关注公众号时,用户访问公众号的网页,也会产生一个用户和公众号唯一的OpenID
            //scope    用户授权的作用域,使用逗号(,)分隔
            public string _access_token;
            public string _expires_in;
            public string _refresh_token;
            public string _openid;
            public string _scope;
            public string access_token
            {
                set { _access_token = value; }
                get { return _access_token; }
            }
            public string expires_in
            {
                set { _expires_in = value; }
                get { return _expires_in; }
            }
    
            public string refresh_token
            {
                set { _refresh_token = value; }
                get { return _refresh_token; }
            }
            public string openid
            {
                set { _openid = value; }
                get { return _openid; }
            }
            public string scope
            {
                set { _scope = value; }
                get { return _scope; }
            }
    
        }

     

           //访问微信url并返回微信信息
            protected string GetJson(string url)
            {
                WebClient wc = new WebClient();
                wc.Credentials = CredentialCache.DefaultCredentials;
                wc.Encoding = Encoding.UTF8;
                string returnText = wc.DownloadString(url);
    
                if (returnText.Contains("errcode"))
                {
                    //可能发生错误
                }
                return returnText;
           
    
            //根据appid,secret,code获取微信openid、access token信息
            protected OAuth_Token Get_token(string Code)
            {
                //获取微信回传的openid、access token
                string Str = GetJson("https://api.weixin.qq.com/sns/oauth2/access_token?appid=" + appid + "&secret=" + appsecret + "&code=" + Code + "&grant_type=authorization_code");
                //微信回传的数据为Json格式,将Json格式转化成对象
                OAuth_Token Oauth_Token_Model = JsonHelper.ParseFromJson<OAuth_Token>(Str);
                return Oauth_Token_Model;
            }
    
    
        /// <summary>
        /// 将Json格式数据转化成对象
        /// </summary>
        public class JsonHelper
        {
            /// <summary>  
            /// 生成Json格式  
            /// </summary>  
            /// <typeparam name="T"></typeparam>  
            /// <param name="obj"></param>  
            /// <returns></returns>  
            public static string GetJson<T>(T obj)
            {
                DataContractJsonSerializer json = new DataContractJsonSerializer(obj.GetType());
                using (MemoryStream stream = new MemoryStream())
                {
                    json.WriteObject(stream, obj);
                    string szJson = Encoding.UTF8.GetString(stream.ToArray()); return szJson;
                }
            }
            /// <summary>  
            /// 获取Json的Model  
            /// </summary>  
            /// <typeparam name="T"></typeparam>  
            /// <param name="szJson"></param>  
            /// <returns></returns>  
            public static T ParseFromJson<T>(string szJson)
            {
                T obj = Activator.CreateInstance<T>();
                using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(szJson)))
                {
                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(obj.GetType());
                    return (T)serializer.ReadObject(ms);
                }
            }
        }

    5 根据openid,access token获得用户信息

    先定义微信用户信息类

        /// <summary>
        /// 微信用户信息类
        /// </summary>
        public class OAuthUser
        {
            public OAuthUser()
            { }
            #region 数据库字段
            private string _openID;
            private string _searchText;
            private string _nickname;
            private string _sex;
            private string _province;
            private string _city;
            private string _country;
            private string _headimgUrl;
            private string _privilege;
            private string _unionid;
    
            #endregion
    
            #region 字段属性
            /// <summary>
            /// 用户的唯一标识
            /// </summary>
            public string openid
            {
                set { _openID = value; }
                get { return _openID; }
            }
            /// <summary>
            ///
            /// </summary>
            public string SearchText
            {
                set { _searchText = value; }
                get { return _searchText; }
            }
            /// <summary>
            /// 用户昵称
            /// </summary>
            public string nickname
            {
                set { _nickname = value; }
                get { return _nickname; }
            }
            /// <summary>
            /// 用户的性别,值为1时是男性,值为2时是女性,值为0时是未知
            /// </summary>
            public string sex
            {
                set { _sex = value; }
                get { return _sex; }
            }
            /// <summary>
            /// 用户个人资料填写的省份
            /// </summary>
            public string province
            {
                set { _province = value; }
                get { return _province; }
            }
            /// <summary>
            /// 普通用户个人资料填写的城市
            /// </summary>
            public string city
            {
                set { _city = value; }
                get { return _city; }
            }
            /// <summary>
            /// 国家,如中国为CN
            /// </summary>
            public string country
            {
                set { _country = value; }
                get { return _country; }
            }
            /// <summary>
            /// 用户头像,最后一个数值代表正方形头像大小(有0、46、64、96、132数值可选,0代表640*640正方形头像),用户没有头像时该项为空
            /// </summary>
            public string headimgurl
            {
                set { _headimgUrl = value; }
                get { return _headimgUrl; }
            }
            /// <summary>
            /// 用户特权信息,json 数组,如微信沃卡用户为(chinaunicom)其实这个格式称不上JSON,只是个单纯数组
            /// </summary>
            public string privilege
            {
                set { _privilege = value; }
                get { return _privilege; }
            }
            public string unionid
            {
                set { _unionid = value; }
                get { return _unionid; }
            }
            #endregion
        }

     

    再 根据openid,access token获得用户信息

            private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
            {            
                //获取微信跳转的第一个页面的网址
                string tempCode = addressList[0].ToString();
                //微信最终获得的code
                string code = "";
                if (tempCode.Contains("code"))
                {
                    int iStart = tempCode.IndexOf("=");
                    int iEnd = tempCode.IndexOf('&', iStart);
                    if (iEnd < 0)
                    {
                        iEnd = tempCode.Length - iStart;
                    }
                    else
                    {
                        iEnd -= iStart;
                    }
                    code = tempCode.Substring(iStart + 1, iEnd - 1);                
                }
                else
                {
                    return;                
                }           
    
                if (string.IsNullOrEmpty(code))
                    return;
    
                OAuth_Token Model = Get_token(code);  //获取access_token
                OAuthUser OAuthUser_Model = Get_UserInfo(Model.access_token, Model.openid);//获取用户信息

    这个时候,界面会显示授权登录成功。


    注意:这里用的都是GET方法,所以在做的过程中的Json信息,都可以将url地址复制到浏览器,看看得到的数据是否正确,这样可以提前验证一下。

    路漫漫其修远兮,其中具体的细节,对于编程小白来说,还是需要慢慢的琢磨一下。这里提供的是我认为是比较笨的办法,如果有高手有更好的实现办法,欢迎提出,我会及时改正。

     

  • 相关阅读:
    ARM学习笔记10——GNU ARM命令行工具
    ARM学习笔记9——ARM汇编汇编语言中的伪指令
    ARM学习笔记8——通用寄存器和存储器内容交换指令和软中断指令
    ARM学习笔记7——乘法指令
    ARM学习笔记6——程序状态寄存器访问指令
    ARM学习笔记5——程序状态寄存器
    ARM学习笔记4——加载存储指令
    ARM学习笔记3——数据处理指令
    ARM学习笔记2——分支跳转指令
    ARM学习笔记1——Arm寄存器与模式的关系
  • 原文地址:https://www.cnblogs.com/hnsongbiao/p/7837127.html
Copyright © 2020-2023  润新知