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#程序设计有所帮助。