{"id":1589,"date":"2023-03-25T19:50:12","date_gmt":"2023-03-25T11:50:12","guid":{"rendered":"https:\/\/www.appblog.cn\/?p=1589"},"modified":"2023-04-27T21:28:36","modified_gmt":"2023-04-27T13:28:36","slug":"java-implementation-of-wechat-refund-error-unexpected-end-of-file-from-server","status":"publish","type":"post","link":"https:\/\/www.appblog.cn\/index.php\/2023\/03\/25\/java-implementation-of-wechat-refund-error-unexpected-end-of-file-from-server\/","title":{"rendered":"Java\u5b9e\u73b0\u5fae\u4fe1\u9000\u6b3e\u62a5\u9519unexpected end of file from server"},"content":{"rendered":"<h2>\u95ee\u9898\u5206\u6790<\/h2>\n<p>\u5fae\u4fe1\u626b\u7801\u652f\u4ed8\uff0c\u7533\u8bf7\u9000\u6b3e\u63a5\u53e3\u62a5\u9519\uff1a<\/p>\n<pre><code>unexpected end of file from server<\/code><\/pre>\n<p><!-- more --><\/p>\n<p>\u95ee\u9898\u5728\u4e8e\u7533\u8bf7\u9000\u6b3e\u662f\u9700\u8981\u9700\u8981\u53cc\u5411\u8bc1\u4e66\uff0c\u8be6\u89c1\u7533\u8bf7\u9000\u6b3e\u6587\u6863\u8bf4\u660e\uff1a<\/p>\n<p>\u5883\u5185\u652f\u4ed8\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/pay.weixin.qq.com\/wiki\/doc\/api\/native.php?chapter=9_5\">https:\/\/pay.weixin.qq.com\/wiki\/doc\/api\/native.php?chapter=9_5<\/a><br \/>\n\u5883\u5916\u652f\u4ed8\uff1a<a target=\"_blank\" rel=\"noopener\" href=\"https:\/\/pay.weixin.qq.com\/wiki\/doc\/api\/external\/native_sl.php?chapter=9_4\">https:\/\/pay.weixin.qq.com\/wiki\/doc\/api\/external\/native_sl.php?chapter=9_4<\/a><\/p>\n<blockquote>\n<p>\u652f\u4ed8\u4e0d\u9700\u8981\u8bc1\u4e66\uff0c\u9000\u6b3e\u9700\u8981\u53cc\u5411\u8bc1\u4e66<\/p>\n<\/blockquote>\n<p>Java\u4f7f\u7528<code>apiclient_cert.p12<\/code>\u5373\u53ef<\/p>\n<p>\u8bc1\u4e66\u4e0b\u8f7d\u5165\u53e3\uff1a\u8d26\u6237\u8bbe\u7f6e\uff08Account Setting\uff09 -&gt; API\u5b89\u5168\uff08API Security\uff09-&gt; API\u8bc1\u4e66\uff08API certificate\uff09<\/p>\n<p>\u8bc1\u4e66\u9ed8\u8ba4\u5bc6\u7801\uff1a\u4e0e\u5546\u6237\u53f7\u4e00\u81f4<\/p>\n<h2>Spring Boot RestTemplate \u52a0\u8f7d p12\u8bc1\u4e66<\/h2>\n<pre><code class=\"language-java\">import lombok.extern.slf4j.Slf4j;\nimport org.apache.http.conn.ssl.NoopHostnameVerifier;\nimport org.apache.http.conn.ssl.SSLConnectionSocketFactory;\nimport org.apache.http.impl.client.CloseableHttpClient;\nimport org.apache.http.impl.client.HttpClients;\nimport org.springframework.beans.factory.annotation.Autowired;\nimport org.springframework.context.annotation.Bean;\nimport org.springframework.context.annotation.Configuration;\nimport org.springframework.http.client.ClientHttpRequestFactory;\nimport org.springframework.http.client.HttpComponentsClientHttpRequestFactory;\nimport org.springframework.http.client.SimpleClientHttpRequestFactory;\nimport org.springframework.web.client.RestTemplate;\n\nimport javax.net.ssl.KeyManagerFactory;\nimport javax.net.ssl.SSLContext;\nimport java.io.File;\nimport java.io.FileInputStream;\nimport java.io.IOException;\nimport java.security.*;\nimport java.security.cert.CertificateException;\n\n@Slf4j\n@Configuration\npublic class RestTemplateConfig {\n\n    @Autowired\n    private WxpayConfig wxpayConfig;\n\n    @Bean\n    \/\/@LoadBalanced   \/\/\u589e\u52a0 load balance \u7279\u6027\n    public RestTemplate restTemplate() {\n        ClientHttpRequestFactory factory = httpComponentsClientHttpRequestFactory();\n        return new RestTemplate(factory);\n    }\n\n    public ClientHttpRequestFactory simpleClientHttpRequestFactory() {\n        SimpleClientHttpRequestFactory factory = new SimpleClientHttpRequestFactory();\n        factory.setReadTimeout(15000);  \/\/\u5355\u4f4d\u4e3ams\n        factory.setConnectTimeout(15000);  \/\/\u5355\u4f4d\u4e3ams\n\n        return factory;\n    }\n\n    public ClientHttpRequestFactory httpComponentsClientHttpRequestFactory() {\n        HttpComponentsClientHttpRequestFactory factory = null;\n        String password = wxpayConfig.getMchId();\n\n        try {\n            KeyStore ks = KeyStore.getInstance(&quot;PKCS12&quot;);\n            ks.load(new FileInputStream(new File(&quot;\/home\/appblog\/apiclient_cert.p12&quot;)), password.toCharArray());\n\n            KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());\n            kmf.init(ks, password.toCharArray());\n\n            SSLContext ssl = SSLContext.getInstance(&quot;TLS&quot;);\n            ssl.init(kmf.getKeyManagers(), null, null);\n\n            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(ssl, NoopHostnameVerifier.INSTANCE);\n\n            CloseableHttpClient httpClient = HttpClients.custom().setSSLSocketFactory(sslsf).build();\n            factory = new HttpComponentsClientHttpRequestFactory(httpClient);\n            factory.setReadTimeout(15000);  \/\/\u5355\u4f4d\u4e3ams\n            factory.setConnectTimeout(15000);  \/\/\u5355\u4f4d\u4e3ams\n\n            return factory;\n        } catch (UnrecoverableKeyException | KeyManagementException | KeyStoreException | NoSuchAlgorithmException | CertificateException | IOException e) {\n            log.error(&quot;RestTemplateConfig.httpComponentsClientHttpRequestFactory error: &quot;, e);\n        }\n\n        return null;\n    }\n\n}<\/code><\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u95ee\u9898\u5206\u6790 \u5fae\u4fe1\u626b\u7801\u652f\u4ed8\uff0c\u7533\u8bf7\u9000\u6b3e\u63a5\u53e3\u62a5\u9519\uff1a unexpected end of file from serve [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[371],"tags":[],"class_list":["post-1589","post","type-post","status-publish","format-standard","hentry","category-wechat-pay"],"_links":{"self":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1589","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/comments?post=1589"}],"version-history":[{"count":0,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/posts\/1589\/revisions"}],"wp:attachment":[{"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/media?parent=1589"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/categories?post=1589"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.appblog.cn\/index.php\/wp-json\/wp\/v2\/tags?post=1589"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}