企业微信扫码授权接入

前言

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

  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员劝退师-TAO

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值