18910140161

C#实现的微信网页授权操作逻辑封装示例

顺晟科技

2021-06-16 10:39:51

217

本文实例讲述了C#实现的微信网页授权操作逻辑封装。分享给大家供大家参考,具体如下:一、微信网页授权登录前提:1.已经获取的接口权限,如果是测试账号就已经有权限了2.配置接口的授权域名更多说明可以参考方倍工作室:http://www .cn博客。com/txw 1958/p/weixin 71-oauth 20。超文本标记语言或者官网API:http://MP。微信。QQ。com/wiki/17/c0f 37d 5704 f 0 b 64713 D5 d2c 37b 468d 75。超文本标记语言步骤:1.用户同意授权,获取代码2。根据密码获取access_token及当前操作用户的openid、unionid3 .根据信息获取用户基本信息(如果需要的话)注:如果想在网站使用扫一扫,授权登录,可以讲_oauth .GetCodeUrl()授权地址生成二维码来使用C#封装微信网页授权登录使用实例:

string appid=' wx 145 B4 A8 FD 07 b 24 e 8 ';

string app secret=' Fe 6951 dcb 99772411 c 42 f 724 b 1336065 ';

字符串重定向_url='配置域名下的回调地址;

OAuthManage _ oauth=null

///摘要

///控制器构造函数

////摘要

公共用户控制器()

{

_oauth=new OAuthManage(appid,appsecrect,redirect _ URL);

}

///摘要

///授权登录

////摘要

///返回/返回

公共操作结果身份验证登录()

{

ViewBag.url=_ oauth .GetCodeUrl();

返回视图();

}

///摘要

///回调处理

////摘要

///返回/返回

public ActionResult OAuthHandle()

{

字符串结果=' ';

//注册事件处理

_oauth .OnError=(e)=

{

字符串消息=

异常inner=e;

while (inner!=null)

{

消息=内部。消息;

内心=内心内部异常

}

结果=msg

登录操作. write(msg);

};

_oauth .OnGetTokenSuccess=(令牌)=

{

结果=' br/';

结果=令牌tojsonString();

};

_oauth .OnGetUserInfoSuccess=(用户)=

{

结果=' br/';

结果=用户tojsonString();

};

//第二步

_oauth .GetAccess _ Token();

//第三步

_oauth .GetUserInfo();

//显示结果

ViewBag.msg=结果

返回视图();

}

封装代码类定义:

命名空间WXPackage

{

///摘要

///网页授权逻辑处理,

///处理三步操作,处理成功,返回用户基本信息

////摘要

公共类OAuthManage

{

#地区基本信息定义

///摘要

///公众号的标识

////摘要

私有字符串应用编号

///摘要

///公众号的密钥

////摘要

私有字符串秘密;

///摘要

///回调全球资源定位器(统一资源定位符)地址

////摘要

私有字符串重定向uri)

///摘要

///获取微信用户基本信息使用snsapi_userinfo模式

///如果使用静默授权,无法获取用户基本信息但可以获取到信息

////摘要

私有字符串范围;

public OAuthManage(string appid,string appsecret,string redirect_uri,bool IsUserInfo=true)

{

this.appid=appid

this.secret=appsecret

this.redirect_uri=重定向_ uri

this.scope=IsUserInfo?SNS API _用户信息' : ' SNS API _ base

}

#endregion

#地区请求过程信息

///摘要

///步获取到的密码值

////摘要

公共字符串代码{获取设置;}

///摘要

///第二步获取到的access_token及相关数据

////摘要

公共OAuth访问_令牌令牌数据=空;

#endregion

#地区事件定义

///摘要

///当处理出现异常时,触发

////摘要

公共操作异常OnError=空;

///摘要

///当获取访问令牌成功是触发

////摘要

public action oauth access _ Token OnGetokenSuccesss=null;

///摘要

///当获取用户信息成功时触发

////摘要

public actionoauthuuseongetuserinfosuccesss=null;

#endregion

#地区第二步,回调处理

///摘要

///第二步,通过密码换取网页授权access_token

////摘要

public void GetAccess_Token()

{

尝试

{

//1.处理跳转

这个代码=请求帮助者.getStrIng(' code ');

if (string .IsNullOrEmpty(此。代码))

引发新的异常('获取密码参数失败或用户禁止授权获取基本信息');

//1.发送获取access_token请求

string URL=GetACCESS _ TokenURL();

字符串结果=NetHelper .get(URL);

//2.解析相应结果

标记数据=JsonConvert .反序列化对象授权访问令牌(结果);

if(令牌数据==null)

引发新的异常('反序列化结果失败,返回内容为:' result);

//3.获取成功

如果(OnGetokenSuccess!=null)

OnGetTokenSuccess(令牌数据);

}

捕获(异常ex)

{

错误('第二步,通过密码换取网页授权access_token异常,ex);

}

}

///摘要

///刷新当前access_token

////摘要

公共oauth访问_令牌刷新访问_令牌()

{

尝试

{

//1.发送请求

string URL=GetReferesh _ TokenURL();

字符串结果=NetHelper .get(URL);

//2.解析结果

oauth access _ Token Token=JSonConvert .反序列化对象授权访问令牌(结果);

if (token==null)

引发新的异常('反序列化结果失败,返回内容:' result);

返回令牌;

}

捕获(异常ex)

{

错误('刷新当前access_token失败,ex);

返回空

}

}

#endregion

#地区第三步,获取用户基本信息

///摘要

///第三步,获取基本信息

////摘要

public void GetUserInfo()

{

尝试

{

//1.发送得到请求

string URL=GetUserInfoURL();

字符串结果=NetHelper .get(URL);

//2.解析结果

OAuthUser user=JsonConvert .反序列化对象用户(结果);

if (user==null)

引发新的异常('反序列化结果失败,返回内容:' result);

//3.获取成功

if (OnGetUserInfoSuccess!=null)

OnGetUserInfoSuccess(用户);

}

捕获(异常ex)

{

错误('第三步、获取用户基本信息异常,ex);

}

}

#endregion

#地区静态方法

///摘要

///验证授权凭证是否有效

////摘要

///param name=' access _ token ' access _ token/param

///param name='openid '用户针对当前公众号的openid/param

///返回/返回

公共静态bool CheckWebAccess _ Token(字符串Access _ Token,字符串openid)

{

尝试

{

字符串url=字符串。格式(' https://API。微信。QQ。com/SNS/auth?access_token={0}openid={1} ',

access_token,

OpenID);

字符串结果=NetHelper .get(URL);

作业对象对象=作业对象.解析(结果);

int errcode=(int)obj[' errcode '];

return errcode==0;

}

捕获(异常ex)

{

引发新的异常(',' ex .消息);

}

}

#endregion

#地区获取请求连接

///摘要

///获取密码的全球资源定位器(统一资源定位符)地址

////摘要

///返回/返回

公共字符串GetCodeUrl()

{

字符串url=字符串. format(' https://open。微信。QQ。com/connect/oauth 2/authorize?appid={ 0 } redirect _ uri={ 1 } response _ type=code scope={ 2 } STATE=STATE #微信_重定向',

this.appid,

安全帮助.UrlEncode(this.redirect_uri),

这个。范围);

返回全球资源定位器(Uniform Resource Locator)

}

///摘要

///获取access_token的全球资源定位器(统一资源定位符)地址

////摘要

///返回/返回

私有字符串GetAccess_TokenUrl()

{

字符串url=字符串. format(' https://API。微信。QQ。com/SNS/oauth 2/access _ token?appid={ 0 } secret={ 1 } code={ 2 } grant _ type=authorization _ code ',

this.appid,

这个秘密,

这个。代码);

返回全球资源定位器(Uniform Resource Locator)

}

///摘要

///获取刷新AccessToke的地址

////摘要

///返回/返回

私有字符串GetReferesh_TokenUrl()

{

字符串url=字符串. format(' https://API。微信。QQ。com/SNS/oauth 2/refresh _ token?appid={ 0 } grant _ type=refresh _ token refresh _ token={ 1 } ',

this.appid,

这个令牌数据.刷新_令牌

);

返回全球资源定位器(Uniform Resource Locator)

}

///摘要

///获取用户基本信息地址

////摘要

///返回/返回

私有字符串GetUserInfoUrl()

{

字符串url=字符串。格式(' https://API。微信。QQ。com/SNS/用户信息?access _ token={ 0 } OpenID={ 1 } lang=zh _ CN ',

这个令牌数据.访问_令牌,

这个令牌数据。open id);

返回全球资源定位器(Uniform Resource Locator)

}

#endregion

私有无效错误(字符串消息,内部异常)

{

如果(这个.OnError!=null)

{

这个OnError(新异常(消息,内部));

}

}

}

///摘要

///授权之后获取用户基本信息

////摘要

公共类OAuthUser

{

公共字符串openid { get设置;}

公共字符串昵称{获取设置;}

public int sex { get设置;}

公共字符串省份{获取设置;}

公共字符串城市{ get设置;}

公共字符串{ get设置;}

public string headimgurl { get设置;}

///摘要

///用户特权信息,json数组

////摘要

public JArray特权{获取设置;}

public string unionid { get设置;}

}

///摘要

///获取访问_令牌或者刷新返回的数据对象

////摘要

公共类OAuthAccess _令牌

{

公共字符串access _ token { get设置;}

public int expires _ in { get设置;}

公共字符串refresh _ token { get设置;}

///摘要

///用户针对当前公众号的标识

///关注后会产生,返回公众号下页面也会产生

////摘要

公共字符串openid { get设置;}

公共字符串范围{获取设置;}

///摘要

///当前用户的unionid,只有在用户将公众号绑定到微信开放平台帐号后

////摘要

public string unionid { get设置;}

}

}

我们已经准备好了,你呢?
2024我们与您携手共赢,为您的企业形象保驾护航