public void downloadTradeBill() {
// 使用RSAAutoCertificateConfig,构造service
Config config = WechatPayConfig.initConfig();
BillDownloadServiceExtension service = new BillDownloadServiceExtension.Builder().config(config).build();
GetTradeBillRequest request = new GetTradeBillRequest();
request.setBillDate("2024-09-24");
request.setBillType(BillType.ALL);
request.setTarType(TarType.GZIP);
DigestBillEntity bill = service.getTradeBill(request);
System.out.println("bill = " + bill);
if (!bill.verifyHash()) {
System.out.println(" 校验不通过 " );
// return;
}
File outputFile = new File("E:/交易账单.xlsx");
try (InputStream inputStream = bill.getInputStream()) {
// 使用有缓存的 BufferedOutputStream
try (BufferedOutputStream outputStream = new BufferedOutputStream(Files.newOutputStream(outputFile.toPath()))) {
// 处理大文件时,常用的缓冲区大小为 8192 或 16384。
// 不过,最佳缓冲区大小可能取决于具体的硬件和系统配置。
byte[] buffer = new byte[16384];
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
outputStream.write(buffer, 0, bytesRead);
}
}
} catch (IOException e) {
throw new RuntimeException(e);
}
}
以上是我下载微信支付账单 的代码,根据你们的文档,下载后,需要调用
bill.verifyHash()进行校验,我调bill.verifyHash()返回false,但是实际下载 下来的账单
是完整的无误的。我能把账单下载下来,说明支付相关的配置,包括签名啊啥的肯定也是正确的吧。
所以这里是咋回事呢?
PS:我分多日 ,每日重试了多次,所以返回false不是偶发,而是每次返回false。所以绝对不可能是网络出啥问题。
文件下载接口需要跳过验签流程,商户需要将实际账单文件的哈希值和之前从接口获取到的哈希值进行比对,以确认数据的完整性。