C#实现的微信网页授权操作逻辑封装示例
更新时间:2020年6月25日 11:22 点击:3066
本文实例讲述了C#实现的微信网页授权操作逻辑封装。分享给大家供大家参考,具体如下:
一、微信网页授权登录
前提:
1.已经获取的接口权限,如果是测试账号就已经有权限了
2.配置接口的授权域名
更多说明可以参考方倍工作室:http://www.cnblogs.com/txw1958/p/weixin71-oauth20.html
或者官网API:http://mp.weixin.qq.com/wiki/17/c0f37d5704f0b64713d5d2c37b468d75.html
步骤:
1.用户同意授权,获取code
2.根据code 获取access_token及当前操作用户的openid、unionid
3.根据openid获取用户基本信息(如果需要的话)
注:如果想在网站使用扫一扫,授权登录,可以讲 _oauth.GetCodeUrl() 授权地址生成二维码来使用
C#封装微信网页授权登录使用实例:
string appid = "wx145b4a8fd07b24e8"; string appsecrect = "fe6951dcb99772411c42f724b1336065"; string redirect_url = "配置域名下的回调地址"; OAuthManage _oauth = null; /// <summary> ///控制器构造函数 /// </summary> public UserController() { _oauth = new OAuthManage(appid, appsecrect, redirect_url); } /// <summary> /// 授权登录 /// </summary> /// <returns></returns> public ActionResult AuthLogin() { ViewBag.url = _oauth.GetCodeUrl(); return View(); } /// <summary> /// 回调处理 /// </summary> /// <returns></returns> public ActionResult OAuthHandle() { string result = ""; //注册事件处理 _oauth.OnError = (e) => { string msg = ""; Exception inner = e; while (inner != null) { msg += inner.Message; inner = inner.InnerException; } result = msg; LogOperate.Write(msg); }; _oauth.OnGetTokenSuccess = (token) => { result += "<br/>"; result += token.ToJsonString(); }; _oauth.OnGetUserInfoSuccess = (user) => { result += "<br/>"; result += user.ToJsonString(); }; //第二步 _oauth.GetAccess_Token(); //第三步 _oauth.GetUserInfo(); //显示结果 ViewBag.msg = result; return View(); }
封装代码类定义:
namespace WXPackage { /// <summary> /// 网页授权逻辑处理, /// 处理三步操作,处理成功,返回用户基本信息 /// </summary> public class OAuthManage { #region 基本信息定义 /// <summary> /// 公众号的唯一标识 /// </summary> private string appid; /// <summary> /// 公众号的appsecret /// </summary> private string secret; /// <summary> /// 回调url地址 /// </summary> private string redirect_uri; /// <summary> /// 获取微信用户基本信息使用snsapi_userinfo模式 /// 如果使用静默授权,无法获取用户基本信息但可以获取到openid /// </summary> private string scope; public OAuthManage(string appid, string appsecret, string redirect_uri, bool IsUserInfo = true) { this.appid = appid; this.secret = appsecret; this.redirect_uri = redirect_uri; this.scope = IsUserInfo ? "snsapi_userinfo" : "snsapi_base"; } #endregion #region 请求过程信息 /// <summary> /// 第一步获取到的Code 值 /// </summary> public string Code { get; set; } /// <summary> /// 第二步获取到的access_token及相关数据 /// </summary> public OAuthAccess_Token TokenData = null; #endregion #region 事件定义 /// <summary> /// 当处理出现异常时,触发 /// </summary> public Action<Exception> OnError = null; /// <summary> /// 当获取AccessToken成功是触发 /// </summary> public Action<OAuthAccess_Token> OnGetTokenSuccess = null; /// <summary> /// 当获取用户信息成功时触发 /// </summary> public Action<OAuthUser> OnGetUserInfoSuccess = null; #endregion #region 第二步,回调处理 /// <summary> /// 第二步,通过code换取网页授权access_token /// </summary> public void GetAccess_Token() { try { //1.处理跳转 this.Code = ReqHelper.GetString("code"); if (string.IsNullOrEmpty(this.Code)) throw new Exception("获取code参数失败或用户禁止授权获取基本信息"); //1.发送获取access_token请求 string url = GetAccess_TokenUrl(); string result = NetHelper.Get(url); //2.解析相应结果 TokenData = JsonConvert.DeserializeObject<OAuthAccess_Token>(result); if (TokenData == null) throw new Exception("反序列化结果失败,返回内容为:" + result); //3.获取成功 if (OnGetTokenSuccess != null) OnGetTokenSuccess(TokenData); } catch (Exception ex) { Error("第二步,通过code换取网页授权access_token异常", ex); } } /// <summary> /// 刷新当前access_token /// </summary> public OAuthAccess_Token RefreshAccess_Token() { try { //1.发送请求 string url = GetReferesh_TokenUrl(); string result = NetHelper.Get(url); //2.解析结果 OAuthAccess_Token token = JsonConvert.DeserializeObject<OAuthAccess_Token>(result); if (token == null) throw new Exception("反序列化结果失败,返回内容:" + result); return token; } catch (Exception ex) { Error("刷新当前access_token失败", ex); return null; } } #endregion #region 第三步,获取用户基本信息 /// <summary> /// 第三步,获取基本信息 /// </summary> public void GetUserInfo() { try { //1.发送get请求 string url = GetUserInfoUrl(); string result = NetHelper.Get(url); //2.解析结果 OAuthUser user = JsonConvert.DeserializeObject<OAuthUser>(result); if (user == null) throw new Exception("反序列化结果失败,返回内容:" + result); //3.获取成功 if (OnGetUserInfoSuccess != null) OnGetUserInfoSuccess(user); } catch (Exception ex) { Error("第三步、获取用户基本信息异常", ex); } } #endregion #region 静态方法 /// <summary> /// 验证授权凭证是否有效 /// </summary> /// <param name="access_token">access_token</param> /// <param name="openid">用户针对当前公众号的openid</param> /// <returns></returns> public static bool CheckWebAccess_Token(string access_token, string openid) { try { string url = string.Format("https://api.weixin.qq.com/sns/auth?access_token={0}&openid={1}", access_token, openid); string result = NetHelper.Get(url); JObject obj = JObject.Parse(result); int errcode = (int)obj["errcode"]; return errcode == 0; } catch (Exception ex) { throw new Exception("," + ex.Message); } } #endregion #region 获取请求连接 /// <summary> /// 获取Code的url 地址 /// </summary> /// <returns></returns> public string GetCodeUrl() { string url = string.Format("https://open.weixin.qq.com/connect/oauth2/authorize?appid={0}&redirect_uri={1}&response_type=code&scope={2}&state=STATE#wechat_redirect", this.appid, SecurityHelper.UrlEncode(this.redirect_uri), this.scope); return url; } /// <summary> /// 获取access_token的url地址 /// </summary> /// <returns></returns> private string GetAccess_TokenUrl() { string url = string.Format("https://api.weixin.qq.com/sns/oauth2/access_token?appid={0}&secret={1}&code={2}&grant_type=authorization_code", this.appid, this.secret, this.Code); return url; } /// <summary> /// 获取刷新AccessToke的地址 /// </summary> /// <returns></returns> private string GetReferesh_TokenUrl() { string url = string.Format("https://api.weixin.qq.com/sns/oauth2/refresh_token?appid={0}&grant_type=refresh_token&refresh_token={1}", this.appid, this.TokenData.refresh_token ); return url; } /// <summary> /// 获取用户基本信息地址 /// </summary> /// <returns></returns> private string GetUserInfoUrl() { string url = string.Format("https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN", this.TokenData.access_token, this.TokenData.openid); return url; } #endregion private void Error(string msg, Exception inner) { if (this.OnError != null) { this.OnError(new Exception(msg, inner)); } } } /// <summary> /// 授权之后获取用户基本信息 /// </summary> public class OAuthUser { public string openid { get; set; } public string nickname { get; set; } public int sex { get; set; } public string province { get; set; } public string city { get; set; } public string country { get; set; } public string headimgurl { get; set; } /// <summary> /// 用户特权信息,json 数组 /// </summary> public JArray privilege { get; set; } public string unionid { get; set; } } /// <summary> /// 获取Access_Token或者刷新返回的数据对象 /// </summary> public class OAuthAccess_Token { public string access_token { get; set; } public int expires_in { get; set; } public string refresh_token { get; set; } /// <summary> /// 用户针对当前公众号的唯一标识 /// 关注后会产生,返回公众号下页面也会产生 /// </summary> public string openid { get; set; } public string scope { get; set; } /// <summary> /// 当前用户的unionid,只有在用户将公众号绑定到微信开放平台帐号后 /// </summary> public string unionid { get; set; } } }
更多关于C#相关内容感兴趣的读者可查看本站专题:《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数据结构与算法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结》
希望本文所述对大家C#程序设计有所帮助。
上一篇: .NET的深复制方法(以C#语言为例)
下一篇: C#中常用的正则表达式实例
相关文章
- 我们在使用C#做项目的时候,基本上都需要制作登录界面,那么今天我们就来一步步看看,如果简单的实现登录界面呢,本文给出2个例子,由简入难,希望大家能够喜欢。...2020-06-25
- 这篇文章主要介绍了C# 字段和属性的的相关资料,文中示例代码非常详细,供大家参考和学习,感兴趣的朋友可以了解下...2020-11-03
- 这篇文章主要介绍了C#中截取字符串的的基本方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-11-03
- 这篇文章主要介绍了C#实现简单的Http请求的方法,以实例形式较为详细的分析了C#实现Http请求的具体方法,需要的朋友可以参考下...2020-06-25
- 本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
- 本文主要介绍了C#中new的几种用法,具有很好的参考价值,下面跟着小编一起来看下吧...2020-06-25
使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序)
这篇文章主要介绍了使用Visual Studio2019创建C#项目(窗体应用程序、控制台应用程序、Web应用程序),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25- 这篇文章主要介绍了C#开发Windows窗体应用程序的简单操作步骤,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-04-12
- 这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
- 最近做一个小项目不可避免的需要前端脚本与后台进行交互。由于是在asp.net中实现,故问题演化成asp.net中jiavascript与后台c#如何进行交互。...2020-06-25
- 本文通过例子,讲述了C++调用C#的DLL程序的方法,作出了以下总结,下面就让我们一起来学习吧。...2020-06-25
- 轻松学习C#的基础入门,了解C#最基本的知识点,C#是一种简洁的,类型安全的一种完全面向对象的开发语言,是Microsoft专门基于.NET Framework平台开发的而量身定做的高级程序设计语言,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C#变量命名规则小结,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下...2021-09-09
- 这篇文章主要介绍了C#绘制曲线图的方法,以完整实例形式较为详细的分析了C#进行曲线绘制的具体步骤与相关技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25
- 本文主要介绍了C# 中取绝对值的函数。具有很好的参考价值。下面跟着小编一起来看下吧...2020-06-25
- 这篇文章主要介绍了c#自带缓存使用方法,包括获取数据缓存、设置数据缓存、移除指定数据缓存等方法,需要的朋友可以参考下...2020-06-25
- 这篇文章主要介绍了c#中(&&,||)与(&,|)的区别详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧...2020-06-25
- 这篇文章主要用实例讲解C#递归算法的概念以及用法,文中代码非常详细,帮助大家更好的参考和学习,感兴趣的朋友可以了解下...2020-06-25
- 下面小编就为大家带来一篇C#学习笔记- 随机函数Random()的用法详解。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧...2020-06-25
- 这篇文章主要介绍了C#中list用法,结合实例形式分析了C#中list排序、运算、转换等常见操作技巧,具有一定参考借鉴价值,需要的朋友可以参考下...2020-06-25