侧边栏壁纸
博主头像
昂洋编程 博主等级

鸟随鸾凤飞腾远,人伴贤良品自高

  • 累计撰写 71 篇文章
  • 累计创建 79 个标签
  • 累计收到 0 条评论

目 录CONTENT

文章目录

Springboot实现企业微信扫码登录

Administrator
2022-08-25 / 0 评论 / 0 点赞 / 32 阅读 / 0 字 / 正在检测是否收录...
温馨提示:
本文最后更新于2024-06-14,若内容或图片失效,请留言反馈。 部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

整个实现逻辑

官方开发者api地址: https://developer.work.weixin.qq.com/document/path/91025
image-1661397754568

  1. 前端请求企业微信扫码的url,拿到二维码
  2. 用户扫码,点击确认,企业微信携带code和state回调企业设置的url
  3. 前端拿到code和state请求后端登录
  4. 后端根据code和state获取应用的授权token,根据token获取企业微信用户id,根据企业微信用户id做登录校验即可

企业微信配置

登录企业微信后台,我这里登录的是网页版https://work.weixin.qq.com/login
我这里显示的英文,不知道为什么,对照着操作就行,应用管理 - 创建应用
image-1661396712442
image-1661396838417

创建好应用之后,点击刚创建的应用
image-1661396898834

开启企业微信web认证
image-1661396986591
image-1661397010722

上面的认证回调域名可以写域名,也可以写ip,只能到端口,后面不能跟uri,前面也不能待http什么的
返回上一层,添加可信任的ip
image-1661397109252
image-1661397136467
多个用英文的分号隔开

给应用指定人员
image-1661397235286

需要记住的几个参数,待会开发的时候需要用到
image-1661397284419
image-1661397311619

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去进行自己系统的数据库对比校验什么的逻辑就可以自己写了

0

评论区