C#实现的微信网页授权操作逻辑封装示例
本文实例讲述了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#封装微信网页授权登录使用实例:
stringappid="wx145b4a8fd07b24e8"; stringappsecrect="fe6951dcb99772411c42f724b1336065"; stringredirect_url="配置域名下的回调地址"; OAuthManage_oauth=null; ///<summary> ///控制器构造函数 ///</summary> publicUserController() { _oauth=newOAuthManage(appid,appsecrect,redirect_url); } ///<summary> ///授权登录 ///</summary> ///<returns></returns> publicActionResultAuthLogin() { ViewBag.url=_oauth.GetCodeUrl(); returnView(); } ///<summary> ///回调处理 ///</summary> ///<returns></returns> publicActionResultOAuthHandle() { stringresult=""; //注册事件处理 _oauth.OnError=(e)=> { stringmsg=""; Exceptioninner=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; returnView(); }
封装代码类定义:
namespaceWXPackage { ///<summary> ///网页授权逻辑处理, ///处理三步操作,处理成功,返回用户基本信息 ///</summary> publicclassOAuthManage { #region基本信息定义 ///<summary> ///公众号的唯一标识 ///</summary> privatestringappid; ///<summary> ///公众号的appsecret ///</summary> privatestringsecret; ///<summary> ///回调url地址 ///</summary> privatestringredirect_uri; ///<summary> ///获取微信用户基本信息使用snsapi_userinfo模式 ///如果使用静默授权,无法获取用户基本信息但可以获取到openid ///</summary> privatestringscope; publicOAuthManage(stringappid,stringappsecret,stringredirect_uri,boolIsUserInfo=true) { this.appid=appid; this.secret=appsecret; this.redirect_uri=redirect_uri; this.scope=IsUserInfo?"snsapi_userinfo":"snsapi_base"; } #endregion #region请求过程信息 ///<summary> ///第一步获取到的Code值 ///</summary> publicstringCode{get;set;} ///<summary> ///第二步获取到的access_token及相关数据 ///</summary> publicOAuthAccess_TokenTokenData=null; #endregion #region事件定义 ///<summary> ///当处理出现异常时,触发 ///</summary> publicAction<Exception>OnError=null; ///<summary> ///当获取AccessToken成功是触发 ///</summary> publicAction<OAuthAccess_Token>OnGetTokenSuccess=null; ///<summary> ///当获取用户信息成功时触发 ///</summary> publicAction<OAuthUser>OnGetUserInfoSuccess=null; #endregion #region第二步,回调处理 ///<summary> ///第二步,通过code换取网页授权access_token ///</summary> publicvoidGetAccess_Token() { try { //1.处理跳转 this.Code=ReqHelper.GetString("code"); if(string.IsNullOrEmpty(this.Code)) thrownewException("获取code参数失败或用户禁止授权获取基本信息"); //1.发送获取access_token请求 stringurl=GetAccess_TokenUrl(); stringresult=NetHelper.Get(url); //2.解析相应结果 TokenData=JsonConvert.DeserializeObject<OAuthAccess_Token>(result); if(TokenData==null) thrownewException("反序列化结果失败,返回内容为:"+result); //3.获取成功 if(OnGetTokenSuccess!=null) OnGetTokenSuccess(TokenData); } catch(Exceptionex) { Error("第二步,通过code换取网页授权access_token异常",ex); } } ///<summary> ///刷新当前access_token ///</summary> publicOAuthAccess_TokenRefreshAccess_Token() { try { //1.发送请求 stringurl=GetReferesh_TokenUrl(); stringresult=NetHelper.Get(url); //2.解析结果 OAuthAccess_Tokentoken=JsonConvert.DeserializeObject<OAuthAccess_Token>(result); if(token==null) thrownewException("反序列化结果失败,返回内容:"+result); returntoken; } catch(Exceptionex) { Error("刷新当前access_token失败",ex); returnnull; } } #endregion #region第三步,获取用户基本信息 ///<summary> ///第三步,获取基本信息 ///</summary> publicvoidGetUserInfo() { try { //1.发送get请求 stringurl=GetUserInfoUrl(); stringresult=NetHelper.Get(url); //2.解析结果 OAuthUseruser=JsonConvert.DeserializeObject<OAuthUser>(result); if(user==null) thrownewException("反序列化结果失败,返回内容:"+result); //3.获取成功 if(OnGetUserInfoSuccess!=null) OnGetUserInfoSuccess(user); } catch(Exceptionex) { Error("第三步、获取用户基本信息异常",ex); } } #endregion #region静态方法 ///<summary> ///验证授权凭证是否有效 ///</summary> ///<paramname="access_token">access_token</param> ///<paramname="openid">用户针对当前公众号的openid</param> ///<returns></returns> publicstaticboolCheckWebAccess_Token(stringaccess_token,stringopenid) { try { stringurl=string.Format("https://api.weixin.qq.com/sns/auth?access_token={0}&openid={1}", access_token, openid); stringresult=NetHelper.Get(url); JObjectobj=JObject.Parse(result); interrcode=(int)obj["errcode"]; returnerrcode==0; } catch(Exceptionex) { thrownewException(","+ex.Message); } } #endregion #region获取请求连接 ///<summary> ///获取Code的url地址 ///</summary> ///<returns></returns> publicstringGetCodeUrl() { stringurl=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); returnurl; } ///<summary> ///获取access_token的url地址 ///</summary> ///<returns></returns> privatestringGetAccess_TokenUrl() { stringurl=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); returnurl; } ///<summary> ///获取刷新AccessToke的地址 ///</summary> ///<returns></returns> privatestringGetReferesh_TokenUrl() { stringurl=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 ); returnurl; } ///<summary> ///获取用户基本信息地址 ///</summary> ///<returns></returns> privatestringGetUserInfoUrl() { stringurl=string.Format("https://api.weixin.qq.com/sns/userinfo?access_token={0}&openid={1}&lang=zh_CN", this.TokenData.access_token, this.TokenData.openid); returnurl; } #endregion privatevoidError(stringmsg,Exceptioninner) { if(this.OnError!=null) { this.OnError(newException(msg,inner)); } } } ///<summary> ///授权之后获取用户基本信息 ///</summary> publicclassOAuthUser { publicstringopenid{get;set;} publicstringnickname{get;set;} publicintsex{get;set;} publicstringprovince{get;set;} publicstringcity{get;set;} publicstringcountry{get;set;} publicstringheadimgurl{get;set;} ///<summary> ///用户特权信息,json数组 ///</summary> publicJArrayprivilege{get;set;} publicstringunionid{get;set;} } ///<summary> ///获取Access_Token或者刷新返回的数据对象 ///</summary> publicclassOAuthAccess_Token { publicstringaccess_token{get;set;} publicintexpires_in{get;set;} publicstringrefresh_token{get;set;} ///<summary> ///用户针对当前公众号的唯一标识 ///关注后会产生,返回公众号下页面也会产生 ///</summary> publicstringopenid{get;set;} publicstringscope{get;set;} ///<summary> ///当前用户的unionid,只有在用户将公众号绑定到微信开放平台帐号后 ///</summary> publicstringunionid{get;set;} } }
更多关于C#相关内容感兴趣的读者可查看本站专题:《C#常见控件用法教程》、《WinForm控件用法总结》、《C#数据结构与算法教程》、《C#面向对象程序设计入门教程》及《C#程序设计之线程使用技巧总结》
希望本文所述对大家C#程序设计有所帮助。