微信企业号之构造网页授权链接

一.相关介绍

在企业微信中,我们可以开发企业应用。使用企业应用,我们可以访问到外部网站。那么外部网站如何获取到企业微信共享用户userid以及用户的相关信息,企业微信提供了OAuth的授权登录方式,可以让网页和企业微信共享用户ID,从而免去登录的环节

二.网页授权的可信域名

  1. 在开始使用网页授权之前,开发者需要先登录到企业管理端后台,选择“企业应用”选项卡,进入需要使用网页授权的应用并编辑“可信域名”表单项,此选项将用于网页OAuth2.0授权的时候进行安全验证。请注意,这里填写的是域名(是一个字符串),而不是URL,因此请勿加 http:// 等协议头
  2. 可信域名配置规范为全域名,且需要通过ICP备案(否则在微信侧jssdk功能失效)。比如需要网页授权的域名为:www.qq.com,配置以后此域名下面的页面http://www.qq.com/music.html 、 http://www.qq.com/login.html 都可以进行OAuth2.0鉴权。但http://pay.qq.com 、 http://music.qq.comhttp://qq.com无法进行OAuth2.0鉴权
  3. 域名的验证逻辑说明:由于一个企业可以自定义多个应用,每个应用都可以配置一个安全域名,在做oauth跳转的时候,只需要携带coprid即可,企业微信的后台会遍历该企业下面配置的所有应用并检查其配置的可信域名,只要任意一个应用的可信域名匹配则校验成功。

三.userid介绍

UserId用于在一个企业内唯一标识一个用户,通过网页授权接口可以获取到当前用户的UserId信息,如果需要获取用户的更多信息可以调用通讯录管理的成员接口来获取。

四.接入流程

企业应用中的URL链接(包括自定义菜单或者消息中的链接),均可通过OAuth2.0验证接口来获取成员的UserId身份信息。注意:此URL的域名,必须完全匹配企业应用设置项中的“可信域名”(如果你的redirect_uri有端口号,那么“可信域名”也必须加上端口号),否则跳转时会提示redirect_uri参数错误。

通过此接口获取成员身份会有一定的时间开销。对于频繁获取成员身份的场景,建议采用如下方案:
1、企业应用中的URL链接直接填写企业自己的页面地址
2、成员操作跳转到步骤1的企业页面时,企业后台校验是否有标识成员身份的cookie信息,此cookie由企业生成
3、如果没有匹配的cookie,则重定向到OAuth验证链接,获取成员的身份信息后,由企业后台植入标识成员身份的cookie信息
4、根据cookie获取成员身份后,再进入相应的页面
在这里插入图片描述

1. 获取code

如果企业需要在打开的网页里面携带用户的身份信息,第一步需要构造如下的链接来获取code参数:

https://open.weixin.qq.com/connect/oauth2/authorize?appid=CORPID&redirect_uri=REDIRECT_URI&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect
参数说明
参数 必须 说明
appid 企业的CorpID
redirect_uri 授权后重定向的回调链接地址,请使用urlencode对链接进行处理
response_type 返回类型,此时固定为:code
scope 应用授权作用域。企业自建应用固定填写:snsapi_base
state 重定向后会带上state参数,企业可以填写a-zA-Z0-9的参数值,长度不可超过128个字节
#wechat_redirect 终端使用此参数判断是否需要带上身份信息
员工点击后,页面将跳转至 redirect_uri?code=CODE&state=STATE,企业可根据code参数获得员工的userid。code长度最大为512字节。
2.根据code获取成员信息
请求方式:GET(HTTPS)
请求地址:
https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=ACCESS_TOKEN&code=CODE
参数说明
参数 必须 说明
access_token 调用接口凭证
code 通过成员授权获取到的code,最大为512字节。每次成员授权带上的code将不一样,code只能使用一次,5分钟未被使用自动过期。
权限说明: 跳转的域名须完全匹配access_token对应应用的可信域名,否则会返回50001错误。 返回结果: a) 当用户为企业成员时返回示例如下:
{
   "errcode": 0,
   "errmsg": "ok",
   "UserId":"USERID",
   "DeviceId":"DEVICEID"
}
参数 说明
errcode 返回码
errmsg 对返回码的文本描述内容
UserId 成员UserID。若需要获得用户详情信息,可调用通讯录接口:读取成员
DeviceId 手机设备号(由企业微信在安装时随机生成,删除重装会改变,升级不受影响)
b) 非企业成员授权时返回示例如下:
{
   "errcode": 0,
   "errmsg": "ok",
   "OpenId":"OPENID",
   "DeviceId":"DEVICEID"
}
参数 说明
errcode 返回码
errmsg 对返回码的文本描述内容
OpenId 非企业成员的标识,对当前企业唯一
DeviceId 手机设备号(由企业微信在安装时随机生成,删除重装会改变,升级不受影响)
出错返回示例:
{
   "errcode": 40029,
   "errmsg": "invalid code"
}

五.具体代码实现

1.授权获取code实例

@GetMapping(value = { "/authOutUser" })
    public String auth(){
        String appid="";//微信企业号里面的appid
        String backUrl ="../page"; //微信回调地址
        String redirect_uri = "";//经urlencode的回调地址
        try {
            redirect_uri = java.net.URLEncoder.encode(backUrl, "utf-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            logger.error("ecdoe error: " + e.getMessage());
        }
        String oauth2Url = "https://open.weixin.qq.com/connect/oauth2/authorize?appid=" + appid + "&redirect_uri=" + redirect_uri + "&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect";
        return "redirect:" + oauth2Url;
    }

2.通过code获取用户信息

 @GetMapping(value = "/page")
    public ModelAndView page(String code) {
        ModelAndView modelAndView=new ModelAndView();
        if(code!=null&&!code.equals("")){
            String accessToken = "";//调用接口凭证
            String url="https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token="+accessToken+"+&code="+code;
            String info = HttpUtil.get(url);
            WxUserInfo userInfo=JSON.parseObject(info,WxUserInfo.class);
            //TODO ... 获取用户信息后进行处理
        }
        modelAndView.setViewName("/handlePage");
        return modelAndView;
    }

猜你喜欢

转载自blog.csdn.net/u010520146/article/details/84790367