Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

拉取支付评价的接口报错:商户签名错误 #752

Closed
bennie0829 opened this issue Sep 5, 2018 · 15 comments
Closed

拉取支付评价的接口报错:商户签名错误 #752

bennie0829 opened this issue Sep 5, 2018 · 15 comments

Comments

@bennie0829
Copy link

调用微信支付里拉取用户评论数据的接口:
this.wxService.queryComment(DateUtils.addDays(new Date(), -30), new Date(), 0, 200);

报错:
WxPayException(customErrorMsg=null, returnCode=FAIL, returnMsg=商户签名错误, resultCode=null, errCode=null, errCodeDes=null, xmlString=
<return_code></return_code>
<return_msg></return_msg>
)

将打印出来的请求数据放到微信支付接口签名校验工具里校验,结果如下:
1.接口请求的原始数据去校验,校验失败。
image

2.接口请求的原始数据去掉 <sign_type>HMAC-SHA256</sign_type>,校验成功。
image

结论:从实验结果上,请求数据设置了signType就会签名出错,不清楚是微信本身问题,还是weixin-java-pay的接口问题, <sign_type>HMAC-SHA256</sign_type> 本身有默认值,建议去掉这个设置,以便解决这个问题。

@bennie0829
Copy link
Author

bennie0829 commented Sep 5, 2018

WxPayQueryCommentRequest request = new WxPayQueryCommentRequest();
request.setBeginTime(QUERY_COMMENT_DATE_FORMAT.format(DateUtils.addDays(new Date(), -30)));
request.setEndTime(QUERY_COMMENT_DATE_FORMAT.format(new Date()));
request.setOffset(0);
request.setLimit(200);
request.setSignType(WxPayConstants.SignType.HMAC_SHA256);
request.checkAndSign(this.wxService.getConfig());
request.setSignType(null);//把源码拷出来,加了这一句话,得到请求的xml,去校验工具验证可以通过了,但是!!还是要报错说商户签名错误!!!无语了!!校验工具都通过了啊!!!!

        String url = this.wxService.getPayBaseUrl() + "/billcommentsp/batchquerycomment";

        String responseContent = this.wxService.post(url, request.toXML(), true);
        if (responseContent.startsWith("<")) {
            throw WxPayException.from(BaseWxPayResult.fromXML(responseContent, WxPayCommonResult.class));
        }
        System.out.println(responseContent);

@bennie0829
Copy link
Author

找到表现原因了,是limit不能设置值!!
this.wxService.queryComment(DateUtils.addDays(new Date(), -30), new Date(), 0, null);

这样就可以正常返回评论数据!!!别问我为什么,我也不知道。。

@binarywang
Copy link
Member

所以现在的结论是,代码有问题,然后接口请求也不能填那个limit?是这样吗?

@bennie0829
Copy link
Author

@binarywang
不清楚是wexin-java-pay代码有问题,还是微信本身没有处理limit参数进行签名加密。

反正目前调用this.wxService.queryComment(DateUtils.addDays(new Date(), -30), new Date(), 0, null);是可以正常返回数据的。只要设置了limit就会报错。

@binarywang
Copy link
Member

可能真的是这样,你看我单元测试里的用例limit就设的null,测过没问题

@binarywang
Copy link
Member

binarywang commented Sep 9, 2018

又仔细调试下了,limit确实没参与签名,妈蛋,这太坑爹了

@bennie0829
Copy link
Author

@binarywang 哈哈哈哈,那我就放心了,你快代表广大人民去给微信提bug吧。

@binarywang
Copy link
Member

提bug没用的,不如自己动手在程序里做修补,代码已提交,一会儿发布个测试版本,可以测一下

@binarywang
Copy link
Member

3.1.8.B版本已修复

yuanqixun pushed a commit to yuanqixun/weixin-java-tools that referenced this issue Sep 9, 2018
* develop:
  发布3.1.8.B测试版本
  Wechat-Group#752 修复微信支付拉取支付评价的接口(limit不参与签名)
@bennie0829
Copy link
Author

@binarywang 我去,今天突然发现,又拉取不了评论了,报同样的错误“商户签名错误”,程序没有部署过,看日志之前都是正常拉取,昨天下午开始拉取17:30左右到现在一直都报错无法拉取。。感觉是微信方的这个接口又做了调整,麻烦你看看你的单元测试现在能过吗?

@binarywang
Copy link
Member

单元测试你也可以跑一下的

@bennie0829
Copy link
Author

@binarywang 跑了一下BaseWxPayServiceImplTest里的testQueryComment测试用例,不出所料,果然跑不过了。。

`【请求地址】:https://api.mch.weixin.qq.com/billcommentsp/batchquerycomment
【请求数据】:
wx1669739878acdf20
<mch_id>1514034031</mch_id>
<nonce_str>1542776716881</nonce_str>
ACA2A599870E12200881E433254DCE4F4897EF8F8E3BBE782C388B1D10100032
<sign_type>HMAC-SHA256</sign_type>
<begin_time>20180824130516</begin_time>
<end_time>20181120130516</end_time>
0
1

【响应数据】:
<return_code></return_code>
<return_msg></return_msg>

13:05:17.689 [main] DEBUG o.a.h.i.c.PoolingHttpClientConnectionManager - Connection manager is shutting down
13:05:17.689 [main] DEBUG o.a.h.i.c.DefaultManagedHttpClientConnection - http-outgoing-0: Close connection
13:05:17.690 [main] DEBUG o.a.h.i.c.DefaultManagedHttpClientConnection - http-outgoing-0: Close connection
13:05:17.690 [main] DEBUG o.a.h.i.c.PoolingHttpClientConnectionManager - Connection manager shut down
13:05:17.690 [main] DEBUG o.a.h.impl.execchain.MainClientExec - Cancelling request execution

返回代码:[FAIL],返回信息:[商户签名错误],微信返回的原始报文:

<return_code></return_code>
<return_msg></return_msg>

WxPayException(customErrorMsg=null, returnCode=FAIL, returnMsg=商户签名错误, resultCode=null, errCode=null, errCodeDes=null, xmlString=
<return_code></return_code>
<return_msg></return_msg>
)
at com.github.binarywang.wxpay.exception.WxPayException$Builder.build(WxPayException.java:197)
at com.github.binarywang.wxpay.exception.WxPayException.from(WxPayException.java:99)
at com.github.binarywang.wxpay.service.impl.BaseWxPayServiceImpl.queryComment(BaseWxPayServiceImpl.java:879)
at com.github.binarywang.wxpay.service.impl.BaseWxPayServiceImplTest.testQueryComment(BaseWxPayServiceImplTest.java:580)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:104)
at org.testng.internal.Invoker.invokeMethod(Invoker.java:645)
at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:851)
at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:1177)
at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:129)
at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:112)
at org.testng.TestRunner.privateRun(TestRunner.java:756)
at org.testng.TestRunner.run(TestRunner.java:610)
at org.testng.SuiteRunner.runTest(SuiteRunner.java:387)
at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:382)
at org.testng.SuiteRunner.privateRun(SuiteRunner.java:340)
at org.testng.SuiteRunner.run(SuiteRunner.java:289)
at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:86)
at org.testng.TestNG.runSuitesSequentially(TestNG.java:1293)
at org.testng.TestNG.runSuitesLocally(TestNG.java:1218)
at org.testng.TestNG.runSuites(TestNG.java:1133)
at org.testng.TestNG.run(TestNG.java:1104)
at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:72)
at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)

===============================================
Default Suite
Total tests run: 1, Failures: 1, Skips: 0
===============================================`

@bennie0829
Copy link
Author

看了源码,尝试把两个被忽略的参数去掉之后,测试用例可以通过,应该是微信已经修复了这个接口。然而没有通知你。- -#

WxPayQueryCommentRequest.java里的getIgnoredParamsForSign方法。

@OverRide
protected String[] getIgnoredParamsForSign() {
return new String[]{"limit","sign_type"};
}

这里两个参数都去掉就可以了。

@binarywang
Copy link
Member

binarywang commented Nov 21, 2018

果然如此,微信支付的软件开发团队可真够垃圾的,有问题的接口居然能存在这么久才修复,才开始开发时候居然不先测试好就发布出来。(估计他们也会看到我说这句话,who cares!)

@Ziyear
Copy link

Ziyear commented Aug 7, 2019

我也遇到这个问题了,提示的是签名长度错误,代码中有问题
com.github.binarywang.wxpay.service.impl.BaseWxPayServiceImpl#queryComment(com.github.binarywang.wxpay.bean.request.WxPayQueryCommentRequest)
这个方法中设置签名类型应该在生成签名前,我在外边给request设置签名类型HMAC-SHA256就可以了 我的版本是 3.4.0

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants