企业微信之网页授权登录

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

Ⅰ.概述

企业微信提供了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";
              }
          }
      
      }
      
wxjava微信官方提供的Java开发工具包,用于开发微信公众号和小程序。要实现网页授权,可以通过wxjava中的WxMpService类来完成。 首先,我们需要在公众号的开发者平台上进行一些配置。可以在开发者工具中创建一个网页授权回调域名,然后将该域名配置到公众号的授权回调页面域名中。 接下来,在Java代码中使用wxjava,需要引入相应的依赖。可以在项目的pom.xml文件中添加如下配置: ```xml <dependency> <groupId>cn.binarywang</groupId> <artifactId>weixin-java-mp</artifactId> <version>${weixin-java-mp.version}</version> </dependency> ``` 然后,在代码中创建WxMpService对象,并配置相应的参数,如appId、appSecret等。可以通过以下代码来实现: ```java String appId = "your_app_id"; String appSecret = "your_app_secret"; WxMpInMemoryConfigStorage config = new WxMpInMemoryConfigStorage(); config.setAppId(appId); config.setSecret(appSecret); WxMpService wxMpService = new WxMpServiceImpl(); wxMpService.setWxMpConfigStorage(config); ``` 接下来,就可以使用WxMpService对象来进行网页授权了。可以通过以下代码来获取授权链接并重定向用户: ```java String redirectUrl = "your_redirect_url"; String scope = "snsapi_base"; String state = "your_state"; String authorizeUrl = wxMpService.oauth2buildAuthorizationUrl(redirectUrl, scope, state); response.sendRedirect(authorizeUrl); ``` 在用户授权后,微信会将授权码或网页授权access_token返回给回调页面,接下来可以根据该授权码或access_token来获取用户的基本信息。 需要注意的是,网页授权有两种方式,一种是snsapi_base,只能获取到用户的OpenID;另一种是snsapi_userinfo,可以获取到用户的详细信息。在授权链接中选择不同的scope,可以实现不同的授权方式。 以上就是使用wxjava实现网页授权的基本步骤。通过配置参数、获取授权链接和处理回调页面,可以实现微信网页授权的功能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值