整个实现逻辑
官方开发者api地址: https://developer.work.weixin.qq.com/document/path/91025
- 前端请求企业微信扫码的url,拿到二维码
- 用户扫码,点击确认,企业微信携带code和state回调企业设置的url
- 前端拿到code和state请求后端登录
- 后端根据code和state获取应用的授权token,根据token获取企业微信用户id,根据企业微信用户id做登录校验即可
企业微信配置
登录企业微信后台,我这里登录的是网页版https://work.weixin.qq.com/login
我这里显示的英文,不知道为什么,对照着操作就行,应用管理 - 创建应用
创建好应用之后,点击刚创建的应用
开启企业微信web认证
上面的认证回调域名可以写域名,也可以写ip,只能到端口,后面不能跟uri,前面也不能待http什么的
返回上一层,添加可信任的ip
多个用英文的分号隔开
给应用指定人员
需要记住的几个参数,待会开发的时候需要用到
Springboot集成
前端请求企业微信二维码
地址是
https://open.work.weixin.qq.com/wwopen/sso/qrConnect?appid=CORPID&agentid=AGENTID&redirect_uri=REDIRECT_URI&state=STATE
上面几个大写的参数要替换成自己的
- CORPID - 企业ID
- REDIRECT_URI - 回调的URL
这个回调的URL要能公网访问得到,地址最好是前端的页面地址,回调此地址是页面就可以取到code和state用以请求后端登录
- STATE - 可选参数
可以写自己的参数,比如登录时需要选择实验室啊什么的,这里就可以带上,回调时原样返回
获取accessToken
/**
* 内部方法 - 获取accessToken
* @return
*/
private JSONObject getAccessToken() {
Map<String, String> params = new HashMap<>();
params.put("corpid", dictCache.getDictValue("wx_work_conf", "corp_id"));
params.put("corpsecret", dictCache.getDictValue("wx_work_conf", "agent1_secret"));
String token = HttpClientUtil.httpGet(dictCache.getDictValue("wx_work_conf", "access_token_url"), params);
JSONObject accessToken = JSONObject.parseObject(token);
return accessToken;
}
上面用到的corpid和corpsecret前面已经拿到了,我这里是存放在字典表里缓存去取的,HttpClientUtil.httpGet就是java通过httpclient发送请求封装的工具类方法,请求的url是: https://qyapi.weixin.qq.com/cgi-bin/gettoken
accessToken是一个对象,最终我们要的对象里边的access_token的值,直接取accessToken.getString("access_token")
获取企业微信用户id
/**
* 内部方法 - 获取用户id
* @param token
* @param code
* @return
*/
private String getUserId(String token, String code) {
String oauth2Url = dictCache.getDictValue("wx_work_conf", "oauth2_url");
String agentId = dictCache.getDictValue("wx_work_conf", "agent1_id");
String menuUrl = oauth2Url.replace("ACCESS_TOKEN", token).replace("CODE", code).replace("AGENTID", agentId + "");
String userinfo = HttpClientUtil.httpGet(menuUrl);
JSONObject jsonObject = JSON.parseObject(userinfo);
System.out.println("获取用户id返回:" + jsonObject.toJSONString());
return jsonObject.getString("UserId");
}
其中oauth2Url的地址为: https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE&agentid=AGENTID
同样大写的参数值要替换为自己的参数值
注意这一步如果没有在前面配置应用的可信IP,就会报错not allow to access from your ip, hint: [1661311,参考前面企业微信配置
最终拿到的就是企业微信的用户id,后面根据这个id去进行自己系统的数据库对比校验什么的逻辑就可以自己写了
评论区