最近公司的项目介入了一个的三方支付,因为刚来公司不久,正好接手了这一块,在接入三方支付api时候发现在本地代码在编辑器跑测试没问题,但是上传到测试服务器后无法进行调用三方api报错socket异常如下
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:196)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:442)
at sun.security.ssl.InputRecord.read(InputRecord.java:480)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:934)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1332)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1359)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1343)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:563)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:1092)```
开始以为是代码 问题 检查代码 后无异常跟测试环境代码完全相同 ,开始怀疑是否是nginx 或者 是服务器 的问题, 因为服务器是我新申请的,各种环境也是我新搭建的。 所以首先排查是否服务器问题,直接在linux上curl了一下请求三方下单接口发现没有问题可以跑得通 ,所以服务器问题排掉, 后检查nginx 也没的问题, 所以怀疑是否是jdk 环境问题,所以将项目单独部署本地tomcat进行测试, 将本地环境更换为1.7 进行测试 发现使用jdk.net http 调用三方api 进行连接 出现跟测试服务器相同异常 无法建立连接, 所以又将本地jdk 更换为1.8 之后调用api正常, 此时问题定位 应该是jdk版本问题, 所以去查官方文档发现jdk1.7 TLS协议 默认是 1.1 但是三方支付api 应该使用TLS1.2,
**还有一点就是 为什么之前本地 跑是没问题,因为本人一直是在本地idea编辑器进行测试 编辑器项目 用的1.8 所以一直没发现这个问题。**
*总之就是一个TLS协议版本的 问题*
解决办法:
代码中添加 协议版本
```java
SSLContext sslcontext = SSLContext.getInstance("TLSv1.2");
问题总结:
1. 对jdk各个版本之间差异理解不透
2. 问题扩大化。
3. 信心不够 总觉得自己搭建服务有问题
4. 还是学艺不精啊 …