wechatpay-apiv3 / wechatpay-java

微信支付 APIv3 的官方 Java Library
Apache License 2.0
965 stars 211 forks source link

电子回单下载提示签名无效 #160

Closed Terry163com closed 1 year ago

Terry163com commented 1 year ago

错误描述

在通过com.wechat.pay.java.core.http.AbstractHttpClient.download 方法下载回单数据流时。下载回的文件为json格式 且内容为{"code":"INVALID REQUEST","message":"错误的签名,导致验签失败"} image 后发现回单下载接口的参数规则与其他V3接口不一致。请求报文 body 后面没有换行符。

源代码中,下载文件接口和其他V3接口使用了同一个buildMessage方法,需要进行判断是否为回单下载链接

private String buildMessage(
      String nonce, long timestamp, URI uri, String httpMethod, String signBody) {
    String canonicalUrl = uri.getRawPath();
    if (uri.getQuery() != null) {
      canonicalUrl += "?" + uri.getRawQuery();
    }
    return httpMethod
        + "\n"
        + canonicalUrl
        + "\n"
        + timestamp
        + "\n"
        + nonce
        + "\n"
        + (signBody == null ? "" : signBody)
        + ((uri.getPath().startsWith("/v3/transferdownload"))?"":"\n");
  } 

重现bug的步骤

使用com.wechat.pay.java.core.http.AbstractHttpClient.download方法对返回的回单地址进行下载

预期行为

返回正确的回单pdf

导致错误的代码片段

No response

操作系统

win10

Java 版本

Java8

wechatpay-java 版本

0.2.7

其他信息

No response

xy-peng commented 1 year ago

严格来说,这是接口实现上的bug。已经跟相关同事沟通,预期最近一段时间修复,到时候能同时兼容两种签名。

从 SDK 维护的角度,我不希望兼容这个bug。短期内,建议 @Terry163com 自行修改代码。等接口修复后,再切回官方的代码。

Terry163com commented 1 year ago

好的。没毛病,我也觉得这是接口端的问题哈哈。

xy-peng commented 1 year ago

API 的兼容逻辑今天已经发布了, @Terry163com 可以直接用 SDK 试试