前言

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

实现步骤

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

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

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

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 tokenstring 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 tokenstring 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;}}

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}

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

     private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e){string tempCode = addressList[0].ToString();//微信最终获得的codestring 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_tokenOAuthUser OAuthUser_Model = token.Get_UserInfo(Model.access_token, Model.openid);//获取用户信息    }
原码地址

下载链接,微信扫码登录

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

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

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

  1. Java毕设项目疫苗药品批量扫码识别追溯系统计算机(附源码+系统+数据库+LW)

    Java毕设项目疫苗药品批量扫码识别追溯系统计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也 ...

  2. JAVA计算机毕业设计疫苗药品批量扫码识别追溯系统计算机(附源码、数据库)

    JAVA计算机毕业设计疫苗药品批量扫码识别追溯系统计算机(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ ...

  3. 仿酷狗音乐播放器开发日志二十一 开发动态调色板控件(附源码)

    转载请说明原出处,谢谢~~ 上一篇仿酷狗日志结束后,整个换肤功能就只剩下调色板功能没有做了,我本以为会很简单,但是研究了酷狗的调色板功能后发现不是那么简单的事情.首先看一下酷狗的调色板的样子: 我原本 ...

  4. 【图像加密】基于matlab GUI正交拉丁方+二维Arnold置乱图像加密【含Matlab源码 813期】

    ⛄一.正交拉丁方置乱及二维Arnold置乱简介 0 引言 随着通讯技术的飞速发展, 越来越多的领域需要传送数字图像信号, 因此信息的传送安全问题显得越来越重要.通常应用于数字图像通信的两种保护技术为: ...

  5. springboot微信点餐系统的设计与实现 毕业设计- 附源码221541

    springboot点餐微信小程序 摘  要 点餐微信小程序采用B/S模式.采用JAVA语言.springboot框架.mysql数据库.小程序框架uniapp等开工具.促进了点餐微信小程序的业务发展 ...

  6. Spring Boot 实现扫码登录,太赞了(附源码)!!

    点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐ 点击领取全栈资料:全栈资料 一.首先咱们需要一张表 二.角色都有哪些 三.接口都需要哪些? 四.步骤 五.疯狂贴代码 springBoot中 ...

  7. SSM基于微信小程序的魔音影评交流平台-计算机毕设 附源码61758

    SSM基于微信小程序的魔音影评交流平台 摘 要 随着人类向信息社会的不断迈进,风起云涌的信息时代正掀起一次新的革命,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛.因此,建立一个基于微信小程 ...

  8. SSM基于微信小程序的外卖点餐系统 毕业设计-附源码2711704

    基于微信小程序的外卖点餐系统的设计与实现 摘要 立足于当下餐饮行业现有的点餐模式,分析传统APP点餐的运作流程,结合微信小程序的特点设计新型的外卖点餐系统.近几年,人们生活水平日益提升,但工作强度和压 ...

  9. 【C#+SQL Server+打印组件】实现电商快递单打印系统 二:数据库设计与开发环境(附源码和资源)

    需要源码和资源请点赞关注收藏后评论区留言私信~~~ 一.系统开发环境要求 开发快递单打印精灵项目的计算机需要满足以上条件 操作系统:windows7以上 开发环境:Visual Studio 2022 ...

最新文章

  1. java 升级1.8_升级java到1.8.0_111
  2. STM32常用数据类型 u8、u16、u32
  3. Python基础day05 作业解析【10道 函数作业题】
  4. ADB server didn't ACK * failed to start daemon * 解决方案
  5. [LeetCode] 21. Merge Two Sorted Lists ☆
  6. 自梦php,PHP菜狗自学之路 云之梦php php之窗 php脚本之
  7. cookie里面用到的关键字_晓龙吊打面试官系列:synchronized关键字入门(同步方法与同步代码块)...
  8. python中多进程及进程间通信的方法
  9. python udp编程_Python UDP编程小示例
  10. vSAN Health Service-物理磁盘运行状况-物理磁盘运行状况检索问题(2149291)
  11. 《Scala机器学习》一一
  12. IOS开发笔记_5.线程,HTTP请求,定时器
  13. matlab遗传算法 系统辨识,基于遗传算法的控制系统的系统辨识
  14. 运行bat时隐藏cmd窗口的方法(bat隐藏窗口 隐藏运行bat文件)
  15. rancher添加镜像库
  16. Pytest setup teardown
  17. 广告公司网站该怎么做和运营
  18. 编译原理和离散数学 考研
  19. E5 2670 V1 C1 C2版本区别
  20. 数睿数据资讯 |《洞见・大咖说》对话数睿数据李争辉 探讨400%高增长背后的关键抓手

热门文章

  1. 消防自动喷水灭火系统(一)
  2. MAK vrforce 5.0 vrvantage3.0 vrengage 2.0
  3. python表达式3**2**3的值为_Python表达式 1/2 的值为 , 1//3+1//3+1//3 的值为 ,5%3的值为 。_会计基础与实务答案_学小易找答案...
  4. anki 插入表格_【anki|批量制作选择题的另一种思路】- 一点资讯(Yidianzixun.com)
  5. 最新《Python 高级运维自动化开发实战大师班》
  6. java车险源代码_车辆保险系统的设计与实现.pdf
  7. 纯CSS实现目录自动编号
  8. matplotlib绘图输出中文字体【可以使用自己下载的字体】
  9. cuMemcpyHtoDAsync failed: invalid argument
  10. python tree结构_Python入门篇-数据结构树(tree)篇