前言
最近公司对接一些高校项目,需要用到企业微信获取员工信息!这个对于玩转OAuth2协议的我来说不是什么问题。如果是第一次接这种OAuth2授权的道友可以先看看往期文章OAuth协议简介,简单了解一下这个协议先
企业微信文档
关于文档
我们对接的第一步是搞定身份验证,这里身份验证分为两块,一块是网页授权登录,一块是扫码授权登录,这两块其实本质都是一样的,就是使用场景不同
网页授权登录:是手机扫描网页上的码后,手机点击授权后回调界面显示在网页上
扫码授权登录:是手机扫描网页上的码后,手机点击授权后回调界面显示在手机上
我这边是使用的是扫码授权登录,获取企业微信用户的用户名和手机号码;
企业微信后台配置
1.创建应用
这个还是企业微信做的比QQ授权和微信授权要好一些,就是审核挺快的,准确的说我是没感觉要审核的!
2.配置回调
这个需要根据使用场景来,第一种场景对应网页授权及JS-SDK,第二种场景对应企业微信授权登录
3.查看相关数据
1.企业ID
2.AgentId、Secret
开发技巧
这里会涉及到外网回调,也就是企业微信返回code的这个请求需要在外网服务器上,如果不在外网那么,回调无法到达。但是将项目发布到外网服务器后又不好调试,这里可以搭建一个内网穿透平台使用Frp搭建内网穿透这样我们就可以在本地开发,无需每次编码后放到服务器测,大大提高开发效率
开整
1.准备授权地址
@GetMapping("/getWxCode")
public String getWxCode(String roomId){
String id = "data";
String url="http://open.weixin.qq.com/connect/oauth2/authorize?appid="+corpid+"&redirect_uri="+redirect_uri+roomId+"/"+id+"&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
return "redirect:"+url;
}
这个接口其实就是隐藏一些数据,其实和前端直接超链接跳转"http://open.weixin.qq.com/connect/oauth2/authorize?appid=“+corpid+”&redirect_uri=“+redirect_uri+roomId+”/“+id+”&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect"没什么差别,就是防止前端被篡改或者数据传错造成一些bug
2.获取code
@ResponseBody
@RequestMapping("/getUserInfo/{roomId}/{id}")
public JSONObject getUserInfo(@PathVariable String roomId,@PathVariable String id,String code){
System.out.println("code===>"+code);
System.out.println("roomId===>"+roomId);
System.out.println("id===>"+id);
this.access_token=getAccess_token();
String user_Id=getUser_Id(code);
JSONObject user_Infores=getUser_Info(user_Id);
return user_Infores;
}
//获取access_token
public String getAccess_token() {
RestTemplate restTemplate = new RestTemplate();
JSONObject access_tokenres=restTemplate.getForObject("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid="+corpid+"&corpsecret="+corpsecret,JSONObject.class);
//System.out.println("errmsg===============>"+access_tokenres.getString("errmsg"));
//System.out.println("errmsg===============>"+access_tokenres.getString("errmsg"));
//System.out.println("errcode==============>"+access_tokenres.getString("errcode"));
//System.out.println("expires_in===========>"+access_tokenres.getString("expires_in"));
//System.out.println("access_token=========>"+access_tokenres.getString("access_token"));
return access_tokenres.getString("access_token");
}
//获取user_Id
public String getUser_Id(String code) {
RestTemplate restTemplate = new RestTemplate();
JSONObject user_Idres=restTemplate.getForObject("https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token="+access_token+"&code="+code,JSONObject.class);
//System.out.println("UserId===============>"+user_Idres.getString("UserId"));
//System.out.println("DeviceId===============>"+user_Idres.getString("DeviceId"));
//System.out.println("errcode==============>"+user_Idres.getString("errcode"));
//System.out.println("errmsg===========>"+user_Idres.getString("errmsg"));
return user_Idres.getString("UserId");
}
//获取userInfo
public JSONObject getUser_Info(String userId) {
RestTemplate restTemplate = new RestTemplate();
JSONObject user_Idres=restTemplate.getForObject("https://qyapi.weixin.qq.com/cgi-bin/user/get?access_token="+access_token+"&userid="+userId,JSONObject.class);
//System.out.println("name===============>"+user_Idres.getString("name"));
//System.out.println("mobile===============>"+user_Idres.getString("mobile"));
//System.out.println("errcode==============>"+user_Idres.getString("errcode"));
//System.out.println("errmsg===========>"+user_Idres.getString("errmsg"));
return user_Idres;
}
这里接入其实是特别简单的,但是以上并不是本篇文章的重点,重点是一下的东西!
注意
1.回调地址传递参数的时候通过URL传参只能传一个参数
http://open.weixin.qq.com/connect/oauth2/authorize?appid=xxxxxxx&redirect_uri=http://xxxxxxx:82/getWxCode?roomId=100&id=10&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
如果redirect_uri写成http://xxxxxxx:82/getUserInfo?roomId=100&id=1这样,其实就是我们回调到getUserInfo时想要将roomId和id传过去,但是实际企业微信认证服务器回调时只会将roomId带过去,id则带不过去,当时一看到这个问题就想到是参数拼接的问题,于是将链接放到postman上看了一下
至于这里id为什么没有带过去,原因是因为id给作为企业微信认证服务的参数传给了企业微信的认证服务,而并不是将id传给我们自己的回调接口上,所以这里就是问题的核心,那么问题找到了,那么解决方案就来了,第一种就是像我上面一样使用/getUserInfo/{roomId}/{id}取值,第二种就比较lo,直接将参数凭借成字符串,不适用&符号链接,但时候在将这一个参数才分即可
2.微信扫码无法获取用户信息,但是有些账号又能获取用户信息
这个问题就要数落数落企业微信接入的文档了!这个正常情况下微信扫码是无法获取企业微信的用户数据的,但是可以将微信和企业关联,而不是使用微信账号登录企业微信,这样还不行,必须使用微信关注企业微信,这个是个坑注意,原理解释一下,我们扫码获取企业微信的用户数据,这个用户数据书存储在企业微信的,并不是存储到微信的,所以我们使用企业微信扫码是能直接获取企业微信用户数据的,但是使用微信扫码需要通过微信关注企业微信账号,也就是关注一下公司就可以了,通过这个关注那么就相当于建立了微信和企业微信的通道,那么这时微信不但能直接获取企业微信的用户信息,还能获取企业微信的消息!(至于怎么关注公司的企业微信这个我还没找到入口,我是通过公示企业微信分享好友才关注上公司的企业微信的,如有道友找到关注入口欢迎评论)