企业微信之网页授权登录「建议收藏」

企业微信之网页授权登录「建议收藏」企业微信之网页授权登录场景:要在企业微信里面集成企业自建应用,点击应用进入应用功能列表,获取当前企业微信用户信息。Ⅰ.概述企业微信提供了OAuth的授权登录方式,可以让网页和企业微信共享用户ID,从而免去登录的环节。此文档面向网页开发者介绍企业微信网页授权如何使用及相关注意事项。Ⅱ.企业微信OAuth2接入流程Ⅲ.准备工作企业微信后台,应用管理-创建应用,新建应用secret是企业应用里面用于保障数据安全的“钥匙”,每一个应用都有一个独立的访问密钥,为了保证数据的安全,secre

大家好,欢迎来到IT知识分享网。

场景:要在企业微信里面集成企业自建应用,点击应用进入应用功能列表,获取当前企业微信用户信息。

Ⅰ.概述

企业微信提供了OAuth的授权登录方式,可以让网页和企业微信共享用户ID,从而免去登录的环节。

此文档面向网页开发者介绍企业微信网页授权如何使用及相关注意事项。

Ⅱ.企业微信OAuth2接入流程

img

Ⅲ.准备工作

  1. 企业微信后台,应用管理-创建应用,新建应用
    在这里插入图片描述
    secret是企业应用里面用于保障数据安全的“钥匙”,每一个应用都有一个独立的访问密钥,为了保证数据的安全,secret务必不能泄漏。

    自建应用secret。在管理后台->“应用与小程序”->“应用”->“自建”,点进某个应用,即可看到。

  2. 构造网页授权链接

    如果企业需要在打开的网页里面携带用户的身份信息,需要构造如下的链接来获取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字节。
    在这里插入图片描述

  3. 设置可信域名

    REDIRECT_URL中的域名,需要先配置至应用的“可信域名”,否则跳转时会提示“redirect_uri参数错误”。
    要求配置的可信域名,必须与访问链接的域名完全一致;若访问链接URL带了端口号,端口号也需要登记到可信域名中
    在这里插入图片描述

Ⅳ.接入流程说明

  1. 获取access_token

    为了安全考虑,开发者请勿将access_token返回给前端,需要开发者保存在后台,所有访问企业微信api的请求由后台发起

    获取access_token是调用企业微信API接口的第一步,相当于创建了一个登录凭证,其它的业务API接口,都需要依赖于access_token来鉴权调用者身份。

  2. 获取code

    • 需根据构造网页授权链接获取code

      https://open.weixin.qq.com/connect/oauth2/authorize?appid=你的企业ID&redirect_uri=重定向链接并urlencode编码&response_type=code&scope=snsapi_base&state=STATE#wechat_redirect

    • 重定向链接

      http://域名:端口/qywx?redirectAlias=workBench&agentId=1000001

      参数,**redirectAlias:**授权成功后重定向URI别名,**agentId:**授权的企业微信应用ID。可根据需要自定义,此处为了实现动态配置多个自建应用。 在这里插入图片描述

  3. 根据code获取成员信息

Ⅴ.关键代码实现

此处用servlet进行接口实现,也可用controller接口进行实现。

  1. web.xml配置

    <servlet>
    	<servlet-name>QYWXServlet</servlet-name>
    	<servlet-class>com.very.mobile.weixin.QYWXServlet</servlet-class>
    </servlet>
    <servlet-mapping>
       <servlet-name>QYWXServlet</servlet-name>
       <url-pattern>/qywx</url-pattern>
    </servlet-mapping>
    
  2. 代码编写

    以下SysPropertyUtil.getByAlias根据别名获取参数,根据实际情况实现该方法。常量类,数据库等。

    • QYWXServlet

      public class QYWXServlet extends HttpServlet { 
             
          private static final long serialVersionUID = 1L;
      
          protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
             
              //获取企业微信返回code参数
              String code = req.getParameter("code");
              //获取授权的企业微信应用ID
              String agentId = req.getParameter("agentId");
              //获取授权成功后重定向URI别名
              String redirectAlias = req.getParameter("redirectAlias");
              
              if (StringUtil.isNotEmpty(code)) { 
             
                  //根据code获取用户信息
                  String userUrl = WeixinConsts.getQyWxUserInfo(code, agentId);
                  String json = HttpUtil.sendHttpsRequest(userUrl, "", "GET");
                  JSONObject jsonObj = JSONObject.fromObject(json);
                  
                  //获取用户信息之后做业务处理,此处完成后台登录,可根据实际情况编写
                  String userId = jsonObj.getString("UserId");
                  SecurityUtil.login(req, userId, "", true);            
                  
                  //根据别名获取重定向URI,完成跳转
                  String redirect = SysPropertyUtil.getByAlias(redirectAlias);
                  resp.sendRedirect(redirect);
              }
          }
      
          protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
             
              super.doPost(req, resp);
          }
      }
      
    • WeixinConsts

      public class WeixinConsts { 
             
          //生成获取access_token的URL
          public static String getToKen(String agentId) { 
             
              //获取企业ID
              String corpId = SysPropertyUtil.getByAlias("corpid");
              //根据agentId获取自建应用secret
              String secret = SysPropertyUtil.getByAlias(agentId);
              return "https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=" + corpId + "&corpsecret=" + secret;
          }
          
          //生成获取用户信息的URL
          public static String getQyWxUserInfo(String code, String agentId) { 
             
              String accessToken = TokenUtil.getAgentToken(agentId);
              String url = "https://qyapi.weixin.qq.com/cgi-bin/user/getuserinfo?access_token=" + accessToken + "&code=" + code;
              return url;
          }
      }
      
    • TokenUtil

      public class TokenUtil { 
             
          //根据agentId获取access_token
          public static synchronized String getAgentToken(String agentId) { 
             
              String url = WeixinConsts.getToKen(agentId);
              String rtn = HttpUtil.sendHttpsRequest(url, "", "GET");
              JSONObject jsonObj = JSONObject.fromObject(rtn);
              String errMsg;
              if ((Integer)jsonObj.get("errcode") == 0) { 
             
                  token = jsonObj.getString("access_token");
                  return token;
              } else { 
             
                  errMsg = jsonObj.getString("errmsg");
                  log.error(errMsg);
                  return "-1";
              }
          }
      
      }
      

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/24257.html

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信