项目中请求第三方接口踩坑记录

问题代码

@Slf4j
public class TestWechat {

    public <T extends WxBaseReq, K extends WxBaseResp> K sendV3(T t, String method, Class<K> kClass) {
        K k = null;
        String body = JSON.toJSONString(t);
        String apiUrl = "";//请求API
        log.info("wechat http v3 requestUrl :{} ,body:{}", apiUrl, body);
        ResponseEntity<K> responseEntity = null;
        Long startTime = System.currentTimeMillis();
        try {
            // 有问题的地方
            HttpEntity<T> entity = new HttpEntity<>(t, getHttpHeader("POST", apiUrl, body));
            responseEntity = new RestTemplate().postForEntity(apiUrl, entity, kClass);
            log.info("wechat http v3 response:{}", responseEntity);
            if (responseEntity != null) {
                k = responseEntity.getBody();
            }
        } catch (HttpClientErrorException e) {
            log.info("wechat http v3 HttpClientErrorException:{}", e.getResponseBodyAsString());
            throw e;
        }
        return k;
    }

    private HttpHeaders getHttpHeader(String method, String apiUrl, String body) {
        //设置签名的请求头
        return new HttpHeaders();
    }

    public static class WxBaseReq {

    }

    public static class WxBaseResp {

    }
}

问题描述

我们在使用 getHttpHeader() 方法计算签名时,使用的是 t 对象转换为 json 后的字符串,而网络请求中传输过去的是 t 对象,网络框架默认使用 jackson 来序列化对象,而这里我们使用了 fastjson,两者结果不一致,导致最终签名错误。

解决方式

HttpEntity<T> entity = new HttpEntity<>(body, getHttpHeader("POST", apiUrl, body));

将json 字符串通过网络传输,这样就不会受不同 json 框架的影响了。

posted @ 2024-03-19 20:26  strongmore  阅读(12)  评论(0编辑  收藏  举报