C# winform 实现微信二维码登录、第三方登录(已实现、附源码)
前言 |
应上级要求,在项目登录的时候实现第三方登录。很荣幸我接到了这个任务,但是我之前完全都没接触到。开发周期是三天,对于我们这种小白完全是从零开始。最后成功的实现这个功能固然重要,但是这个探索的过程才值得回味。光需要代码可以直接下载源码,我们重要说下实现过程和步骤,自己也巩固和记录一下!
实现步骤 |
1. 我实现的是微信扫码登录,当然要知道微信给的接口,可以在https://open.weixin.qq.com/ 这里申请开发的账号,申请完之后登录微信公众平台,点击接口权限–网页授权获取用户基本信息(如下图)
2. 微信官方还是很靠谱,里面有4步,按照这4步走是没问题的(下面主要说最重要的三步)
3. 第一步(如下图):
下面是对里面的参数的详解:
这里注意一下:回调地址最好进行UrlEncode编码。
- 第二步通过获取的code获取access_token
返回值json是这样的
- 第三步,通过获取的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 实现微信二维码登录、第三方登录(已实现、附源码)相关推荐
- Java毕设项目疫苗药品批量扫码识别追溯系统计算机(附源码+系统+数据库+LW)
Java毕设项目疫苗药品批量扫码识别追溯系统计算机(附源码+系统+数据库+LW) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也 ...
- JAVA计算机毕业设计疫苗药品批量扫码识别追溯系统计算机(附源码、数据库)
JAVA计算机毕业设计疫苗药品批量扫码识别追溯系统计算机(附源码.数据库) 项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ ...
- 仿酷狗音乐播放器开发日志二十一 开发动态调色板控件(附源码)
转载请说明原出处,谢谢~~ 上一篇仿酷狗日志结束后,整个换肤功能就只剩下调色板功能没有做了,我本以为会很简单,但是研究了酷狗的调色板功能后发现不是那么简单的事情.首先看一下酷狗的调色板的样子: 我原本 ...
- 【图像加密】基于matlab GUI正交拉丁方+二维Arnold置乱图像加密【含Matlab源码 813期】
⛄一.正交拉丁方置乱及二维Arnold置乱简介 0 引言 随着通讯技术的飞速发展, 越来越多的领域需要传送数字图像信号, 因此信息的传送安全问题显得越来越重要.通常应用于数字图像通信的两种保护技术为: ...
- springboot微信点餐系统的设计与实现 毕业设计- 附源码221541
springboot点餐微信小程序 摘 要 点餐微信小程序采用B/S模式.采用JAVA语言.springboot框架.mysql数据库.小程序框架uniapp等开工具.促进了点餐微信小程序的业务发展 ...
- Spring Boot 实现扫码登录,太赞了(附源码)!!
点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐ 点击领取全栈资料:全栈资料 一.首先咱们需要一张表 二.角色都有哪些 三.接口都需要哪些? 四.步骤 五.疯狂贴代码 springBoot中 ...
- SSM基于微信小程序的魔音影评交流平台-计算机毕设 附源码61758
SSM基于微信小程序的魔音影评交流平台 摘 要 随着人类向信息社会的不断迈进,风起云涌的信息时代正掀起一次新的革命,同时计算机网络技术高速发展,网络管理运用也变得越来越广泛.因此,建立一个基于微信小程 ...
- SSM基于微信小程序的外卖点餐系统 毕业设计-附源码2711704
基于微信小程序的外卖点餐系统的设计与实现 摘要 立足于当下餐饮行业现有的点餐模式,分析传统APP点餐的运作流程,结合微信小程序的特点设计新型的外卖点餐系统.近几年,人们生活水平日益提升,但工作强度和压 ...
- 【C#+SQL Server+打印组件】实现电商快递单打印系统 二:数据库设计与开发环境(附源码和资源)
需要源码和资源请点赞关注收藏后评论区留言私信~~~ 一.系统开发环境要求 开发快递单打印精灵项目的计算机需要满足以上条件 操作系统:windows7以上 开发环境:Visual Studio 2022 ...
最新文章
- java 升级1.8_升级java到1.8.0_111
- STM32常用数据类型 u8、u16、u32
- Python基础day05 作业解析【10道 函数作业题】
- ADB server didn't ACK * failed to start daemon * 解决方案
- [LeetCode] 21. Merge Two Sorted Lists ☆
- 自梦php,PHP菜狗自学之路 云之梦php php之窗 php脚本之
- cookie里面用到的关键字_晓龙吊打面试官系列:synchronized关键字入门(同步方法与同步代码块)...
- python中多进程及进程间通信的方法
- python udp编程_Python UDP编程小示例
- vSAN Health Service-物理磁盘运行状况-物理磁盘运行状况检索问题(2149291)
- 《Scala机器学习》一一
- IOS开发笔记_5.线程,HTTP请求,定时器
- matlab遗传算法 系统辨识,基于遗传算法的控制系统的系统辨识
- 运行bat时隐藏cmd窗口的方法(bat隐藏窗口 隐藏运行bat文件)
- rancher添加镜像库
- Pytest setup teardown
- 广告公司网站该怎么做和运营
- 编译原理和离散数学 考研
- E5 2670 V1 C1 C2版本区别
- 数睿数据资讯 |《洞见・大咖说》对话数睿数据李争辉 探讨400%高增长背后的关键抓手
热门文章
- 消防自动喷水灭火系统(一)
- MAK vrforce 5.0 vrvantage3.0 vrengage 2.0
- python表达式3**2**3的值为_Python表达式 1/2 的值为 , 1//3+1//3+1//3 的值为 ,5%3的值为 。_会计基础与实务答案_学小易找答案...
- anki 插入表格_【anki|批量制作选择题的另一种思路】- 一点资讯(Yidianzixun.com)
- 最新《Python 高级运维自动化开发实战大师班》
- java车险源代码_车辆保险系统的设计与实现.pdf
- 纯CSS实现目录自动编号
- matplotlib绘图输出中文字体【可以使用自己下载的字体】
- cuMemcpyHtoDAsync failed: invalid argument
- python tree结构_Python入门篇-数据结构树(tree)篇