asp.net 、C#实现微信企业号OAuth2认证

  以微信企业号作为入口的应用,几乎都会遇到需要应用系统中个人信息和微信用户关联问题、从而进行其他业务处理。目前所做项目采取在企业号通讯录添加自定义字段存入应用系统用户信息表中唯一标识UserGuid进行关联。那么如何获取微信企业号通讯录存储的自定义字段、从而实现应用用户信息和微信账号关联?把实现方案大致整理一下,如有不足,还望指出:

1:在企业号通讯录内添加用户Guid唯一字段。

2:创建应用并启用回调模式

3:以微信为入口的应用验证用户的方法,首先在用户访问应用主页时判断Cookie是否有UserGuid信息,如果没有则调用微信OAuth2认证接口。redirectUrl参数是回调页面地址,通过认证后会返回redirectUrl?code=XXXX信息。注:RedirectUrl回调地址必须是外网可以访问的。

 1 if (Request.Cookies["UserGuid"] == null)
 2             {
 3                 string httpUrl =
 4                     "https://open.weixin.qq.com/connect/oauth2/authorize?appid=XX&redirect_uri=URL&response_type=code&scope=snsapi_base&state=";
 5                 Response.Redirect(httpUrl);
 6             }
 7             else
 8             {
 9                 //TODO 获取userguid之后处理步骤 Request.Cookies["UserGuid"].ToString();
10
11             }

4:回调页面处理思路

4.1首先获取通过认证后的Code参数,之后根据企业号的CorpID和Secret获取AccessToken。

Https请求方式: GET

https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=id&corpsecret=secrect

成功时返回:

{

"access_token": "XXX…………",

"expires_in": 7200

}

4.2获取token之后,根据code和accesstoken字符串参数获取微信用户信息,accesstoken7200秒内有效,code参数五分钟内有效且仅能使用一次。

Https请求方式: GET

https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE

验证为企业成员时返回

{

"UserId":"USERID",

"DeviceId":"DEVICEID"

}

请求失败时返回

{

"errcode": "40029",

"errmsg": "invalid code"

}

4.3获取UerID之后,根据access_token和UerID获取用户通讯录中信息。自定义字段在extattr属性中。

Https请求方式: GET

https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token=ACCESS_TOKEN&userid=UerID

成功时返回

{

"errcode": 0,

"errmsg": "ok",

"userid": "zhangsan",

"name": "XX",

"department": [2],

"position": "XX",

"mobile": "XX",

"gender": "1",

"email": "XX",

"weixinid": "XX",

"avatar": "XX",

"status": 1,

"extattr": {"attrs":[{"name":"用户自定义字段名","value":"自定义字段值"}]}

}

4.4获取用户自定义字段UserGuid后存入cookie,并返回应用主页面。主页面此时验证Cookie,userguid信息。

5:回调页面代码C#

 1 protected void Page_Load(object sender, EventArgs e)
 2         {
 3
 4             try
 5             {
 6                 //1.微信主页判断是否存在Cookie信息,如果存在则不需要再次验证
 7                 //2.如果不存在,则跳转到微信OAuth统一认证页面认证,之后到此页面获取用户信息存入Cookie返回主页
 8                 //3.获取Code,此code只能使用一次。
 9                 string code = Request["code"];
10
11                 //4.根据企业ID:XX,Secret:XXX,获取token
12                 string accessTokenUrl = "https://qyapi.weixin.qq.com/cgi-bin/gettoken";
13                 string accessTokenResult = HttpGet(accessTokenUrl, "corpid=XX&corpsecret=XXXX");
14                 JavaScriptSerializer js = new JavaScriptSerializer();
15                 token mytoken = js.Deserialize<token>(accessTokenResult);
16                 string tokenValue = mytoken.access_token;
17
18                 //5.获取UserInfo,包含userId
19                 string userinfoUrl = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo";
20                 string userinfojson = HttpGet(userinfoUrl, "access_token=" + tokenValue + "&code=" + code);
21                 userinfo userinfo1 = js.Deserialize<userinfo>(userinfojson);
22                 string UserId = userinfo1.UserId;
23
24                 //6.根据userId获取通讯录中用户的详细信息
25                 string userinfodetailURL = "https://qyapi.weixin.qq.com/cgi-bin/user/get";
26                 string userinfodetailResult = HttpGet(userinfodetailURL, "access_token=" + tokenValue + "&userid=" + UserId);
27                 JObject jObject = (JObject)JsonConvert.DeserializeObject(userinfodetailResult);
28                 JObject ja = (JObject)JsonConvert.DeserializeObject(jObject["extattr"].ToString());
29                 JArray jObject1 = (JArray)JsonConvert.DeserializeObject(ja["attrs"].ToString());
30                 //txtReturn2.Text = ja[0]["MainOrganization"].ToString();
31
32                 //测试结果
33                 //Response.Write("1:token:" + accessTokenResult + "<br/>2:tokenValue:" + tokenValue + "<br/>3:code:" + code + "<br/>4:userinfojson:" + userinfojson + "<br/>5.UserId:" + UserId + "<br/>6.userinfodetailResult:" + userinfodetailResult + "<br/>7:数组:" + jObject1[0]["value"].ToString());
34
35                 //7.将Guid存入cookie
36                 string userguid = jObject1[0]["value"].ToString();
37                 Response.Cookies["UserGuid"].Value = userguid;
38                 Response.Cookies["UserGuid"].Expires = DateTime.Now.AddDays(1);
39                 //todo:跳转到微信主页
40                 Response.Redirect("XX", true);
41             }
42             catch (Exception ex)
43             {
44                 //TODO 处理异常
45
46             }
47         }
48         /// <summary>
49         /// 发送HttpGet请求,返回string格式的json数据
50         /// </summary>
51         /// <param name="Url"></param>
52         /// <param name="postDataStr"></param>
53         /// <returns></returns>
54         public string HttpGet(string Url, string postDataStr)
55         {
56             HttpWebRequest request = (HttpWebRequest)WebRequest.Create(Url + (postDataStr == "" ? "" : "?") + postDataStr);
57             request.Method = "GET";
58             request.ContentType = "text/html;charset=UTF-8";
59             HttpWebResponse response = (HttpWebResponse)request.GetResponse();
60             Stream myResponseStream = response.GetResponseStream();
61             StreamReader myStreamReader = new StreamReader(myResponseStream, Encoding.GetEncoding("utf-8"));
62             string retString = myStreamReader.ReadToEnd();
63             myStreamReader.Close();
64             myResponseStream.Close();
65             return retString;
66         }

6上面代码涉及到的两个类,为处理返回string类型的Json串,将json格式序列化为类。类的格式需和json保持一致。代码如下:

 1 public class userinfo
 2     {
 3         public string UserId { get; set; }
 4         public string DeviceId { get; set; }
 5     }
 6
 7 public class token
 8     {
 9
10         public string access_token { get; set; }
11         public int expires_in { get; set; }
12
13     }

时间: 2024-12-25 11:30:13

asp.net 、C#实现微信企业号OAuth2认证的相关文章

微信企业号OAuth2验证接口实例(使用SpringMVC)

微信企业号OAuth2验证接口(使用SpringMVC) 企业应用中的URL链接(包括自定义菜单或者消息中的链接),可以通过OAuth2.0来获取员工的身份信息. 注意,此URL的域名,必须完全匹配企业应用设置项中的'可信域名',否则获取用户信息时会返回50001错误码. 可信域名设置不包含"http://",只需域名或IP即可. OAuth2验证可以使用多种方式,此处使用注解方式.设计思路是在需要获取用户信息的GET请求上添加注解,然后在调用的时候判断是否包含此注解,然后做处理流程.

微信企业号-- OAuth2.0验证.net开发

在做企业号 OAuth2.0验证 的时候走了一些弯路,在这里记录一下. 当我查官方的接口文档的时候就给了一下代码: 企业应用中的URL链接(包括自定义菜单或者消息中的链接),可以通过OAuth2.0验证接口来获取成员的身份信息. 通过此接口获取成员身份会有一定的时间开销.对于频繁获取成员身份的场景,建议采用如下方案: 1.企业应用中的URL链接直接填写企业自己的页面地址 2.成员跳转到企业页面时,企业校验是否有代表成员身份的cookie,此cookie由企业生成 3.如果没有获取到cookie,

微信企业号开发之 企业号人员身份认证与开发

前言 这里完全可以链接一个登录页面,让用户输入用户名密码进行登录的...2333 但是,这样所就完全失去了微信企业号的意义,本来进入微信企业号的时候,就已经对人员身份进行认证了,你这里再让别人登录,不是显得多余么? 于是,需要考虑的是,如何获取微信企业号中用户的身份,以及将用户身份与自有系统进行关联. 一.建立企业应用并配置可信域名 在微信的管理界面里面,建立一个企业应用.建立的过程很简单,但是这里需要注意的是,建立完以后,一定要配置可信域名!!!!并且如果你不是使用的标准端口,一定也要把端口配

.net之微信企业号开发(二) 企业号人员身份认证与开发

前言 这里完全可以链接一个登录页面,让用户输入用户名密码进行登录的...2333 但是,这样所就完全失去了微信企业号的意义,本来进入微信企业号的时候,就已经对人员身份进行认证了,你这里再让别人登录,不是显得多余么? 于是,需要考虑的是,如何获取微信企业号中用户的身份,以及将用户身份与自有系统进行关联. 一.建立企业应用并配置可信域名 在微信的管理界面里面,建立一个企业应用.建立的过程很简单,但是这里需要注意的是,建立完以后,一定要配置可信域名!!!!并且如果你不是使用的标准端口,一定也要把端口配

微信企业号简单的OAuth2验证接口实例(使用SpringMVC非注解方式)

目前企业号只提供了scope为"snsapi_base"的应用授权作用域,也就是不会跳转到让用户授权的页面. 之前写了使用注解方式验证并获取用户信息的实例,大家不是很理解,问题很多,现在附上简单的验证获取用户信息的实例! 微信企业号OAuth2验证接口实例(使用SpringMVC) OAuth2.0验证需要注意: 1.redirect_uri参数是授权回调地址,也就是说这个地址外网是可以访问的,所以如果使用本地映射服务器的猿们请修改为外网可以访问的地址! 2.配置可信域名,可信域名是1

【Servlet】对基于Jsp的微信Oauth2认证的改进

上次写出来的<[Servlet]基于Jsp的微信Oauth2认证>(点击打开链接)相当地不好,浪费了许多页面,而且类的安排与布置非常地不明确,如果多个微信公众平台的程序需要调用到Oauth2认证,必须整段整段代码复制拷贝,这次,对其进行了改进,认证过程也封装到一个类里面,可以多次复用. 一.基本准备 首先,我们要到微信的开发者中心,修改"OAuth2.0网页授权"的接口,如下图: 这里的"授权回调页面域名"是应该填写你服务器的总域名,而不是下面的一个个工

微信企业号在企业中的应用(2):企业号的申请和认证

微信企业号的入口地址是:https://qy.weixin.qq.com/ 如果你想尝试一下,可以先申请一个体验号,申请地址:http://qydev.weixin.qq.com/try?t=experience 如果没有认证的企业号,只能关注50个员工,并且不能使用高级接口,也就是说不能使用API来管理通讯录,也不能使用API来发送消息,只能使用API响应客户端发来的消息.发送信息也只能在企业号的官网在网页上发送.由于微信认证的费用一年是300元,也不贵,那就还是准备认证一下吧. 1. 首先选

微信企业号 获取用户信息

业务操作最基础的一个功能是获取访客的身份,传统的获取方式是提供一个登录页面用以访客登录. 在微信企业号中,用户在微信中访问页面时,可以根据相关API获取此用户的微信账号信息,以此来匹配业务服务器存储的相关用户信息. 目录 1.  介绍 2.  代码示例 1. 介绍 1.1 说明 企业号的网页开发,说白了就是移动端web开发,特殊点在于如何获取微信用户的身份信息. 在企业号中可以进行如下步骤获取微信用户信息: 访问一个业务页面时,可通过OAuth验证接口获取此用户信息 → 根据code获取user

Force.com微信企业号开发系列(一) - 启用二次验证

微信于9月份推出企业号后引起了业界不小的反响,许多企业都在思索企业号将如何影响企业的运营,从本文开始,我将详细阐述微信企业号开发的相关知识,而本文将着重介绍如何实现更高安全机制的二次验证. 申请企业体验号: 企业号顾名思义就是企业来申请的号,申请时就像申请服务号一样,需要提供各种组织证明文件,对广大开发者来说很难操作,好在腾讯公司也像服务号一样开通了体验号申请,留意企业体验号的有效期间非常短,只有90天(服务号测试账号有1年有效期),且如果企业体验号长期不使用还会收到腾讯公司的提前失效提醒邮件.