C# winform 实现微信二维码登录、第三方登录(已实现、附源码)

原文:C# winform 实现微信二维码登录、第三方登录(已实现、附源码)

前言

应上级要求,在项目登录的时候实现第三方登录。很荣幸我接到了这个任务,但是我之前完全都没接触到。开发周期是三天,对于我们这种小白完全是从零开始。最后成功的实现这个功能固然重要,但是这个探索的过程才值得回味。光需要代码可以直接下载源码,我们重要说下实现过程和步骤,自己也巩固和记录一下!

实现步骤

1. 我实现的是微信扫码登录,当然要知道微信给的接口,可以在https://open.weixin.qq.com/ 这里申请开发的账号,申请完之后登录微信公众平台,点击接口权限–网页授权获取用户基本信息(如下图)

2. 微信官方还是很靠谱,里面有4步,按照这4步走是没问题的(下面主要说最重要的三步)

3. 第一步(如下图):

下面是对里面的参数的详解:

这里注意一下:回调地址最好进行UrlEncode编码。

  1. 第二步通过获取的code获取access_token

返回值json是这样的

  1. 第三步,通过获取的openid和access_token获取用户信息

    这个接口的返回值:

具体代码

1、拖控件WebBrowser到一个winform中。设置属性-url,为上面第一步的URL

https://open.weixin.qq.com/connect/qrconnect?appid=你申请的appid&redirect_uri=你的回调地址&response_type=code&scope=snsapi_login&state={{loginPage}}


  • 1

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

2、获取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);
            } 


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

3、定义Access_token类,获取Access_token

 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; }
        }
	    /// <summary>
        /// 生成Json格式
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="obj"></param>
        /// <returns></returns>
        public 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;
        }
        /// <summary>
        /// json转实体
        /// </summary>
        /// <typeparam name="T"></typeparam>
        /// <param name="szJson"></param>
        /// <returns></returns>
        public OAuth_Token Get_token(string Code)
        {
            string appid = "";
            string appsecret = "";
            //获取微信回传的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>
        /// 通过access_token和openid获取用户信息
        /// </summary>
        /// <returns></returns>
        public OAuthUser Get_UserInfo(string access_token, string openid)
        {
            //获取微信回传的openid、access token
            string Str = GetJson("https://api.weixin.qq.com/sns/userinfo?access_token="+ access_token + "&openid="+ openid + "&lang=zh_CN");
            //微信回传的数据为Json格式,将Json格式转化成对象
            OAuthUser userinfo = JsonHelper.ParseFromJson<OAuthUser>(Str);
            return userinfo;
        }
    }


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93

4、定义用户信息实体类

    /// <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
    }


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49
  • 50
  • 51
  • 52
  • 53
  • 54
  • 55
  • 56
  • 57
  • 58
  • 59
  • 60
  • 61
  • 62
  • 63
  • 64
  • 65
  • 66
  • 67
  • 68
  • 69
  • 70
  • 71
  • 72
  • 73
  • 74
  • 75
  • 76
  • 77
  • 78
  • 79
  • 80
  • 81
  • 82
  • 83
  • 84
  • 85
  • 86
  • 87
  • 88
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • 100
  • 101

5、 根据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 token = new OAuth_Token();
            OAuth_Token Model = token.Get_token(code);  //获取access_token
            OAuthUser OAuthUser_Model = token.Get_UserInfo(Model.access_token, Model.openid);//获取用户信息
        }


  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

原码地址

下载链接,微信扫码登录

C#版微信,类似于QQ,也是扫码登录

如有什么问题 ,欢迎交流!

原文地址:https://www.cnblogs.com/lonelyxmas/p/12329542.html

时间: 2024-07-29 08:07:43

C# winform 实现微信二维码登录、第三方登录(已实现、附源码)的相关文章

iOS二十种超酷时尚艺术滤镜汇总【附源码】

本文总结了20种ios滤镜都是基于GPUImage的,有3种滤镜是GPUImage库中包含的,还有17种是Instagram中的经典滤镜,集成在一个项目中.使用GPUImage可以非常容易创建我们自己的滤镜效果总会有你想要的效果吧.在文章下面附源码下载 相信你也在使用滤镜吧,今天就让你见识一下滤镜实现其实也不是一件特别难的技术,下面附一些效果图.由于几种滤镜最主要的实现是一段片段着色程序,所以会进行展示 Amaro滤镜,通过FWAmaroFilter类来实现.它是Instagram应用中的经典滤

C#微信公众号开发之模板消息开发,附源码

个人觉得模板消息功能的增加对公众号的作用非常大,可以说是真正意义上的实现了所谓的轻app,商家可以通过模板消息给用户发送重要的信息,交易.预约.消费.邮件.物流等信息.之前我做过的系统通过邮件发送订单消息,但是对于一些不喜欢绑定手机邮箱(实时提现商家发货买家订单进程等)的人来说还是不够方便,有了模板消息,公众号得以独立的完成交易信息通知跟踪等. 开发文档:http://mp.weixin.qq.com/wiki/17/304c1885ea66dbedf7dc170d84999a9d.html C

漂亮大气餐饮点餐系统源码(电脑手机通用)-附源码

最近有个挺漂亮大气餐饮点餐系统跟大家分享下: 一.特点 1.采用前后端分离设计,运用C# MVC webapi  bootrap 等,采用mysql数据库 二.菜单功能 1.主要点餐.手机点菜.餐桌管理.服务员管理 .订单管理.优惠管理.运营分析.报表等 获取源码,请访问 http://www.51aspx.com/code/codename/64060 原文地址:https://www.cnblogs.com/starksoft/p/11763273.html

微信二维码登录原理

在电脑上使用微信时,你可能已经发现微信不提供传统的账号密码登陆,取而代之的是通过扫描二维码进行登陆.今天就要研究下次登陆方式微信时如何实现的? 1.每次用户打开PC端登陆请求,系统返回一个唯一的uid,并将uid的信息绘制成二维码返回给用户.这里的uid一定是唯一的,否则就会造成你登陆了其他用户的账号或者其他用户登陆你的账号. 2.当用户使用登陆后的微信扫描该二维码的时候,会将这个uid和手机上的微信账号及密码产生的token进行绑定,并上传到服务器. 3.WEB通过JS不断的向后端发起请求,查

用微信二维码登录自己的网站

地址:http://www.cnblogs.com/loogn/p/3727953.html用微信二维码登录自己的网站 一.当用户选择用微信二维码登录时,我们要在用户页面里生成一个guid做为客户端的唯一标识,然后带着这个guid请求二维码图片地址,得到地址后,显示给用户.请求到后台的时候要将此二维码的Key和客户端的guid关联到一起.注意这个key的生成方式,要保证多人同时用二维码登录而不冲突,比如用10000自增,隔断时间又重置到10000. 二.得到二维码后,马上发出长链接请求登录标识(

微信二维码网页登录、支付宝手机二维码支付模式实现

1. 业务背景 公司要求实现类型微信二维码网页登录模式的手机签名.因为只是demo就没有深究,就只是通过异步方式简单实现.该业务模块是基于一个单点登录系统的子业务模块,所以签名等内容不理解没有关系.该文章主要是通过简要代码的梳理业务流程. 2. 大体流程如下 在login.jsp页面执行docReady()方法中的getHycSignature()方法开始进入二维码异步流程 getHycSignature()方法 将随机数和定向页面地址传到后台异步生成二维码,生成二维码成功则将生成的图片在log

注册绑定页面及微信二维码登陆页面开发项目总结

乐帝来到新的实习单位,也许是之前面试或者在爱奇艺实习的履历,很快被项目组"委以重任".而不是老套路刚入职,先在架构师那培训两周,专心钻研框架,不问具体业务.乐帝只有几天看框架的时间,当被分配给框架页面时,还是不能得心应手,正如同事所说,学习还得按部就班,写写例子,看代码是不行的.    目前这家公司类似<走出软件作坊>作者阿朱所在行业,是面向中大型企业,提供人才管理解决方案的软件公司,时髦的词叫SAAS.这类公司层次要比外包公司高,却还有很多外包公司的特点,不像互联网公司有

微信二维码微信公众号二维码怎么生成?

为了满足用户渠道推广分析和用户帐号绑定等场景的需要,公众平台提供了生成带参数二维码的接口.使用该接口可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送. #生成二维码接口 https://open.weixin.qq.com/qr/code?username=weihaobang 微信公众号渠道二维码生成.具体查看流程如下:登录微号帮->功能管理->渠道二维码生成/二维码海报/带参数的二维码,创建设置,二维码由系统自动生成,可以选择带不带logo.默认显示带logo的黑白二

你的微信二维码是唯一的吗?【微信二维码的秘密】

最近听说有一老板被一科技公司业务员忽悠,说"您赶快来注册您唯一的二维码吧!否则,会被别人抢注的!" 很多人以为自己的微信二维码.网站的二维码是唯一的,果真如此吗?事实上,不是! 你的二维码可以是多种多样的,这里以我所掌管的"掌上龙岗"微信号为例进行说明. "掌上龙岗"的微信号是szlgwx,二维码则可以至少用以下几种: (L)(M)(Q)(H) 打开你的手机,使用手机微信"扫一扫"功能,扫描上面几种和下面的二维码,均可直接添加