公司开通了企业微信,为了增加员工使用企业微信的积极性,将之前所开发系统URL挂到企业应用中,并实现自动登陆。
企业微信官方定义:
UserId用于在一个企业内唯一标识一个用户,通过网页授权接口可以获取到当前用户的UserId信息,如果需要获取用户的更多信息可以调用通讯录管理的成员接口来获取。
根据定义,首先要获取ACCESS_TOKEN,这个参数在微信开发中一般都要首先获取,不管是微信公众号还是企业号,
而官方一般用PHP做示范代码,那么.NET发送HTTP请求并获取返回值的方法该如何写?
一 : 写了一个HTTPS辅助类,利用WebRequest 类发送HTTPS请求,StreamReader 读取返回值,用第三方类库解析返回ACCESS_TOKEN。
JObject对象需要调用第三方类库。
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
二 : 写了一个企业微信(WeChatEnterprise)辅助类,用于在应用中调用接口等。
获取ACCESS_TOKEN,调用接口 https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=id&corpsecret=secrect
获取ACCESS_TOKEN之后在应用程序中一定要做缓存,缓存时间7200秒,不然ACCESS_TOKEN 数量可能不够用。
HTTPS辅助类和企业微信辅助类为什么要分开写,因为前者是通用的,后者是针对企业微信的。
三 : 下面是官方的API接口定义
获取Code比较关键,因为企业微信的应用跳转到其他应用是无法携带信息的,要实现免登录,首先要通过接口获取Code,然后通过Code和Access_token 获取UserId.
获取CODE需要在企业微信客户端进行测试,所以需要一台服务器布置网站,经过半个多月的走流程,终于配了一台腾讯云服务器,windows 2008 R2系统,2G/4核/50G系统盘/100G数据盘/6M宽带(此处应有一个哭的表情)。
开始没理解获取CODE的API,https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=SCOPE&state=STATE#wechat_redirect 这个是API链接,CORPID根据自己的信息填入,redirect_url 是重定向地址,什么是重定向地址,就是企业微信应用里面员工界面地址填的是上面这个长地址,如果redirect_url中的地址通过可信域名的验证,微信会帮你跳转到重定向地址,跳转的时候会通过QueryString携带CODE参数。然后我们开发者就可以通过QueryString["Code"]获取Code.
几个点注意下:比如员工最终要访问的地址是 www.baidu.com/a/b.html ,那么可信域名是 www.baidu.com,redirect_url 是www.baidu.com/a/b.html,redirect_url要经过UrlEncode处理。
四:获取Code之后一切都好办了,无非是根据APi获取自己需要的用户信息,大概说一下我的处理方法。
上面这段代码是在上文所说的b.html的后台处理的,即微信重定向的页面后台。
有几个点解释下上面的代码。
第一:官方说每次获取CODE有一定的时间开销,所以建议使用Cookie进行缓存。
第二:we.UserId,we.User都是根据企业微信官方API简单写的两个关于获取UserId和User的函数。如下图
第三:JObject User_Obj = (JObject)JsonConvert.DeserializeObject(User);JObject引用了第三方类库Newtonsoft,这个类库在后台处理JSON格式时比较好用。
第四:catch里面这句代码 if (!(ex is System.Threading.ThreadAbortException)) ,因为TRY里面用了Response.Redirect,会引起线程提前结束异常,然后执行catch里面的语句。
第五:忽略不规范的命名和跳转里面的TYPE参数,并没有什么意义。
五:本来最后想来个效果演示的,不过好像比较麻烦,步骤就是点击进行企业微信-》我-》工作台-》点击我的应用->打开已经登陆后的应用首页