public static Element request(HashMap<String, String> requestMap, IVenderConfig config, String functionCode) throws Exception { URL url = null; URLConnection connection = null; BufferedReader reader = null; BufferedWriter writer = null; try { url = new URL(config.getVenderRequestUrl() + functionCode); connection = url.openConnection(); connection.setConnectTimeout(5000); connection.setReadTimeout(20000); connection.setDoInput(true); connection.setDoOutput(true); if (connection instanceof HttpsURLConnectionImpl) { HttpsURLConnection https = (HttpsURLConnection) connection; https.setHostnameVerifier(new MyVerified()); X509TrustManager xtm = new MyTrustManager(); TrustManager mytm[] = { xtm }; SSLContext ctx = SSLContext.getInstance("SSL"); ctx.init(null, mytm, null); SSLSocketFactory sf = ctx.getSocketFactory(); https.setSSLSocketFactory(sf); } connection.connect(); writer = new BufferedWriter(new OutputStreamWriter(connection .getOutputStream(), "UTF-8")); String writeString = CoreHttpUtils.getQueryString(requestMap); writer.write(writeString); writer.flush(); writer.close(); Map<String, List<String>> headers = connection.getHeaderFields(); if (headers.size() > 0) { String response = headers.get(null).toString(); if (response.indexOf("200 OK") < 0) { throw new Exception("读取地址:" + url + " 错误:" + response); } } reader = new BufferedReader(new InputStreamReader(connection .getInputStream(), "UTF-8")); StringBuffer sb = new StringBuffer(); String temp = null; while ((temp = reader.readLine()) != null) { sb.append(temp); } String responseStr = sb.toString(); String[] responseStrArray = responseStr.split("[" + GROUP + "]"); String merchantId = responseStrArray[0]; String errorCode = responseStrArray[1]; String mac = responseStrArray[2]; String busiData = responseStrArray[3]; String verifyMac = CoreStringUtils.md5(busiData + config.getVenderSignKey(), CharsetConstant.CHARSET_GBK); // 验证成功 if (verifyMac.equals(mac)) { if("0000".equals(errorCode)){ SAXBuilder builder = new SAXBuilder(); Document doc = null; Reader in = new StringReader(busiData); doc = builder.build(in); Element root = doc.getRootElement(); return root; }else{ logger.error("merchantId={}, errorCode={}, key={}, requestData={}, responseData={}", new Object[]{merchantId, errorCode, config.getVenderSignKey(),writeString, busiData}); } } else { logger.error("本地计算的校验码={}", verifyMac); logger.error("merchantId={}, errorCode={}, key={}, requestData={}, responseData={}", new Object[]{merchantId, errorCode, config.getVenderSignKey(), writeString, busiData}); logger.error("服务器返回的校验码={}", mac); } return null; } catch (SocketTimeoutException e) { // 抛出超时导致的异常 logger.error("网络连接超时", e); throw e; } catch (Exception e) { //判断是否为502或504异常,如果为此类异常不做处理,直接抛出异常 if (e.getMessage().indexOf(ApiConstant.HTTP_ERROR_CODE_502) != -1){ logger.error("网络连接异常,网关或代理服务器时收到了无效响应", e); throw e; }else if (e.getMessage().indexOf(ApiConstant.HTTP_ERROR_CODE_504) != -1){ logger.error("网络连接网关超时", e); throw e; }else { logger.error("向广东博众发送请求出错", e); return null; } } }