这个接口是比较特殊的一个接口,特殊在请求报文body后面没有换行符
当下我们对接微信支付相关的接口基本都是 V3 版本的,根据微信提供的 jar包直接通过WechatPayHttpClientBuilder构建HttpClient
废话也不多说了,解决办法就在这个HttpClient构建上。两步走:
第一步:
重写WechatPay2Credentials --- 说白了就是代码复制过来,建一个自己的类。如:MyWechatPay2Credentials,然后将方法BuildMessage() 中最后的换行符去掉
需要注意的是,这个类里面用到的类Signer 由于包的问题我们无法直接使用微信提供的类,因此也需要复制一个,里面的代码没有变化,还有一个Signer的实现类也需要我们做类似操作,这个用到再说
第二步:
重点就是构建HttpClient,代码我贴个全份的
public static InputStream doGetWithFile(WxConfig wxConfig, String url) throws Exception{
PrivateKey merchantPrivateKey = WxAPIV3SignUtils.getPrivateKey(wxConfig.getPrivateKey());
XfsWechatPay2Credentials credentials = new XfsWechatPay2Credentials(wxConfig.getMerchantId(),
new XfsPrivateKeySigner(wxConfig.getMerchantSerialNumber(), WxAPIV3SignUtils.getPrivateKey(wxConfig.getPrivateKey())));
//构造微信httClient
WechatPayHttpClientBuilder builder = WechatPayHttpClientBuilder.create()
.withMerchant(wxConfig.getMerchantId(), wxConfig.getMerchantSerialNumber(), merchantPrivateKey)
.withCredentials(credentials)
.withValidator(response -> true);
CloseableHttpClient httpClient = builder.build();
HttpGet httpGet = new HttpGet(url);
httpGet.addHeader("Accept", ContentType.WILDCARD.getMimeType());
try (InputStream content = httpClient.execute(httpGet, InputStreamResponseHandler.INSTANCE)) {
return content;
} catch (Exception e) {
log.error("根据download_url{}, 下载文件流有误:{}", url, e.getMessage());
} finally {
httpGet.releaseConnection();
}
return null
}
就是这个XfsPrivateKeySigner,相同的动作,找到PrivateKeySigner复制代码,将其中的Signer替换为我们的XfsSigner即可
我们自动注入的签名就在这个 withCredentials中了。
然后才是这个withValidator(response -> true) 跳过验签动作
综合下来两步走基本就能得到我们的文件流了。
需要注意的是,流数据只能读一次!
==========================================
还有一种解决方式是直接拿zkinghao 的工具类解决问题,这里贴一下链接
==========================================
最后一种方法也是在下强推的方式:
接入第三方binarywang封装的工具,非常好用,墙裂推荐。引入这个包之后,我们想对接任何微信相关的功能只需要进行简单的配置以及非常少的代码编写。用过你就会爱上。它支持多商户切换。