// GET 获取部门列表
GET_DEPARTMENT_URL("https://qyapi.weixin.qq.com/cgi-bin/department/list?access_token=ACCESS_TOKEN&id=ID")
String urlValue = QyaApiEnum.GET_DEPARTMENT_URL.getUrlValue();
String accessToken = tokenUtil.getAccessToken();
String url = urlValue.replace("ACCESS_TOKEN", accessToken).replace("ID", id);
ResponseEntity forEntity = restTemplate.getForEntity(url, String.class);
log.info("获取部门列表:" + forEntity.getBody());
2.由于企业微信根据企业ID和凭证密钥获取的access_token长度过长,在测试过程中,发现获取的token与替换之后请求的token由于使用replace替换出现字符串丢失
// 根据https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=ID&corpsecret=SECRET获取的的token为
// ******************NukGFk6AIDnmLC9KRSngNkPr38IzAaE8feZKlgviBrSM67ayjpR9T0zWQOO7QlujPA
String url = urlValue.replace("ACCESS_TOKEN", accessToken).replace("ID", id);
// 替换后的token为******************NukGFk6A1nmLC9KRSngNkPr38IzAaE8feZKlgviBrSM67ayjpR9T0zWQOO7QlujPA
3.在调用的时候,还重新获取token比对了一下,最后发现是替换丢失,报错信息如下
// 获取token的有效期是7200秒。如果出现token超时也会报此错误。
// 当时使用postman测试此token请求接口是正常的。
{
"errcode": 40014,
"errmsg": "invalid access_token",
"department": []
}
4.后来采用UriComponentsBuilder进行拼接请求参数,也可以使用map进行传参
public static String handUrlParam(String httpUrl, String accessToken, String departmentId, String fetchChild) {
UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(httpUrl)
.queryParam("access_token", accessToken)
.queryParam("department_id", departmentId)
.queryParam("fetch_child", fetchChild);
return builder.build().encode().toUriString();
}
5.总结
因为之前使用restTemplate调用http请求是map传参,由于get请求传参较少,当时就直接在url拼接替换,未考虑字符串过长出现丢失的情况。最后经过网上查看企业微信官方社区,然后查找代码发现问题。



