https post请求,Nginx报405错误

来源:互联网 发布:北京知蜂堂上海店 编辑:程序博客网 时间:2024/05/22 05:14


        最近在做微信开发,公司打算对产品增加微信支付功能,但是微信支付费率较高,于是与某微信支付的第三方合作,利用他们的平台,完成微信支付。经过测试,基本确定使用公众号支付方式。但在联调时,遇到一个非常坑的问题。一开始掉进去了,和同事挣扎了一天,最终发现只是个很简单的问题。


        微信支付成功后,会有后台通知,微信通知平台,平台再通知我们的服务端。但在通信时,服务端接收信息失败。一开始,怀疑对方的后台通知地址配置错误,再三确认,对方回应地址正确,没有问题。然后怀疑是Nginx的问题,因为对方日志为“Nginx 405 not allowed”。然后去百度,果然,网上有好多类似的问题和回答,一一实验,均接收不到对方的后台通知。期间,很坑的是,我们自己在浏览器用https get方式请求,和用代码模拟对方通知我们的https post请求,都可以请求成功和得到返回值。我们怀疑对方代码有问题,但是对方调整了n次,都不行。我无法看到对方代码,只好自己写个demo发给他们,让他们自己调。

      期间,我们升级了Nginx,由1.7.3升级到1.10.2,重新配置了https支持(http://blog.csdn.net/xuxile/article/details/53609700)。修改了tomcat配置,重新配置了tomcat7的https请求设置(http://blog.csdn.net/xuxile/article/details/53671576)。其中,在Nginx升级后,https访问报错:

2017/02/10 10:29:52 [error] 30483#0: *563 SSL_do_handshake() failed (SSL: error:100AE081:elliptic curve routines:EC_GROUP_new_by_curve_name:unknown group error:1408D010:SSL routines:SSL3_GET_KEY_EXCHANGE:EC lib) while SSL handshaking to upstream, client: ip地址, server: localhost, request: "GET /xxxpay/weixin/payNotice HTTP/1.1", upstream: "https://192.2.2.13:8443/xxxpay/weixin/payNotice", host: "ip地址:2443"。

原因是openssl的版本过旧,更新或卸载重新安装最新版本即可。

      戏剧性的是,最终在看Nginx的日志时,突然发现了问题所在,对方请求地址有问题,才会访问失败。一开始由于对方确认请求地址配置无误,就没向这方面怀疑。下面贴代码:

tomcat日志:

10:28:09 [INFO ] PayService 模拟后台通知接口,返回报文:<html><head><title>405 Not Allowed</title></head><body bgcolor="white"><center><h1>405 Not Allowed</h1></center><hr><center>nginx/1.10.2</center></body></html>
10:28:09 [ERROR] Digester Parse Fatal Error at line 1 column 148: 元素类型 "HR" 必须由匹配的结束标记 "</HR>" 终止。
org.xml.sax.SAXParseException; lineNumber: 1; columnNumber: 148; 元素类型 "HR" 必须由匹配的结束标记 "</HR>" 终止。
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:198)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.fatalError(ErrorHandlerWrapper.java:177)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:441)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:368)
at com.sun.org.apache.xerces.internal.impl.XMLScanner.reportFatalError(XMLScanner.java:1436)

Nginx日志:

我自己模拟:

xxx.xxx.xx.xx - - [10/Feb/2017:13:14:46 +0800] "POST /xxxpay/weixin/payNotice HTTP/1.1" 200 353 "-" "Jakarta Commons-HttpClient/3.1"
xxx.xxx.xx.xx - - [10/Feb/2017:13:42:17 +0800] "POST /xxxpay/weixin/payNotice HTTP/1.1" 200 353 "-" "Jakarta Commons-HttpClient/3.1"
xxx.xxx.xx.xx - - [10/Feb/2017:13:43:52 +0800] "POST /xxxpay/weixin/payNotice HTTP/1.1" 200 353 "-" "Jakarta Commons-HttpClient/3.1"
xxx.xxx.xx.xx- - [10/Feb/2017:13:47:50 +0800] "POST /xxxpay/weixin/payNotice HTTP/1.1" 200 353 "-" "Jakarta Commons-HttpClient/3.1"

对方后台通知:
xxx.xx.xx.xxx - - [10/Feb/2017:16:37:39 +0800] "POST / HTTP/1.0" 405 173 "-" "Jakarta Commons-HttpClient/3.0.1"
xxx.xx.xx.xxx  - - [10/Feb/2017:16:38:09 +0800] "POST / HTTP/1.0" 405 173 "-" "Jakarta Commons-HttpClient/3.0.1"
xxx.xx.xx.xxx  - - [10/Feb/2017:16:38:39 +0800] "POST / HTTP/1.0" 405 173 "-" "Jakarta Commons-HttpClient/3.0.1"


我们的通知地址是一个完整的请求地址,而对方请求时只是用了域名和端口号,当然访问不通。和别的公司联调最头疼的就是沟通问题,我怀疑对方通知地址配置有问题,对方确认没问题,最终发现还是这个问题。有时候,就要坚持,就是要沟通。

0 0