企业微信请求接口之替换token丢失,报错invalid access_token

 1.使用spring原生restTemplate请求接口

// 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进行传参

/**
     * 拼接url请求参数
     *
     * @param httpUrl      请求url
     * @param accessToken  调用接口凭证
     * @param departmentId 获取的部门id
     * @param fetchChild   是否递归获取子部门下面的成员:1-递归获取,0-只获取本部门
     * @return
     */
    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拼接替换,未考虑字符串过长出现丢失的情况。最后经过网上查看企业微信官方社区,然后查找代码发现问题。

你可能感兴趣的:(调用第三方API接口,微信)