博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
微信网页授权操作逻辑封装-C#实例
阅读量:4287 次
发布时间:2019-05-27

本文共 7540 字,大约阅读时间需要 25 分钟。

一、微信网页授权登录

前提:

1.已经获取的接口权限,如果是测试账号就已经有权限了

2.配置接口的授权域名

更多说明可以参考:

或者官网API:

步骤:

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;/// ///控制器构造函数/// public UserController(){    _oauth = new OAuthManage(appid, appsecrect, redirect_url);}/// /// 授权登录/// /// 
public ActionResult AuthLogin(){ ViewBag.url = _oauth.GetCodeUrl(); return View();}/// /// 回调处理/// ///
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 += "
"; result += token.ToJsonString(); }; _oauth.OnGetUserInfoSuccess = (user) => { result += "
"; result += user.ToJsonString(); }; //第二步 _oauth.GetAccess_Token(); //第三步 _oauth.GetUserInfo(); //显示结果 ViewBag.msg = result; return View();}

封装代码类定义:

namespace WXPackage{    ///     /// 网页授权逻辑处理,    /// 处理三步操作,处理成功,返回用户基本信息    ///     public class OAuthManage    {        #region 基本信息定义        ///         /// 公众号的唯一标识        ///         private string appid;        ///         /// 公众号的appsecret        ///         private string secret;        ///         /// 回调url地址        ///         private string redirect_uri;        ///         /// 获取微信用户基本信息使用snsapi_userinfo模式        /// 如果使用静默授权,无法获取用户基本信息但可以获取到openid        ///         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 请求过程信息        ///         /// 第一步获取到的Code 值        ///         public string Code { get; set; }        ///         /// 第二步获取到的access_token及相关数据        ///         public OAuthAccess_Token TokenData = null;        #endregion        #region 事件定义        ///         /// 当处理出现异常时,触发        ///         public Action
OnError = null; ///
/// 当获取AccessToken成功是触发 /// public Action
OnGetTokenSuccess = null; ///
/// 当获取用户信息成功时触发 /// public Action
OnGetUserInfoSuccess = null; #endregion #region 第二步,回调处理 ///
/// 第二步,通过code换取网页授权access_token /// 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
(result); if (TokenData == null) throw new Exception("反序列化结果失败,返回内容为:" + result); //3.获取成功 if (OnGetTokenSuccess != null) OnGetTokenSuccess(TokenData); } catch (Exception ex) { Error("第二步,通过code换取网页授权access_token异常", ex); } } ///
/// 刷新当前access_token /// public OAuthAccess_Token RefreshAccess_Token() { try { //1.发送请求 string url = GetReferesh_TokenUrl(); string result = NetHelper.Get(url); //2.解析结果 OAuthAccess_Token token = JsonConvert.DeserializeObject
(result); if (token == null) throw new Exception("反序列化结果失败,返回内容:" + result); return token; } catch (Exception ex) { Error("刷新当前access_token失败", ex); return null; } } #endregion #region 第三步,获取用户基本信息 ///
/// 第三步,获取基本信息 /// public void GetUserInfo() { try { //1.发送get请求 string url = GetUserInfoUrl(); string result = NetHelper.Get(url); //2.解析结果 OAuthUser user = JsonConvert.DeserializeObject
(result); if (user == null) throw new Exception("反序列化结果失败,返回内容:" + result); //3.获取成功 if (OnGetUserInfoSuccess != null) OnGetUserInfoSuccess(user); } catch (Exception ex) { Error("第三步、获取用户基本信息异常", ex); } } #endregion #region 静态方法 ///
/// 验证授权凭证是否有效 /// ///
access_token ///
用户针对当前公众号的openid ///
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 获取请求连接 ///
/// 获取Code的url 地址 /// ///
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; } ///
/// 获取access_token的url地址 /// ///
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; } ///
/// 获取刷新AccessToke的地址 /// ///
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; } ///
/// 获取用户基本信息地址 /// ///
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)); } } } ///
/// 授权之后获取用户基本信息 /// 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; } ///
/// 用户特权信息,json 数组 /// public JArray privilege { get; set; } public string unionid { get; set; } } ///
/// 获取Access_Token或者刷新返回的数据对象 /// public class OAuthAccess_Token { public string access_token { get; set; } public int expires_in { get; set; } public string refresh_token { get; set; } ///
/// 用户针对当前公众号的唯一标识 /// 关注后会产生,返回公众号下页面也会产生 /// public string openid { get; set; } public string scope { get; set; } ///
/// 当前用户的unionid,只有在用户将公众号绑定到微信开放平台帐号后 /// public string unionid { get; set; } }}

更多:

转载地址:http://afogi.baihongyu.com/

你可能感兴趣的文章
Spinner 和 ArrayAdapter 的用法
查看>>
startActivity(),startActivityForResult(),
查看>>
Back键
查看>>
程序的暂停sleep(),wait()
查看>>
Java,android涉及的所有数据类型
查看>>
android View控件布局
查看>>
android PowerManager电源管理
查看>>
android 系统广播
查看>>
android 广播的使用与开发
查看>>
web客户端的存储
查看>>
重定向
查看>>
HTML,CSS,font-family:中文字体的英文名称 (宋体 微软雅黑)
查看>>
Javascritpt UI
查看>>
MSXML2.DOMDocument
查看>>
Microsoft.XMLDOM组件
查看>>
Microsoft.XMLHttp组件简介及使用方法
查看>>
几种http相关的windows组件及创建
查看>>
javascript操作XML
查看>>
Javascript跨域请求的几种解决方法
查看>>
php读写xml
查看>>