1. 程式人生 > >https post請求,Nginx報405錯誤

https post請求,Nginx報405錯誤

        最近在做微信開發,公司打算對產品增加微信支付功能,但是微信支付費率較高,於是與某微信支付的第三方合作,利用他們的平臺,完成微信支付。經過測試,基本確定使用公眾號支付方式。但在聯調時,遇到一個非常坑的問題。一開始掉進去了,和同事掙扎了一天,最終發現只是個很簡單的問題。

        微信支付成功後,會有後臺通知,微信通知平臺,平臺再通知我們的服務端。但在通訊時,服務端接收資訊失敗。一開始,懷疑對方的後臺通知地址配置錯誤,再三確認,對方迴應地址正確,沒有問題。然後懷疑是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"

我們的通知地址是一個完整的請求地址,而對方請求時只是用了域名和埠號,當然訪問不通。和別的公司聯調最頭疼的就是溝通問題,我懷疑對方通知地址配置有問題,對方確認沒問題,最終發現還是這個問題。有時候,就要堅持,就是要溝通。