springboot获取企业微信的access_token凭证


前言

企业微信服务端API开放了丰富的能力接口,开发者可以借助接口能力,实现企业服务及企业微信的集成和支持的能力。调用这些API接口都离不开access_token的接口凭证。只有拿到这个才能进行后续的服务调用。


一、获取access_token

获取access_token是调用企业微信API接口的第一步,相当于创建了一个登录凭证,其它的业务API接口,都需要依赖于access_token来鉴权调用者身份。
因此开发者,在使用业务接口前,要明确access_token的颁发来源,使用正确的access_token。

二、使用步骤

1.引入jar包

我这里使用了Hutool工具包

<!-- hutool工具包 -->
<dependency>
	<groupId>cn.hutool</groupId>
	<artifactId>hutool-all</artifactId>
	<version>5.4.6</version>
</dependency>

2.代码实现

从官方文档拿到接口地址和参数,如不明白可参考官方文档:https://developer.work.weixin.qq.com/document/path/91039
请求方式: GET(HTTPS)
请求地址: https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET
参数说明:

参数是否必须说明
corpid企业ID,获取方式参考:术语说明-corpid
corpsecret应用的凭证密钥,获取方式参考:术语说明-secret

权限说明:
每个应用有独立的secret,获取到的access_token只能本应用使用,所以每个应用的access_token应该分开来获取。

注意事项:access_token的有效期通过返回的expires_in来传达,正常情况下为7200秒(2小时),有效期内重复获取返回相同结果,过期后获取会返回新的access_token。

我这里做的是存入数据库,开发者们可以自行选择缓存方式如:数据库、redis等。
核心代码如下:

	/**
     * 获取token
     * @param corpId 企业的ID
     * @param agentId 应用的密钥凭证
     * @return
     */
    public String getToken(String corpId, String agentId){
        String token1111 = "";
        try {
            log.info("获取access_token开始......");
            //先从数据库查,有做有效时间判断,无重新拉取
            TWxAccessToken wxAccessToken = tWxAccessTokenMapper.getAccessToken(corpId,agentId,"N");
            if(wxAccessToken != null){
                Date expiresTime = wxAccessToken.getExpiresTime();
                log.info("获取凭证有效期:{},当前时间是否小于有效时间:{}",expiresTime,new Date().before(expiresTime));
                if (new Date().before(expiresTime)) {   //当前时间小于有效时间
                    token = wxAccessToken.getAccessToken();
                }else{
                	//替换url的字段
                    String requestUrl = accessTokenUrl.replace("ID", corpId).replace("SECRET",agentId.trim());
                    String result = HttpRequest.get(requestUrl).setHttpProxy(httpProxyHost, httpProxyPort).execute().body();
                    log.info("数据库有资源,从企微获取access_token结果:{}",result);
                    JSONObject jsonObject = JSONObject.parseObject(result);
                    if (null != jsonObject) {
                        token = jsonObject.getString("access_token");
                        wxAccessToken.setAccessToken(token);
                        wxAccessToken.setExpiresTime(DateUtil.offsetSecond(new Date(),jsonObject.getInteger("expires_in")));
                        log.info("更新access_token");
                        tWxAccessTokenMapper.updateAccessToken(wxAccessToken);
                    }
                }
            }else{//数据库没有记录,从企微拉取,拉取之后存入数据库
                String requestUrl = accessTokenUrl.replace("ID", corpId).replace("SECRET",agentId.trim());
                String result = HttpRequest.get(requestUrl).setHttpProxy(httpProxyHost, httpProxyPort).execute().body();
                log.info("数据库无资源,从企微获取access_token结果:{}",result);
                JSONObject jsonObject = JSONObject.parseObject(result);
                if (null != jsonObject) {
                    token = jsonObject.getString("access_token");
                    wxAccessToken = new TWxAccessToken();
                    wxAccessToken.setCorpId(corpId);
                    wxAccessToken.setAgentSecret(agentId);
                    wxAccessToken.setAccessToken(token);
                    wxAccessToken.setExpiresTime(DateUtil.offsetSecond(new Date(),jsonObject.getInteger("expires_in")));
                    wxAccessToken.setFlag("N");
                    log.info("新增access_token");
                    tWxAccessTokenMapper.insert(wxAccessToken);
                }
            }
        }catch (Exception e){
            log.error("获取token失败:{}",e.getMessage());
        }
        return token;
    }

返回结果:
expires_in表示的就是有效时间,这里是秒

{
   "errcode": 0,
   "errmsg": "ok",
   "access_token": "1111111111",
   "expires_in": 7200
}

参数说明:

参数说明
errcode出错返回码,为0表示成功,非0表示调用失败
errmsg返回码提示语
access_token获取到的凭证,最长为512字节
expires_in凭证的有效时间(秒)

总结

以上就是今天要讲的内容,需要注意的有两个点:
1.权限:每个应用有独立的secret,获取到的access_token只能本应用使用,所以每个应用的access_token应该分开来获取,不能多个应用用同一个access_token
2.有效期:开发者需要缓存access_token,用于后续接口的调用(注意:不能频繁调用gettoken接口,否则会受到频率拦截)。当access_token失效或过期时,需要重新获取。

注:企业微信可能会出于运营需要,提前使access_token失效,开发者应实现access_token失效时重新获取的逻辑。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值