微信https请求工具类
工作中用到的微信https请求工具类。
package com.gxgrh.wechat.tools; import com.gxgrh.wechat.wechatapi.service.SystemApiService; import org.apache.http.HttpConnection; import org.apache.logging.log4j.LogManager; import org.apache.logging.log4j.Logger; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; import javax.net.ssl.*; import javax.servlet.http.HttpServletRequest; import java.io.*; import java.net.URL; import java.net.URLConnection; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; import java.util.HashMap; import java.util.Map; /**发送https请求的工具类 * Created by Administrator on 2016/9/27. */ @Component public class HttpTool { @Autowired private IoTool ioTool; private static final Logger logger = LogManager.getLogger(HttpTool.class); /** * 忽视证书HostName */ private static HostnameVerifier ignoreHostnameVerifier = new HostnameVerifier() { public boolean verify(String s, SSLSession sslsession) { System.out.println("WARNING: Hostname is not matched for cert."); return true; } }; /** * Ignore Certification */ private static TrustManager ignoreCertificationTrustManger = new X509TrustManager(){ private X509Certificate[] certificates; public void checkClientTrusted(X509Certificate certificates[], String authType) throws CertificateException { if (this.certificates == null) { this.certificates = certificates; } } public void checkServerTrusted(X509Certificate[] ax509certificate, String s) throws CertificateException { if (this.certificates == null) { this.certificates = ax509certificate; } } public X509Certificate[] getAcceptedIssuers() { // TODO Auto-generated method stub return new java.security.cert.X509Certificate[0]; } }; public String sendSSLGetMethod(String urlString) throws Exception{ String repString = null; InputStream is = null; HttpsURLConnection connection = null; try { URL url = new URL(urlString); /* * use ignore host name verifier */ HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); connection = (HttpsURLConnection) url.openConnection(); // Prepare SSL Context TrustManager[] tm = { ignoreCertificationTrustManger }; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象 SSLSocketFactory ssf = sslContext.getSocketFactory(); connection.setSSLSocketFactory(ssf); if(connection.getResponseCode() != 200){ } is = connection.getInputStream(); repString = ioTool.getStringFromInputStream(is); } catch (Exception ex) { logger.error(ex.getMessage()); ex.printStackTrace(); } finally { if(null != is){ is.close(); is = null; } if(null != connection){ connection.disconnect(); } } return repString; } public String sendSSLPostMethod(String urlString,String postData) throws Exception{ String repString = null; InputStream is = null; HttpsURLConnection connection = null; try { URL url = new URL(urlString); /* * use ignore host name verifier */ HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); connection = (HttpsURLConnection) url.openConnection(); connection.setDoInput(true); connection.setDoOutput(true); connection.setRequestMethod("POST"); connection.setRequestProperty("content-type","text/json"); connection.setRequestProperty("content-length",String.valueOf(postData.getBytes().length)); connection.getOutputStream().write(postData.getBytes("utf-8")); connection.getOutputStream().flush(); connection.getOutputStream().close(); // Prepare SSL Context TrustManager[] tm = { ignoreCertificationTrustManger }; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象 SSLSocketFactory ssf = sslContext.getSocketFactory(); connection.setSSLSocketFactory(ssf); if(connection.getResponseCode() != 200){ } is = connection.getInputStream(); repString = ioTool.getStringFromInputStream(is); } catch (Exception ex) { logger.error(ex.getMessage()); ex.printStackTrace(); } finally { if(null != is){ is.close(); is = null; } if(null != connection){ connection.disconnect(); } } return repString; } /** * 上传文件到微信服务器 * @param urlString 上传的目标url * @param filePath 文件路路径 * @Param formDataName 表单id * @return * @throws Exception */ public String sendSSLMutiPartFormData(String urlString,String filePath,String formDataName) throws Exception{ String repString = null; InputStream is = null; OutputStream out = null; HttpsURLConnection connection = null; final String BOUNDARYSTR = ""+System.currentTimeMillis(); final String BOUNDARY = "--"+BOUNDARYSTR+"\r\n"; try{ File file = new File(filePath); if(!file.exists() || !file.isFile()){ String errorMsg = "文件["+filePath+"]不存在。无法上传。"; logger.error(errorMsg); throw new Exception(errorMsg); } URL url = new URL(urlString); HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); connection = (HttpsURLConnection) url.openConnection(); connection.setDoInput(true); connection.setDoOutput(true); connection.setUseCaches(false); connection.setRequestMethod("POST"); // 设置请求头信息 connection.setRequestProperty("Connection", "Keep-Alive"); connection.setRequestProperty("Charset", "UTF-8"); connection.setRequestProperty("Content-type", "multipart/form-data;boundary=" + BOUNDARYSTR); StringBuilder sb = new StringBuilder(); sb.append(BOUNDARY); sb.append("Content-Disposition: form-data;name=\""+formDataName+"\";filename=\"" + file.getName() + "\"\r\n"); sb.append("Content-Type:application/octet-stream\r\n\r\n"); byte[] head = sb.toString().getBytes("utf-8"); // 获得输出流 out = new DataOutputStream(connection.getOutputStream()); // 输出表头 out.write(head); // 文件正文部分 // 把文件已流文件的方式 推入到url中 BufferedInputStream bis = new BufferedInputStream(new FileInputStream(file)); int bytes = 0; byte[] bufferOut = new byte[1024]; while ((bytes = bis.read(bufferOut,0,1024)) != -1) { out.write(bufferOut, 0, bytes); } bis.close(); byte[] foot = ("\r\n--" + BOUNDARYSTR + "--\r\n").getBytes("utf-8");// 定义最后数据分隔线 out.write(foot); out.flush(); TrustManager[] tm = { ignoreCertificationTrustManger }; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象 SSLSocketFactory ssf = sslContext.getSocketFactory(); connection.setSSLSocketFactory(ssf); if(connection.getResponseCode() != 200){ } is = connection.getInputStream(); repString = ioTool.getStringFromInputStream(is); }catch(Exception ex){ logger.error(ex.getMessage()); ex.printStackTrace(); }finally { if(null != is){ is.close(); is = null; } if(null != connection){ connection.disconnect(); } } return repString; } /** * * @param urlString * @return */ public Map<String,Object> sendSSLGetDownloadMedia(String urlString){ String fileName = null; byte[] repData = null; InputStream is = null; Map<String,Object> resultInfo = null; HttpsURLConnection connection = null; try { URL url = new URL(urlString); /* * use ignore host name verifier */ HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); connection = (HttpsURLConnection) url.openConnection(); // Prepare SSL Context TrustManager[] tm = { ignoreCertificationTrustManger }; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象 SSLSocketFactory ssf = sslContext.getSocketFactory(); connection.setSSLSocketFactory(ssf); /**从以下头部数据解析出文件名 * Content-disposition: attachment; filename="MEDIA_ID.jpg" */ String contentDisposition = connection.getHeaderField("Content-disposition"); if(contentDisposition != null){ String[] contentDispositionArray = contentDisposition.split(";"); for(String content:contentDispositionArray){ if(content.contains("filename")){ String[] contentArry = content.split("="); fileName = contentArry[1]; fileName = fileName.replaceAll("\"",""); } } } if(connection.getResponseCode() != 200){ } is = connection.getInputStream(); repData = this.ioTool.getByteArrayFromInputStream(is); resultInfo = new HashMap<String,Object>(); resultInfo.put("fileName",fileName); resultInfo.put("data",repData); } catch (Exception ex) { logger.error(ex.getMessage()); ex.printStackTrace(); } finally { if(null != is){ try{ is.close(); is = null; }catch (Exception e){ e.printStackTrace(); } } if(null != connection){ connection.disconnect(); } } return resultInfo; } /** * * @param urlString * @param postData * @return */ public Map<String,Object> sendSSLPostDownloadMedia(String urlString, String postData){ String fileName = null; byte[] repData = null; InputStream is = null; Map<String,Object> resultInfo = null; HttpsURLConnection connection = null; try{ URL url = new URL(urlString); /* * use ignore host name verifier */ HttpsURLConnection.setDefaultHostnameVerifier(ignoreHostnameVerifier); connection = (HttpsURLConnection) url.openConnection(); connection.setDoInput(true); connection.setDoOutput(true); connection.setRequestMethod("POST"); connection.setRequestProperty("content-type","text/json"); connection.setRequestProperty("content-length",String.valueOf(postData.getBytes().length)); connection.getOutputStream().write(postData.getBytes("utf-8")); connection.getOutputStream().flush(); connection.getOutputStream().close(); // Prepare SSL Context TrustManager[] tm = { ignoreCertificationTrustManger }; SSLContext sslContext = SSLContext.getInstance("SSL", "SunJSSE"); sslContext.init(null, tm, new java.security.SecureRandom()); // 从上述SSLContext对象中得到SSLSocketFactory对象 SSLSocketFactory ssf = sslContext.getSocketFactory(); connection.setSSLSocketFactory(ssf); /**从以下头部数据解析出文件名 * Content-disposition: attachment; filename="MEDIA_ID.jpg" */ String contentDisposition = connection.getHeaderField("Content-disposition"); String[] contentDispositionArray = contentDisposition.split(";"); for(String content:contentDispositionArray){ if(content.contains("filename")){ String[] contentArry = content.split("="); fileName = contentArry[1]; fileName = fileName.replaceAll("\"",""); } } if(connection.getResponseCode() != 200){ } is = connection.getInputStream(); repData = this.ioTool.getByteArrayFromInputStream(is); resultInfo = new HashMap<String,Object>(); resultInfo.put("fileName",fileName); resultInfo.put("data",repData); }catch (Exception ex){ logger.error(ex.getMessage()); ex.printStackTrace(); }finally { if(null != is){ try{ is.close(); is = null; }catch (Exception e){ e.printStackTrace(); } } if(null != connection){ connection.disconnect(); } } return resultInfo; } /** * * @param urlString * @return */ public String sendGetMethod(String urlString){ String repString = null; InputStream is = null; URLConnection connection = null; try { URL url = new URL(urlString); connection = url.openConnection(); connection.setRequestProperty("accept", "*/*"); connection.setRequestProperty("connection", "Keep-Alive"); connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); is = connection.getInputStream(); repString = ioTool.getStringFromInputStream(is); } catch (Exception ex) { logger.error(ex.getMessage()); ex.printStackTrace(); } finally { if(null != is){ try{ is.close(); is = null; }catch (Exception e){ e.printStackTrace(); } } } return repString; } /** * * @param urlString * @param postData * @return */ public String sendPostMethod(String urlString, String postData){ String repString = null; InputStream is = null; URLConnection connection = null; try { URL url = new URL(urlString); connection = url.openConnection(); // 设置通用的请求属性 connection.setRequestProperty("accept", "*/*"); connection.setRequestProperty("connection", "Keep-Alive"); connection.setRequestProperty("user-agent", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1;SV1)"); connection.setDoInput(true); connection.setDoOutput(true); connection.setRequestProperty("content-type","text/json"); connection.getOutputStream().write(postData.getBytes("utf-8")); connection.getOutputStream().flush(); connection.getOutputStream().close(); connection.getOutputStream().close(); is = connection.getInputStream(); repString = ioTool.getStringFromInputStream(is); } catch (Exception ex) { logger.error(ex.getMessage()); ex.printStackTrace(); } finally { if(null != is){ try{ is.close(); is = null; }catch (Exception e){ e.printStackTrace(); } } } return repString; } /** * 判断某个请求是否是异步的 * @param request * @return */ public boolean isAsynchronousRequest(HttpServletRequest request){ //Jquery的ajax请求默认会加上这个头部 String jQueryAjaxHeader = request.getHeader("x-requested-with"); //原生js使用ajax请加上一个头部参数请求头部:XMLHttpRequest.setRequestHeader("RequestType","AJAX"); String customAjaxHeader = request.getHeader("RequestType"); if(( Validate.isString(jQueryAjaxHeader) && jQueryAjaxHeader.equals("XMLHttpRequest")) || (Validate.isString(customAjaxHeader) && customAjaxHeader.equals("AJAX")) ){ return true; } return false; } }
主要难点是微信需要https请求。工具类里另外还封装了post方法上传素材,post方法下载素材,get方法下载素材。
直接拷贝代码会有错误,主要是logger部分的代码和还有IoTool工具类,可以自己修改下。