网上很多的资料都是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 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>/// 将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();//微信最终获得的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 Model = Get_token(code);  //获取access_tokenOAuthUser OAuthUser_Model = Get_UserInfo(Model.access_token, Model.openid);//获取用户信息

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

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

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

转载于:https://www.cnblogs.com/hnsongbiao/p/7837127.html

C# winform C/S WebBrowser 微信第三方登录相关推荐

  1. php手机注册和微信登录统一,微信第三方登录账户统一的问题

    微信公众号的 open_id和PC上的微信第三方登录 open_id 是一致的吗? 按照微信公众平台的文档 open_id应该是针对当前账户或者说是应用的,换句话说不同账号和应该应该是不一样的,那么如 ...

  2. 微信第三方登录测试时报Scope参数错误或没有Scope权限解决方法

    微信第三方登录测试时报Scope参数错误或没有Scope权限解决方法 参考文章: (1)微信第三方登录测试时报Scope参数错误或没有Scope权限解决方法 (2)https://www.cnblog ...

  3. iOS微信第三方登录实现

    iOS微信第三方登录实现 字数2824 阅读7603 评论19 喜欢46 注意:代码自己动手写,不要复制! 一.接入微信第三方登录准备工作. 移动应用微信登录是基于OAuth2.0协议标准构建的微信O ...

  4. php实例-微信第三方登录

    下面小编就为大家带来一篇微信第三方登录(原生)demo[必看篇].小编觉得挺不错的,现在就分享给大家,也给大家做个参考.一起跟随小编过来看看吧 在一家ecstore二开公司有一段时间了,公司希望往自己 ...

  5. 微信第三方登录,主要手机没有安装微信处理

    现在处理微信第三方处理的方法百度下有很多,这里主要说一下如果手机没有安装微信的处理. 前一段时间朋友由于没有对手机未安装微信做处理,被苹果审核组给拒绝了,主要原因就是说微信第三方登录没有对未安装微信的 ...

  6. apicloud——微信第三方登录、apple登录

    apicloud中微信第三方登录的问题 混合开发移动应用很火啊现在,多数公司都要求是必备技能,或者加分技能,所以学习来了 如下是作为前端工作者应该了解的内容,更加详细的前往官方示例 *** 结合api ...

  7. QQ 微信 第三方登录 分享

    </pre>一些基础性的东西我就不说了,至于怎么去下载SDK,什么的相信都知道<p></p><p>QQ </p><p>1.第三方 ...

  8. 微信第三方登录接口开发

    微信登录接口开发须知 APP登录接口 PC网站登录接口 微信移动网页登录接口(又称微信公众号授权登录) 移动端非微信自带浏览不支持微信登录 微信移动网页登录接口(又称微信公众号授权登录) 先要与开放平 ...

  9. 微信第三方登录前后端分离实现思路

    微信第三方登录前后端分离实现思路 前端实现 这里说一下前后端的思路,页面加载时声明一个变量state='时间戳+6位随机数', 前端路径生成二维码, 其中有个state参数需要我们传递,这个参数你传什 ...

最新文章

  1. React和vue的差异和相似地方
  2. 有关C语言指针学习思想的随笔常用形式的总结(原创)
  3. qlabel 边加载边更新_盘点十四款国产进口边三轮,挎斗子摩托车,售价从1万至60多万...
  4. Python自然语言处理学习笔记(7):1.5 自动理解自然语言
  5. java持久性与安全性_Java持久性锁定初学者指南
  6. 【古典入门】巴洛克音乐家-斯卡拉蒂
  7. 机器人建模中移动关节如何建立坐标系_机器人标准DH建模法
  8. mysql frm 没有myd_MySQL表只对应一个.frm文件,没有.MYD 和.MYI文件
  9. Java高阶入门N篇
  10. C语言入门经典(第5版)
  11. 基于springboot网上订餐系统设计与实现
  12. Bean的生命周期详解
  13. redis数据类型之HashSet
  14. 机器学习(八):样本分布不均衡问题的处理
  15. 地理信息系统名词解释大全(三)
  16. Xmanager 5 远程连接linux图形界面
  17. 华为大手机 m3 linux,华为平板 M3(青春版10.1英寸 全网通)手机完美获取root教程,最强root工具,亲测可用!...
  18. 【附源码】计算机毕业设计SSM社区生鲜电商平台
  19. 黑马大数据分析课程---1、大数据分析介绍
  20. 计算机专业不会打字怎么办,科目一考试电脑怎么用?科目一不会打字怎么办

热门文章

  1. 万万没想到,分布式存储系统的一致性是......
  2. java 参数传递_java中方法的参数传递机制
  3. 有关手游设计ICON的几点建议
  4. 如何构建自己的游戏框架并且制作游戏
  5. 我的Go+语言初体验——【三、spx案例测试(附-视频)】
  6. Python编程专属骚技巧8
  7. 常用Java面试题 List集合
  8. RAC环境在ASM上创建表空间出错ORA-569
  9. Oracle之AUTHID CURRENT_USER
  10. 如何删除非当前用户下的JOB