企业微信扫码授权接入

编程入门 行业动态 更新时间:2024-10-11 07:26:15

前言

最近公司对接一些高校项目,需要用到企业微信获取员工信息!这个对于玩转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/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/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/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/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/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.微信扫码无法获取用户信息,但是有些账号又能获取用户信息
这个问题就要数落数落企业微信接入的文档了!这个正常情况下微信扫码是无法获取企业微信的用户数据的,但是可以将微信和企业关联,而不是使用微信账号登录企业微信,这样还不行,必须使用微信关注企业微信,这个是个坑注意,原理解释一下,我们扫码获取企业微信的用户数据,这个用户数据书存储在企业微信的,并不是存储到微信的,所以我们使用企业微信扫码是能直接获取企业微信用户数据的,但是使用微信扫码需要通过微信关注企业微信账号,也就是关注一下公司就可以了,通过这个关注那么就相当于建立了微信和企业微信的通道,那么这时微信不但能直接获取企业微信的用户信息,还能获取企业微信的消息!(至于怎么关注公司的企业微信这个我还没找到入口,我是通过公示企业微信分享好友才关注上公司的企业微信的,如有道友找到关注入口欢迎评论)

更多推荐

企业微信扫码授权接入

本文发布于:2023-06-11 18:53:00,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/641389.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:企业   微信扫码

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!