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;
}
}
}
https 连接
最新推荐文章于 2024-06-12 09:50:27 发布