第1步:企业微信自建应用
第2步:浏览企业微信开发文档
企业微信的开发文档: 企业微信API
第3步:企业微信自建应用设置授权域名
点击你创建好的自建应用:
点击网页授权及js-sdk设置可信域名(设置好的就显示"已启用")
要验证域名
点击企业微信授权登录的设置按钮
此处域名与之前的一样,并且接下来提到的redirect_uri也是要用这个域名。
第4步:根据你的登录逻辑看官方文档进行联调。
简单步骤分析(公司需求,所以有弄过)
1 获取access_token,有access_token才可以访问企业微信服务端的api
官方文档链接:获取access_token - 企业微信API
我的建议:需要把你的企业ID corpid、自建应用id 、自建应用的secret写在配置里(nacos)
access_token还需要存在redis里,因为频繁调用获取access_token的接口会频率拦截,所以要做缓存。
企业ID corpid:
2 构造内嵌登录二维码
官方文档链接: 构造扫码登录链接 - 企业微信API
我的建议:把"redirect_uri"配置在nacos里,不过返回给前端的时候,要进行UrlEncode。
下图为在nacos中企业微信的配置信息。配置的几个信息,不建议在前端直接使用,所以放在后台配置里,用接口返回。
同时前端上有id为"wx_reg"的标签容器:
到这一步,就已经能够成功在网页上看到要扫描的码了,用户扫码后点击登录,就跳转到你配置的"redirect_uri"上。
注意:"redirect_uri"一定要是你之前自建应用里设置的可信域名,才会看到这个二维码,否则会显示 "redirect_uri" 与配置的授权完成回调域名不一致。我之前的有篇博客写了这个问题:redirect_uri 与配置的授权完成回调域名不一致 ==> 企业微信要这样设置_女IT玩家-彬彬的博客-CSDN博客
3 这个"redirect_uri" 一般对应后台的某个接口,做处理逻辑。
用户扫码后点击登录,会进行redirect_uri 的跳转(我是跳转到下面的接口/codeLogin) ,跳转的时候会带上code和state参数。
根据返回的code,我们要验证用户的信息,数据库里是否有这个企业微信用户号,如果没有就提示注册或者该企业微信没有被绑定,请先绑定再进行企业微信扫码登录。
根据code获取用户的企业微信信息官方API:获取访问用户身份 - 企业微信API
@GetMapping(value = "/codeLogin", produces = {"application/json;charset=UTF-8"})
public void setKey(@RequestParam("action") String action,
@RequestParam("code") String code,
@RequestParam("state") String state,
HttpServletResponse response) throws IOException {
// 验证成功后要跳转到的url
String url = weChatConfig.getRedirectLoginResultUri();
// 获取用户身份,验证该用户信息是否在数据库
try {
String accessToken = weChatConfig.getAccessToken(weChatConfig.getGdkAppSecret(), weChatConfig.WECHAT_ACCESS_TOKEN_KEY_DPY_APP);
Map params = new HashMap();
params.put("access_token",accessToken);
params.put("code",code);
String result = HttpUtil.get(weChatConfig.GET_USER_INFO_URL, params,30000);
JSONObject jsonObject = JSON.parseObject(result);
Integer errcode = (Integer) jsonObject.get("errcode");
if (errcode == 0) {
String userId = (String) jsonObject.get("UserId");
QueryWrapper adminParams = new QueryWrapper();
adminParams.eq("wx_user_id",userId);
List adminQywxes = adminQywxService.list(adminParams);
if (CollectionUtils.isNotEmpty(adminQywxes)) {
AdminQywx adminQywx = adminQywxes.get(0);
// 将admin的id+4位uuid作为key,admin绑定的企业微信id作为value,存在redis中,用户登录验证
String key = LOGIN_TOKEN_PREFIX + adminQywx.getUserId();
String value = UUID.randomUUID().toString().replaceAll("-","");
redisUtil.set(key,value,300);
url = url + "?user=" + adminQywx.getUserId() + "&key=" + value;
}
}
// 请求重定向
response.sendRedirect(url);
} catch (Exception e) {
response.sendRedirect(url);
}
}
总结
企业微信扫码授权登录要先建立在用户的企业微信号与用户在系统中的绑定关系。根据redirect_uri来做用户的扫码绑定或者扫码登录。并不是说redirect_uri就一定是登录。